Compare commits
540 Commits
wsjtx-2.5.
...
master
Author | SHA1 | Date |
---|---|---|
Uwe Risse | 994e3f1c3d | |
Joe Taylor | 3c98c9df41 | |
Joe Taylor | 2e4a6c3c32 | |
Joe Taylor | c296bca73a | |
Joe Taylor | 215208636c | |
Joe Taylor | c60aa83aa5 | |
Brian Moran | 8bd3dd65bb | |
Brian Moran | aa16455320 | |
Uwe Risse | 8e4f293127 | |
Brian Moran | af3e06144c | |
Joe Taylor | a4792074e4 | |
Joe Taylor | 47a89bc2c9 | |
Joe Taylor | fadda93f2f | |
Joe Taylor | 320ddc0338 | |
Uwe Risse | 5759f06d6d | |
Uwe Risse | a5f963233b | |
Joe Taylor | e5bf51abf6 | |
Joe Taylor | e1fde92ea2 | |
Brian Moran | fffc88de69 | |
Brian Moran | f20687f9fb | |
Brian Moran | a1106aff46 | |
Joe Taylor | cd0a0e6db4 | |
Brian Moran | c85ed8cc7d | |
Uwe Risse | 68a534221b | |
Uwe Risse | d81a3d799c | |
Uwe Risse | 31696388b9 | |
Uwe Risse | 9d90ede3de | |
Uwe Risse | dd384d0765 | |
Uwe Risse | 4545195a32 | |
Uwe Risse | 4822b94350 | |
Uwe Risse | 566d01aa23 | |
Uwe Risse | da282209f1 | |
Uwe Risse | f84ba8a0d0 | |
Joe Taylor | 1f575bbe67 | |
Joe Taylor | 8b767b4c75 | |
Uwe Risse | 599cf1b7d6 | |
Uwe Risse | c97c53db89 | |
Joe Taylor | 9adb1c8256 | |
Joe Taylor | bc635f0cd7 | |
Joe Taylor | 3caaf785bd | |
Joe Taylor | 951d17b20c | |
Joe Taylor | 0ef914fb5c | |
Joe Taylor | 345e539074 | |
Uwe Risse | 219c04f5a4 | |
Uwe Risse | e575005291 | |
Uwe Risse | 6744bc5468 | |
Joe Taylor | 121091c14e | |
Joe Taylor | 3beeb06dec | |
Uwe Risse | 6ca7523adf | |
Uwe Risse | f77eb1ddf8 | |
Joe Taylor | bdf33b6ab3 | |
Joe Taylor | b968fe2b76 | |
Joe Taylor | 14bf6d5ec1 | |
Uwe Risse | 43cd871413 | |
Joe Taylor | 014a8e5104 | |
Joe Taylor | 0aeee4cdf8 | |
Joe Taylor | a3d57024d5 | |
Joe Taylor | 9667fd837b | |
Joe Taylor | ba03e471bc | |
Joe Taylor | 372b43df26 | |
Joe Taylor | 0fa2cf2166 | |
Joe Taylor | 95282f062e | |
Joe Taylor | c5fe615a7b | |
Joe Taylor | d6299e8a78 | |
Uwe Risse | d4beab04bf | |
Uwe Risse | fa111e6e87 | |
Joe Taylor | f1497fbabb | |
Joe Taylor | 4664aec597 | |
Joe Taylor | 53bb5268ca | |
Uwe Risse | 8164e27909 | |
Uwe Risse | ce13ca8800 | |
Uwe Risse | 148066135e | |
Uwe Risse | cac0ea44ea | |
Uwe Risse | c7e7062b8a | |
Uwe Risse | a6e6b91cee | |
Uwe Risse | f5291f280e | |
Joe Taylor | bbb280b4f3 | |
Uwe Risse | b9b3d1d6f5 | |
Uwe Risse | eef441ec87 | |
Uwe Risse | 855daf92c4 | |
Uwe Risse | a469b67afb | |
Joe Taylor | b100a11835 | |
Steven Franke | c073fefa74 | |
Steven Franke | 062f3a8037 | |
Uwe Risse | f5ec31d3a1 | |
Uwe Risse | df502242f2 | |
Joe Taylor | 7cdd2da5d5 | |
Joe Taylor | 7d8d0b8b94 | |
Joe Taylor | 581ef8b6e5 | |
Joe Taylor | 87dcde7564 | |
Joe Taylor | 03b680dee5 | |
Joe Taylor | 3b361b6d24 | |
Joe Taylor | d0dd88de40 | |
Steven Franke | 64a124ff20 | |
Steven Franke | 7021477e21 | |
Steven Franke | 4331594e4a | |
Joe Taylor | d1c7efb1aa | |
Joe Taylor | 1da80c0631 | |
Joe Taylor | d45d0b6b8f | |
Joe Taylor | ab72238132 | |
Joe Taylor | cf27347656 | |
Joe Taylor | 400957af0c | |
Joe Taylor | 708342f40a | |
Joe Taylor | afa020558f | |
Joe Taylor | fc4a70cf9c | |
Joe Taylor | 9b8b604a8c | |
Joe Taylor | 36d11fc561 | |
Joe Taylor | 70959a9796 | |
Joe Taylor | 1930271350 | |
Joe Taylor | 6e344fdec8 | |
Joe Taylor | a78f5d06c4 | |
Uwe Risse | cb03c837d0 | |
Uwe Risse | 36e54bf3a0 | |
Uwe Risse | 2d906247d7 | |
Uwe Risse | cf9233b650 | |
Uwe Risse | 55bc403f83 | |
Uwe Risse | dd81db1e95 | |
Uwe Risse | ec1e521ba7 | |
Uwe Risse | 8a6a8e8bdf | |
Uwe Risse | 1068988bf1 | |
Uwe Risse | 74ae5f98de | |
Joe Taylor | 30047ecfeb | |
Joe Taylor | dbeec73e86 | |
Joe Taylor | 3a8991ab80 | |
Joe Taylor | 95f75c8e49 | |
Joe Taylor | 432a501bf6 | |
Joe Taylor | e9f1cbf375 | |
Joe Taylor | a9e29327b7 | |
Joe Taylor | 675a768de1 | |
Joe Taylor | 4fb06dda43 | |
Joe Taylor | 218479f093 | |
Joe Taylor | f32f2393ea | |
Joe Taylor | d399b172a4 | |
Joe Taylor | b219b59296 | |
Joe Taylor | 2d3914eb2d | |
Joe Taylor | c909eb0845 | |
Joe Taylor | 91a39dd0a1 | |
k9an | 6414a8624b | |
Joe Taylor | b317ea241b | |
Joe Taylor | f43c1e97ae | |
Joe Taylor | 3c3c450839 | |
Joe Taylor | 02961a2ccc | |
Joe Taylor | c5b6a6ae45 | |
Joe Taylor | 1cee98162a | |
Joe Taylor | 4957face2f | |
Joe Taylor | 190dca5501 | |
Joe Taylor | be2ce2a6c4 | |
Joe Taylor | ffe8927a30 | |
Joe Taylor | f3ee013e43 | |
Joe Taylor | f47596b2eb | |
Joe Taylor | d6208b43e2 | |
Joe Taylor | ae217cb2d9 | |
Joe Taylor | aa9cc8e885 | |
Uwe Risse | edd7fadd5a | |
Joe Taylor | aceac2ccb5 | |
Joe Taylor | 07ab7de018 | |
Joe Taylor | 653ea56a77 | |
Joe Taylor | 6ca1b14477 | |
Joe Taylor | 304a04328a | |
Joe Taylor | db33624da1 | |
Joe Taylor | f6c608b227 | |
Joe Taylor | ab48d77d0f | |
Joe Taylor | fd7caa8cd6 | |
Joe Taylor | bc92cd54f3 | |
Joe Taylor | f3e838cdc6 | |
Joe Taylor | e366b0a6af | |
Joe Taylor | 48312bc620 | |
Joe Taylor | 6e193ab0e1 | |
Joe Taylor | 2c0d05e05d | |
Joe Taylor | 5668e74f61 | |
Joe Taylor | f3bac687ba | |
Joe Taylor | 15e33d22af | |
Joe Taylor | ceb13110c5 | |
Joe Taylor | e732c5ba62 | |
Joe Taylor | 38e65b747a | |
Joe Taylor | 689b040cc5 | |
Joe Taylor | 9761c10648 | |
Joe Taylor | 04836a447d | |
Joe Taylor | 38174ed6dc | |
Joe Taylor | d96a1a1173 | |
Joe Taylor | c8574b5890 | |
Joe Taylor | 66d1497558 | |
Joe Taylor | 22b86544be | |
Joe Taylor | b12b1dec39 | |
Joe Taylor | e529ad8df9 | |
Joe Taylor | 114aeda3f8 | |
Joe Taylor | e8c08c24a5 | |
Joe Taylor | f180d30126 | |
Joe Taylor | 4e96e58d57 | |
Joe Taylor | f26b1c424f | |
Joe Taylor | 658f23b813 | |
Joe Taylor | bc9e8f89bc | |
Joe Taylor | d6bcf9767a | |
Joe Taylor | df445297d2 | |
Steven Franke | 283d7d32e4 | |
Uwe Risse | 0b951a05e7 | |
Uwe Risse | e081c15716 | |
Uwe Risse | 4e7d282980 | |
Joe Taylor | c952bee07e | |
Joe Taylor | 1af4e46793 | |
Joe Taylor | ce5ecaf99d | |
Joe Taylor | 7d66232ec7 | |
Joe Taylor | 5e9645091d | |
Joe Taylor | 16d97aad3b | |
Steven Franke | 561240763c | |
Joe Taylor | c5bc704342 | |
Steven Franke | 33d3955086 | |
Joe Taylor | 5471cb3534 | |
Joe Taylor | 8e6f027c5e | |
Joe Taylor | 5e1795ff5c | |
Joe Taylor | 5dc70b18db | |
Uwe Risse | 2545103ba5 | |
Uwe Risse | 2e3cec2201 | |
Joe Taylor | cab1bb8aed | |
Uwe Risse | 22b580af56 | |
Joe Taylor | 5b97226b33 | |
Joe Taylor | 7a6f0344da | |
Joe Taylor | d023c80109 | |
Joe Taylor | 56414dda30 | |
Steven Franke | a9f895ca6b | |
Steven Franke | 78cd7824ae | |
Steven Franke | 1ca81f4610 | |
Joe Taylor | d3020efdef | |
Joe Taylor | 540d16302e | |
Uwe Risse | 5118e64fde | |
Joe Taylor | fd6ebff4d9 | |
Joe Taylor | 76a1dd3c44 | |
Joe Taylor | 9c58135868 | |
Joe Taylor | 0c98c2d2ff | |
Joe Taylor | 81b4659de9 | |
Joe Taylor | b10aa136d4 | |
Uwe Risse | 1ff74b2cd5 | |
Uwe Risse | 0309b4f826 | |
Uwe Risse | 35df81a858 | |
Uwe Risse | 8545cdb96d | |
Uwe Risse | fde103da2d | |
Uwe Risse | 194ad5c7b4 | |
Uwe Risse | 5c09e55351 | |
Uwe Risse | 5c1b7a8d8f | |
Uwe Risse | c84aac0c62 | |
Joe Taylor | 12cbf366fe | |
Joe Taylor | a3fa2cef88 | |
Uwe Risse | 4b6886cdd0 | |
Joe Taylor | 7081f9cf9b | |
Uwe Risse | 151f0f0ab3 | |
Uwe Risse | 47b5cc21f2 | |
Uwe Risse | ea3a6b272a | |
Uwe Risse | f7dd8a86a8 | |
Uwe Risse | de2ba14ca0 | |
Joe Taylor | 6266b8d80e | |
Joe Taylor | c26aa9160b | |
Joe Taylor | fc40770960 | |
Uwe Risse | 3a765e3b12 | |
Uwe Risse | 947ab4eb25 | |
Uwe Risse | fb4eb56508 | |
Uwe Risse | 11b23ae9cd | |
Uwe Risse | 39fecf92c9 | |
Joe Taylor | 9d7f323231 | |
Uwe Risse | d992c9bbaf | |
Uwe Risse | 39b63f4190 | |
Uwe Risse | 9ffa81e59a | |
Uwe Risse | 96974e0537 | |
Uwe Risse | b68e90ae88 | |
Uwe Risse | ab89d70b6a | |
Uwe Risse | 3e49dfacc5 | |
Joe Taylor | 5797e51fe3 | |
Joe Taylor | d774733636 | |
Joe Taylor | 500e565d77 | |
Joe Taylor | 99861082f2 | |
Joe Taylor | a3dedc81de | |
Joe Taylor | 6b2df37137 | |
Joe Taylor | 98b3cd9a05 | |
Steven Franke | 1a794c7ce9 | |
Joe Taylor | 82d9ae9629 | |
Uwe Risse | d28164e92a | |
Uwe Risse | e2f601a01c | |
Uwe Risse | 204672375b | |
Uwe Risse | 7e8a405dc6 | |
Joe Taylor | b68c544ef7 | |
Joe Taylor | d99c6adf4d | |
Joe Taylor | 69f9ec89d4 | |
Joe Taylor | 48baf47a88 | |
Joe Taylor | 53b280ea53 | |
Joe Taylor | a12a72836a | |
Joe Taylor | f66858a813 | |
Joe Taylor | a91dbe87be | |
Joe Taylor | 77704621aa | |
Joe Taylor | e1928f3206 | |
Joe Taylor | adcc8c4bd7 | |
Joe Taylor | 43c0752140 | |
Bill Somerville | 3e43e57858 | |
Joe Taylor | 6020552473 | |
Joe Taylor | c13407612e | |
Bill Somerville | e93cd45d19 | |
Bill Somerville | d541286ba2 | |
Bill Somerville | f68a4bb1a1 | |
Joe Taylor | 21f8303511 | |
Bill Somerville | 669b3d972e | |
Joe Taylor | 9aa4786f11 | |
Joe Taylor | 4a68d3c4cf | |
Joe Taylor | 393265a0e0 | |
Bill Somerville | 68dc11b291 | |
Bill Somerville | 05f69c99b2 | |
Bill Somerville | 1f2346e969 | |
Joe Taylor | 5b406effcf | |
Joe Taylor | 77c532b1a3 | |
Joe Taylor | 8097f25c9c | |
Joe Taylor | 7e078c805f | |
Joe Taylor | bcd42a7677 | |
Joe Taylor | 32a3a75bb5 | |
Joe Taylor | 4b6ad3857a | |
Joe Taylor | 56ca761ac9 | |
Joe Taylor | 994e00c5d2 | |
Bill Somerville | 1205acb7e0 | |
Bill Somerville | 488c42b8a2 | |
Joe Taylor | 93ade73af7 | |
Joe Taylor | c30b91cb69 | |
Joe Taylor | f13e318204 | |
Joe Taylor | 48b1ad1e46 | |
Joe Taylor | 2b25c51169 | |
Joe Taylor | 5a0cb0f0a0 | |
Bill Somerville | c0a5bad58a | |
Bill Somerville | 9d31ec843e | |
Bill Somerville | 1bb4dffb77 | |
Joe Taylor | f51a7d4f7d | |
Joe Taylor | 901e9dbc38 | |
Bill Somerville | 5806daadc5 | |
Joe Taylor | 384899754f | |
Joe Taylor | 0ed62e4f80 | |
Bill Somerville | 7483f96759 | |
Joe Taylor | 81fcd574cf | |
Joe Taylor | a5be2fb4ef | |
Joe Taylor | 20ef6a529a | |
Joe Taylor | 8f2dc74b52 | |
Bill Somerville | 677971ae38 | |
Bill Somerville | e9e1688ad8 | |
Joe Taylor | c56926595a | |
Joe Taylor | 00b39c8c37 | |
Joe Taylor | 7c90f53128 | |
Bill Somerville | 356bc10d84 | |
Bill Somerville | 175092f536 | |
Bill Somerville | a7e662f227 | |
Bill Somerville | d9bdac6bd1 | |
Bill Somerville | ffe11cbb81 | |
Joe Taylor | 385f0e7b62 | |
Bill Somerville | a969f304ab | |
Bill Somerville | f30d2c3085 | |
Bill Somerville | 6f29b60f09 | |
Joe Taylor | ec949b33ba | |
Bill Somerville | 00406acf38 | |
Bill Somerville | 7b9f3e491d | |
Joe Taylor | 9b765dd79f | |
Joe Taylor | 8b157a757e | |
Bill Somerville | 634943b6cf | |
Bill Somerville | 7c93215c50 | |
Joe Taylor | 3de683c03b | |
Joe Taylor | a33887ea4a | |
Bill Somerville | 61ceb3f616 | |
Bill Somerville | b9836fce9c | |
Bill Somerville | f7996de670 | |
Bill Somerville | d732537b59 | |
Bill Somerville | d083346597 | |
Bill Somerville | 12c15e584b | |
Bill Somerville | a99e0a79eb | |
Bill Somerville | 8cb125ccd8 | |
Bill Somerville | f37c39df48 | |
Bill Somerville | c7e2c4c9f5 | |
Bill Somerville | 07b9753726 | |
Bill Somerville | 30e11106c8 | |
Joe Taylor | 05a11abbb2 | |
Bill Somerville | 7695b7d331 | |
Bill Somerville | 595ef8e9db | |
Joe Taylor | 83c1a85226 | |
Joe Taylor | 2fb5d22e6f | |
Joe Taylor | 12efb098bb | |
Joe Taylor | ef438919e4 | |
Joe Taylor | 089e0b9ebe | |
Joe Taylor | 226c59982b | |
Joe Taylor | 6c3fa97185 | |
Bill Somerville | ece6ebae80 | |
Bill Somerville | 34753ca613 | |
Bill Somerville | e92ec7bf9f | |
Bill Somerville | 1e2ceea199 | |
Bill Somerville | b1c272d7b6 | |
Joe Taylor | 34a6af679a | |
Alex Lelievre | bd8992f6f2 | |
Bill Somerville | 00eb4d59ca | |
Bill Somerville | f95b59b1cd | |
Bill Somerville | c829bcfe27 | |
Bill Somerville | 76620d3e32 | |
Bill Somerville | 4cd6665ea3 | |
Bill Somerville | 59fbb6181b | |
Bill Somerville | 060739aa15 | |
Bill Somerville | 917acbb97f | |
Joe Taylor | f884f77321 | |
Joe Taylor | dbb9eca66e | |
Bill Somerville | c764a5305e | |
Bill Somerville | d41c0bc432 | |
Joe Taylor | df9f7cc500 | |
Joe Taylor | 6b9cdd0071 | |
Bill Somerville | 2f24d0b47c | |
Bill Somerville | 71ac45ab6e | |
Bill Somerville | 7c655c07cd | |
Bill Somerville | 575af62f24 | |
Bill Somerville | f22d501607 | |
Bill Somerville | b3708f43e7 | |
Bill Somerville | a926476402 | |
Bill Somerville | 201c646bc5 | |
Bill Somerville | b5a55fe615 | |
Bill Somerville | a886cee8b9 | |
Joe Taylor | 419ccc8dab | |
Bill Somerville | 8794bad146 | |
Bill Somerville | 5bf8ba4f55 | |
Bill Somerville | 87d4ee6fa1 | |
Steven Franke | c40225aa1e | |
Bill Somerville | 84ebec424a | |
Steven Franke | 8cbf31ebdf | |
Bill Somerville | 82e3949b8b | |
Joe Taylor | d3b079c425 | |
Bill Somerville | d13a5d04e8 | |
Bill Somerville | 4030b0bd0c | |
Bill Somerville | 7506fefe80 | |
Bill Somerville | 0cdde4ea6d | |
Joe Taylor | f11b38fb28 | |
Joe Taylor | 2af2d8131d | |
Joe Taylor | 990933024c | |
Joe Taylor | 11d874ec37 | |
Bill Somerville | 5d78cb0c97 | |
Bill Somerville | 119fe4dd4b | |
Joe Taylor | 67c01de4bd | |
Bill Somerville | aa3e083b64 | |
Bill Somerville | b04ad2fa20 | |
Joe Taylor | ff5ce6ac0b | |
Joe Taylor | 3523d12940 | |
Joe Taylor | 2b42df4809 | |
Bill Somerville | 5446d86ff3 | |
Bill Somerville | 293f77d45d | |
Joe Taylor | 4ee17f9b88 | |
Joe Taylor | 2304f5dce3 | |
Bill Somerville | aa1225ff96 | |
Joe Taylor | 25cb82b14d | |
Joe Taylor | 8946a2c5b3 | |
k9an | ec2afd3fd2 | |
k9an | 64eed79027 | |
Joe Taylor | e4144b7e19 | |
Joe Taylor | 4b4e78cd9d | |
k9an | 777126ae1e | |
Steven Franke | 116f756b1a | |
Steven Franke | 771f424108 | |
Steven Franke | 57d9096d21 | |
Steven Franke | 94861e04e5 | |
Bill Somerville | 3a463c3cd8 | |
Joe Taylor | 1c99c2b005 | |
Steven Franke | 371e9e2365 | |
Steven Franke | 6a2c8d487e | |
Steven Franke | d8235a43a6 | |
Steven Franke | 06fee9c52a | |
Steven Franke | 01990baa58 | |
Joe Taylor | 05503dd689 | |
Steven Franke | afcfb08072 | |
Joe Taylor | e04c37d0c0 | |
Joe Taylor | 848f3ab30f | |
Joe Taylor | c747e98bda | |
Joe Taylor | 1ce78c184a | |
Joe Taylor | 27def802a0 | |
Joe Taylor | 710240c57a | |
Joe Taylor | 7881b9c79a | |
Joe Taylor | f21ccca0bf | |
Joe Taylor | 30286b2261 | |
Joe Taylor | 8e64184183 | |
Joe Taylor | f74ad900ab | |
Joe Taylor | 3d04c767ca | |
Joe Taylor | b25ef318a4 | |
Joe Taylor | ea48ae04fb | |
Joe Taylor | 255d35c56e | |
Joe Taylor | 2fe6cb617b | |
Joe Taylor | 2ac5518057 | |
Joe Taylor | 05ff35a1f8 | |
Joe Taylor | 82de949a8c | |
Joe Taylor | 3a28992c7f | |
Joe Taylor | 775a204a68 | |
Bill Somerville | 0491dca741 | |
Joe Taylor | 139478b865 | |
Joe Taylor | 8c62f0280d | |
Joe Taylor | 1257b87118 | |
Joe Taylor | d3861ae281 | |
Joe Taylor | 66b5fd0a2f | |
Joe Taylor | 8ea7669494 | |
Joe Taylor | 66e57b5405 | |
Joe Taylor | 924876e92c | |
Joe Taylor | 60b0c5b984 | |
Joe Taylor | d34ba9010b | |
Joe Taylor | f510f16509 | |
Joe Taylor | d53b5cbd33 | |
Joe Taylor | 6641f2c7bf | |
Joe Taylor | 1a4bd199b6 | |
Joe Taylor | 69d375e1d2 | |
Joe Taylor | 1d3025329b | |
Joe Taylor | 7bac215fb0 | |
Joe Taylor | 2e301b59e6 | |
Bill Somerville | 91a840df6e | |
Joe Taylor | c5ecd9fc76 | |
Joe Taylor | 1e4e2a714d | |
Joe Taylor | 1af473e9a5 | |
Joe Taylor | 2d2951e689 | |
Joe Taylor | feb267e7cf | |
Joe Taylor | b0b3ba438b | |
Joe Taylor | dd149231e8 | |
Joe Taylor | 35d8e6deb3 | |
Joe Taylor | 72e6cbd4e9 | |
Joe Taylor | 3307cb2f9e | |
Bill Somerville | 7eac855608 | |
Bill Somerville | 522f698c63 | |
Bill Somerville | f067d94723 | |
Bill Somerville | a141b5af34 | |
Joe Taylor | bada2dd822 | |
Joe Taylor | 84e07c346a | |
Bill Somerville | df3da69d2b | |
Bill Somerville | 808b5f556d | |
Joe Taylor | 3b0ba1ed42 | |
Joe Taylor | 85da2bbb18 | |
Joe Taylor | 83ddcd9b8e | |
Bill Somerville | fd326893be | |
Bill Somerville | e660476a31 | |
Joe Taylor | 99a132a838 | |
Joe Taylor | bc2979d3de | |
Bill Somerville | 44b99783d1 | |
Joe Taylor | 1642458358 | |
Joe Taylor | 4b0f116219 | |
Joe Taylor | 872f767593 | |
Joe Taylor | 203c8c25dd | |
Bill Somerville | 243d7d5835 | |
Joe Taylor | 525c791a16 | |
Joe Taylor | e0c06168cf | |
Joe Taylor | 772e8d1947 | |
Joe Taylor | 8ab721bde3 | |
Joe Taylor | 6310fcf619 | |
Joe Taylor | f543cc21e7 | |
Joe Taylor | 915571827c | |
Bill Somerville | 146fa7b9c2 |
|
@ -26,7 +26,7 @@ if (WIN32)
|
||||||
add_custom_command (
|
add_custom_command (
|
||||||
OUTPUT ${outfile}.h ${outfile}.cpp
|
OUTPUT ${outfile}.h ${outfile}.cpp
|
||||||
COMMAND ${DUMPCPP_Executable}
|
COMMAND ${DUMPCPP_Executable}
|
||||||
ARGS ${AX_SERVER_options} -o "${outfile}" "${infile}"
|
ARGS ${ax_server_options} -o "${outfile}" "${infile}"
|
||||||
MAIN_DEPENDENCY ${infile} VERBATIM)
|
MAIN_DEPENDENCY ${infile} VERBATIM)
|
||||||
list (APPEND ${outfiles} ${outfile}.cpp)
|
list (APPEND ${outfiles} ${outfile}.cpp)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
|
@ -45,7 +45,7 @@ if (POLICY CMP0075)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
project (wsjtx
|
project (wsjtx
|
||||||
VERSION 2.5.0.0
|
VERSION 2.6.0.0
|
||||||
LANGUAGES C CXX Fortran
|
LANGUAGES C CXX Fortran
|
||||||
)
|
)
|
||||||
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
|
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
|
||||||
|
@ -126,7 +126,8 @@ option (WSJT_GENERATE_DOCS "Generate documentation files." ON)
|
||||||
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
|
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
|
||||||
option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.")
|
option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.")
|
||||||
option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON)
|
option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON)
|
||||||
|
CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in Release configuration." OFF
|
||||||
|
"NOT is_debug_build" OFF)
|
||||||
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
|
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
|
||||||
is_debug_build OFF)
|
is_debug_build OFF)
|
||||||
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
|
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
|
||||||
|
@ -273,6 +274,7 @@ set (wsjtx_CXXSRCS
|
||||||
widgets/about.cpp
|
widgets/about.cpp
|
||||||
widgets/astro.cpp
|
widgets/astro.cpp
|
||||||
widgets/messageaveraging.cpp
|
widgets/messageaveraging.cpp
|
||||||
|
widgets/activeStations.cpp
|
||||||
widgets/colorhighlighting.cpp
|
widgets/colorhighlighting.cpp
|
||||||
WSPR/WsprTxScheduler.cpp
|
WSPR/WsprTxScheduler.cpp
|
||||||
widgets/mainwindow.cpp
|
widgets/mainwindow.cpp
|
||||||
|
@ -336,6 +338,7 @@ set (wsjt_FSRCS
|
||||||
lib/timer_module.f90
|
lib/timer_module.f90
|
||||||
lib/wavhdr.f90
|
lib/wavhdr.f90
|
||||||
lib/qra/q65/q65_encoding_modules.f90
|
lib/qra/q65/q65_encoding_modules.f90
|
||||||
|
lib/ft8/ft8_a7.f90
|
||||||
|
|
||||||
# remaining non-module sources
|
# remaining non-module sources
|
||||||
lib/addit.f90
|
lib/addit.f90
|
||||||
|
@ -382,6 +385,7 @@ set (wsjt_FSRCS
|
||||||
lib/demod64a.f90
|
lib/demod64a.f90
|
||||||
lib/determ.f90
|
lib/determ.f90
|
||||||
lib/downsam9.f90
|
lib/downsam9.f90
|
||||||
|
lib/echo_snr.f90
|
||||||
lib/encode232.f90
|
lib/encode232.f90
|
||||||
lib/encode4.f90
|
lib/encode4.f90
|
||||||
lib/encode_msk40.f90
|
lib/encode_msk40.f90
|
||||||
|
@ -460,7 +464,6 @@ set (wsjt_FSRCS
|
||||||
lib/inter_wspr.f90
|
lib/inter_wspr.f90
|
||||||
lib/jplsubs.f
|
lib/jplsubs.f
|
||||||
lib/jt9fano.f90
|
lib/jt9fano.f90
|
||||||
lib/jtmsg.f90
|
|
||||||
lib/libration.f90
|
lib/libration.f90
|
||||||
lib/lorentzian.f90
|
lib/lorentzian.f90
|
||||||
lib/fst4/lorentzian_fading.f90
|
lib/fst4/lorentzian_fading.f90
|
||||||
|
@ -505,6 +508,7 @@ set (wsjt_FSRCS
|
||||||
lib/qra/q65/q65_set_list.f90
|
lib/qra/q65/q65_set_list.f90
|
||||||
lib/refspectrum.f90
|
lib/refspectrum.f90
|
||||||
lib/savec2.f90
|
lib/savec2.f90
|
||||||
|
lib/save_dxbase.f90
|
||||||
lib/sec0.f90
|
lib/sec0.f90
|
||||||
lib/sec_midn.f90
|
lib/sec_midn.f90
|
||||||
lib/setup65.f90
|
lib/setup65.f90
|
||||||
|
@ -539,6 +543,7 @@ set (wsjt_FSRCS
|
||||||
lib/sync9.f90
|
lib/sync9.f90
|
||||||
lib/sync9f.f90
|
lib/sync9f.f90
|
||||||
lib/sync9w.f90
|
lib/sync9w.f90
|
||||||
|
lib/test_snr.f90
|
||||||
lib/timf2.f90
|
lib/timf2.f90
|
||||||
lib/tweak1.f90
|
lib/tweak1.f90
|
||||||
lib/twkfreq.f90
|
lib/twkfreq.f90
|
||||||
|
@ -649,6 +654,7 @@ set (wsjtx_UISRCS
|
||||||
widgets/echograph.ui
|
widgets/echograph.ui
|
||||||
widgets/fastgraph.ui
|
widgets/fastgraph.ui
|
||||||
widgets/messageaveraging.ui
|
widgets/messageaveraging.ui
|
||||||
|
widgets/activeStations.ui
|
||||||
widgets/widegraph.ui
|
widgets/widegraph.ui
|
||||||
widgets/logqso.ui
|
widgets/logqso.ui
|
||||||
Configuration.ui
|
Configuration.ui
|
||||||
|
@ -884,8 +890,6 @@ find_program (RIGCTLCOM_EXE rigctlcom)
|
||||||
check_type_size (CACHE_ALL HAMLIB_OLD_CACHING)
|
check_type_size (CACHE_ALL HAMLIB_OLD_CACHING)
|
||||||
check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING)
|
check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING)
|
||||||
|
|
||||||
find_package (Portaudio REQUIRED)
|
|
||||||
|
|
||||||
find_package (Usb REQUIRED)
|
find_package (Usb REQUIRED)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1095,7 +1099,7 @@ target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES})
|
||||||
if (${OPENMP_FOUND} OR APPLE)
|
if (${OPENMP_FOUND} OR APPLE)
|
||||||
add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS})
|
add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS})
|
||||||
target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES})
|
target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES})
|
||||||
if (OpenMP_C_FLAGS)
|
if (OpenMP_C_FLAGS AND NOT APPLE)
|
||||||
set_target_properties (wsjt_fort_omp
|
set_target_properties (wsjt_fort_omp
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
||||||
|
@ -1128,6 +1132,9 @@ target_link_libraries (jt65sim wsjt_fort wsjt_cxx)
|
||||||
add_executable (sumsim lib/sumsim.f90)
|
add_executable (sumsim lib/sumsim.f90)
|
||||||
target_link_libraries (sumsim wsjt_fort wsjt_cxx)
|
target_link_libraries (sumsim wsjt_fort wsjt_cxx)
|
||||||
|
|
||||||
|
add_executable (test_snr lib/test_snr.f90)
|
||||||
|
target_link_libraries (test_snr wsjt_fort)
|
||||||
|
|
||||||
add_executable (q65sim lib/qra/q65/q65sim.f90)
|
add_executable (q65sim lib/qra/q65/q65sim.f90)
|
||||||
target_link_libraries (q65sim wsjt_fort wsjt_cxx)
|
target_link_libraries (q65sim wsjt_fort wsjt_cxx)
|
||||||
|
|
||||||
|
@ -1260,9 +1267,11 @@ set (LANGUAGES
|
||||||
ja # Japanese
|
ja # Japanese
|
||||||
#no # Norwegian
|
#no # Norwegian
|
||||||
#pt # Portuguese
|
#pt # Portuguese
|
||||||
|
ru # Russian
|
||||||
#sv # Swedish
|
#sv # Swedish
|
||||||
zh # Chinese
|
zh # Chinese
|
||||||
zh_HK # Chinese per Hong Kong
|
zh_HK # Chinese per Hong Kong
|
||||||
|
zh_TW # Chinese traditional
|
||||||
it # Italian
|
it # Italian
|
||||||
)
|
)
|
||||||
foreach (lang_ ${LANGUAGES})
|
foreach (lang_ ${LANGUAGES})
|
||||||
|
@ -1405,6 +1414,7 @@ endif (${OPENMP_FOUND} OR APPLE)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# build map65
|
# build map65
|
||||||
|
find_package (Portaudio REQUIRED)
|
||||||
add_subdirectory (map65)
|
add_subdirectory (map65)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
@ -1441,7 +1451,7 @@ set_target_properties (wsjtx PROPERTIES
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
|
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
|
||||||
if (APPLE)
|
if ((NOT ${OPENMP_FOUND}) OR APPLE)
|
||||||
target_link_libraries (wsjtx wsjt_fort)
|
target_link_libraries (wsjtx wsjt_fort)
|
||||||
else ()
|
else ()
|
||||||
target_link_libraries (wsjtx wsjt_fort_omp)
|
target_link_libraries (wsjtx wsjt_fort_omp)
|
||||||
|
|
|
@ -208,7 +208,7 @@ namespace
|
||||||
int const combo_box_item_disabled (0);
|
int const combo_box_item_disabled (0);
|
||||||
|
|
||||||
// QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
|
// QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
|
||||||
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>]*"};
|
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
|
||||||
QRegularExpression RTTY_roundup_exchange_re {
|
QRegularExpression RTTY_roundup_exchange_re {
|
||||||
R"(
|
R"(
|
||||||
(
|
(
|
||||||
|
@ -593,6 +593,7 @@ private:
|
||||||
bool highlight_by_mode_;
|
bool highlight_by_mode_;
|
||||||
bool highlight_only_fields_;
|
bool highlight_only_fields_;
|
||||||
bool include_WAE_entities_;
|
bool include_WAE_entities_;
|
||||||
|
bool highlight_73_;
|
||||||
int LotW_days_since_upload_;
|
int LotW_days_since_upload_;
|
||||||
|
|
||||||
TransceiverFactory::ParameterPack rig_params_;
|
TransceiverFactory::ParameterPack rig_params_;
|
||||||
|
@ -645,6 +646,7 @@ private:
|
||||||
bool TX_messages_;
|
bool TX_messages_;
|
||||||
bool enable_VHF_features_;
|
bool enable_VHF_features_;
|
||||||
bool decode_at_52s_;
|
bool decode_at_52s_;
|
||||||
|
bool Tune_watchdog_disabled_;
|
||||||
bool single_decode_;
|
bool single_decode_;
|
||||||
bool twoPass_;
|
bool twoPass_;
|
||||||
bool bSpecialOp_;
|
bool bSpecialOp_;
|
||||||
|
@ -670,6 +672,8 @@ private:
|
||||||
bool bLowSidelobes_;
|
bool bLowSidelobes_;
|
||||||
bool pwrBandTxMemory_;
|
bool pwrBandTxMemory_;
|
||||||
bool pwrBandTuneMemory_;
|
bool pwrBandTuneMemory_;
|
||||||
|
bool highlight_DXcall_;
|
||||||
|
bool highlight_DXgrid_;
|
||||||
|
|
||||||
QAudioDeviceInfo audio_input_device_;
|
QAudioDeviceInfo audio_input_device_;
|
||||||
QAudioDeviceInfo next_audio_input_device_;
|
QAudioDeviceInfo next_audio_input_device_;
|
||||||
|
@ -750,6 +754,7 @@ int Configuration::watchdog () const {return m_->watchdog_;}
|
||||||
bool Configuration::TX_messages () const {return m_->TX_messages_;}
|
bool Configuration::TX_messages () const {return m_->TX_messages_;}
|
||||||
bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;}
|
bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;}
|
||||||
bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;}
|
bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;}
|
||||||
|
bool Configuration::Tune_watchdog_disabled () const {return m_->Tune_watchdog_disabled_;}
|
||||||
bool Configuration::single_decode () const {return m_->single_decode_;}
|
bool Configuration::single_decode () const {return m_->single_decode_;}
|
||||||
bool Configuration::twoPass() const {return m_->twoPass_;}
|
bool Configuration::twoPass() const {return m_->twoPass_;}
|
||||||
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
|
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
|
||||||
|
@ -787,6 +792,9 @@ DecodeHighlightingModel const& Configuration::decode_highlighting () const {retu
|
||||||
bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;}
|
bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;}
|
||||||
bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;}
|
bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;}
|
||||||
bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;}
|
bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;}
|
||||||
|
bool Configuration::highlight_73 () const {return m_->highlight_73_;}
|
||||||
|
bool Configuration::highlight_DXcall () const {return m_->highlight_DXcall_;}
|
||||||
|
bool Configuration::highlight_DXgrid () const {return m_->highlight_DXgrid_;}
|
||||||
|
|
||||||
void Configuration::set_calibration (CalibrationParams params)
|
void Configuration::set_calibration (CalibrationParams params)
|
||||||
{
|
{
|
||||||
|
@ -893,7 +901,7 @@ QString Configuration::Field_Day_Exchange() const
|
||||||
{
|
{
|
||||||
return m_->FD_exchange_;
|
return m_->FD_exchange_;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
void Configuration::setEU_VHF_Contest()
|
void Configuration::setEU_VHF_Contest()
|
||||||
{
|
{
|
||||||
m_->bSpecialOp_=true;
|
m_->bSpecialOp_=true;
|
||||||
|
@ -902,6 +910,7 @@ void Configuration::setEU_VHF_Contest()
|
||||||
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::EU_VHF);
|
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::EU_VHF);
|
||||||
m_->write_settings();
|
m_->write_settings();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
QString Configuration::RTTY_Exchange() const
|
QString Configuration::RTTY_Exchange() const
|
||||||
{
|
{
|
||||||
|
@ -920,6 +929,30 @@ void Configuration::set_location (QString const& grid_descriptor)
|
||||||
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Configuration::setSpecial_Hound()
|
||||||
|
{
|
||||||
|
m_->bSpecialOp_=true;
|
||||||
|
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
|
||||||
|
m_->ui_->rbHound->setChecked(true);
|
||||||
|
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::HOUND);
|
||||||
|
m_->write_settings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Configuration::setSpecial_Fox()
|
||||||
|
{
|
||||||
|
m_->bSpecialOp_=true;
|
||||||
|
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
|
||||||
|
m_->ui_->rbFox->setChecked(true);
|
||||||
|
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::FOX);
|
||||||
|
m_->write_settings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Configuration::setSpecial_None()
|
||||||
|
{
|
||||||
|
m_->bSpecialOp_=false;
|
||||||
|
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
|
||||||
|
m_->write_settings();
|
||||||
|
}
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
#if defined (Q_OS_MAC)
|
#if defined (Q_OS_MAC)
|
||||||
|
@ -984,6 +1017,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
||||||
, highlight_by_mode_ {false}
|
, highlight_by_mode_ {false}
|
||||||
, highlight_only_fields_ {false}
|
, highlight_only_fields_ {false}
|
||||||
, include_WAE_entities_ {false}
|
, include_WAE_entities_ {false}
|
||||||
|
, highlight_73_ {false}
|
||||||
, LotW_days_since_upload_ {0}
|
, LotW_days_since_upload_ {0}
|
||||||
, last_port_type_ {TransceiverFactory::Capabilities::none}
|
, last_port_type_ {TransceiverFactory::Capabilities::none}
|
||||||
, rig_is_dummy_ {false}
|
, rig_is_dummy_ {false}
|
||||||
|
@ -1122,6 +1156,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
||||||
ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY));
|
ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY));
|
||||||
ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY));
|
ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY));
|
||||||
ui_->special_op_activity_button_group->setId (ui_->rbWW_DIGI, static_cast<int> (SpecialOperatingActivity::WW_DIGI));
|
ui_->special_op_activity_button_group->setId (ui_->rbWW_DIGI, static_cast<int> (SpecialOperatingActivity::WW_DIGI));
|
||||||
|
ui_->special_op_activity_button_group->setId (ui_->rbARRL_Digi, static_cast<int> (SpecialOperatingActivity::ARRL_DIGI));
|
||||||
ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX));
|
ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX));
|
||||||
ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND));
|
ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND));
|
||||||
|
|
||||||
|
@ -1320,6 +1355,7 @@ void Configuration::impl::initialize_models ()
|
||||||
ui_->TX_messages_check_box->setChecked (TX_messages_);
|
ui_->TX_messages_check_box->setChecked (TX_messages_);
|
||||||
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
|
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
|
||||||
ui_->decode_at_52s_check_box->setChecked(decode_at_52s_);
|
ui_->decode_at_52s_check_box->setChecked(decode_at_52s_);
|
||||||
|
ui_->disable_Tune_watchdog_check_box->setChecked(Tune_watchdog_disabled_);
|
||||||
ui_->single_decode_check_box->setChecked(single_decode_);
|
ui_->single_decode_check_box->setChecked(single_decode_);
|
||||||
ui_->cbTwoPass->setChecked(twoPass_);
|
ui_->cbTwoPass->setChecked(twoPass_);
|
||||||
ui_->gbSpecialOpActivity->setChecked(bSpecialOp_);
|
ui_->gbSpecialOpActivity->setChecked(bSpecialOp_);
|
||||||
|
@ -1397,7 +1433,10 @@ void Configuration::impl::initialize_models ()
|
||||||
ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_);
|
ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_);
|
||||||
ui_->only_fields_check_box->setChecked (highlight_only_fields_);
|
ui_->only_fields_check_box->setChecked (highlight_only_fields_);
|
||||||
ui_->include_WAE_check_box->setChecked (include_WAE_entities_);
|
ui_->include_WAE_check_box->setChecked (include_WAE_entities_);
|
||||||
|
ui_->highlight_73_check_box->setChecked (highlight_73_);
|
||||||
ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_);
|
ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_);
|
||||||
|
ui_->cbHighlightDXcall->setChecked(highlight_DXcall_);
|
||||||
|
ui_->cbHighlightDXgrid->setChecked(highlight_DXgrid_);
|
||||||
|
|
||||||
set_rig_invariants ();
|
set_rig_invariants ();
|
||||||
}
|
}
|
||||||
|
@ -1492,6 +1531,7 @@ void Configuration::impl::read_settings ()
|
||||||
highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool ();
|
highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool ();
|
||||||
highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool ();
|
highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool ();
|
||||||
include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool ();
|
include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool ();
|
||||||
|
highlight_73_ = settings_->value("Highlight73", false).toBool ();
|
||||||
LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt ();
|
LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt ();
|
||||||
lotw_users_.set_age_constraint (LotW_days_since_upload_);
|
lotw_users_.set_age_constraint (LotW_days_since_upload_);
|
||||||
|
|
||||||
|
@ -1531,6 +1571,7 @@ void Configuration::impl::read_settings ()
|
||||||
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
|
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
|
||||||
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
|
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
|
||||||
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
|
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
|
||||||
|
Tune_watchdog_disabled_ = settings_->value("TuneWatchdogDisabled",false).toBool ();
|
||||||
single_decode_ = settings_->value("SingleDecode",false).toBool ();
|
single_decode_ = settings_->value("SingleDecode",false).toBool ();
|
||||||
twoPass_ = settings_->value("TwoPass",true).toBool ();
|
twoPass_ = settings_->value("TwoPass",true).toBool ();
|
||||||
bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool ();
|
bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool ();
|
||||||
|
@ -1554,6 +1595,8 @@ void Configuration::impl::read_settings ()
|
||||||
calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
|
calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
|
||||||
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
|
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
|
||||||
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
|
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
|
||||||
|
highlight_DXcall_ = settings_->value("highlight_DXcall",false).toBool ();
|
||||||
|
highlight_DXgrid_ = settings_->value("highlight_DXgrid",false).toBool ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::find_audio_devices ()
|
void Configuration::impl::find_audio_devices ()
|
||||||
|
@ -1626,6 +1669,7 @@ void Configuration::impl::write_settings ()
|
||||||
settings_->setValue ("HighlightByMode", highlight_by_mode_);
|
settings_->setValue ("HighlightByMode", highlight_by_mode_);
|
||||||
settings_->setValue ("OnlyFieldsSought", highlight_only_fields_);
|
settings_->setValue ("OnlyFieldsSought", highlight_only_fields_);
|
||||||
settings_->setValue ("IncludeWAEEntities", include_WAE_entities_);
|
settings_->setValue ("IncludeWAEEntities", include_WAE_entities_);
|
||||||
|
settings_->setValue ("Highlight73", highlight_73_);
|
||||||
settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_);
|
settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_);
|
||||||
settings_->setValue ("toRTTY", log_as_RTTY_);
|
settings_->setValue ("toRTTY", log_as_RTTY_);
|
||||||
settings_->setValue ("dBtoComments", report_in_comments_);
|
settings_->setValue ("dBtoComments", report_in_comments_);
|
||||||
|
@ -1662,6 +1706,7 @@ void Configuration::impl::write_settings ()
|
||||||
settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode));
|
settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode));
|
||||||
settings_->setValue ("VHFUHF", enable_VHF_features_);
|
settings_->setValue ("VHFUHF", enable_VHF_features_);
|
||||||
settings_->setValue ("Decode52", decode_at_52s_);
|
settings_->setValue ("Decode52", decode_at_52s_);
|
||||||
|
settings_->setValue ("TuneWatchdogDisabled", Tune_watchdog_disabled_);
|
||||||
settings_->setValue ("SingleDecode", single_decode_);
|
settings_->setValue ("SingleDecode", single_decode_);
|
||||||
settings_->setValue ("TwoPass", twoPass_);
|
settings_->setValue ("TwoPass", twoPass_);
|
||||||
settings_->setValue ("SelectedActivity", SelectedActivity_);
|
settings_->setValue ("SelectedActivity", SelectedActivity_);
|
||||||
|
@ -1685,6 +1730,8 @@ void Configuration::impl::write_settings ()
|
||||||
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
|
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
|
||||||
settings_->setValue ("Region", QVariant::fromValue (region_));
|
settings_->setValue ("Region", QVariant::fromValue (region_));
|
||||||
settings_->setValue ("AutoGrid", use_dynamic_grid_);
|
settings_->setValue ("AutoGrid", use_dynamic_grid_);
|
||||||
|
settings_->setValue ("highlight_DXcall", highlight_DXcall_);
|
||||||
|
settings_->setValue ("highlight_DXgrid", highlight_DXgrid_);
|
||||||
settings_->sync ();
|
settings_->sync ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2088,6 +2135,7 @@ void Configuration::impl::accept ()
|
||||||
azel_directory_.setPath (ui_->azel_path_display_label->text ());
|
azel_directory_.setPath (ui_->azel_path_display_label->text ());
|
||||||
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
|
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
|
||||||
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
|
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
|
||||||
|
Tune_watchdog_disabled_ = ui_->disable_Tune_watchdog_check_box->isChecked ();
|
||||||
single_decode_ = ui_->single_decode_check_box->isChecked ();
|
single_decode_ = ui_->single_decode_check_box->isChecked ();
|
||||||
twoPass_ = ui_->cbTwoPass->isChecked ();
|
twoPass_ = ui_->cbTwoPass->isChecked ();
|
||||||
bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked ();
|
bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked ();
|
||||||
|
@ -2163,6 +2211,7 @@ void Configuration::impl::accept ()
|
||||||
highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked ();
|
highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked ();
|
||||||
highlight_only_fields_ = ui_->only_fields_check_box->isChecked ();
|
highlight_only_fields_ = ui_->only_fields_check_box->isChecked ();
|
||||||
include_WAE_entities_ = ui_->include_WAE_check_box->isChecked ();
|
include_WAE_entities_ = ui_->include_WAE_check_box->isChecked ();
|
||||||
|
highlight_73_ = ui_->highlight_73_check_box->isChecked ();
|
||||||
LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value ();
|
LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value ();
|
||||||
lotw_users_.set_age_constraint (LotW_days_since_upload_);
|
lotw_users_.set_age_constraint (LotW_days_since_upload_);
|
||||||
|
|
||||||
|
@ -2172,7 +2221,8 @@ void Configuration::impl::accept ()
|
||||||
dynamic_grid_.clear ();
|
dynamic_grid_.clear ();
|
||||||
}
|
}
|
||||||
use_dynamic_grid_ = ui_->use_dynamic_grid->isChecked();
|
use_dynamic_grid_ = ui_->use_dynamic_grid->isChecked();
|
||||||
|
highlight_DXcall_ = ui_->cbHighlightDXcall->isChecked();
|
||||||
|
highlight_DXgrid_ = ui_->cbHighlightDXgrid->isChecked();
|
||||||
write_settings (); // make visible to all
|
write_settings (); // make visible to all
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2735,6 +2785,7 @@ bool Configuration::impl::open_rig (bool force)
|
||||||
|
|
||||||
ui_->test_CAT_push_button->setStyleSheet ({});
|
ui_->test_CAT_push_button->setStyleSheet ({});
|
||||||
rig_active_ = true;
|
rig_active_ = true;
|
||||||
|
LOG_TRACE ("emitting startup_transceiver");
|
||||||
Q_EMIT start_transceiver (++transceiver_command_number_); // start rig on its thread
|
Q_EMIT start_transceiver (++transceiver_command_number_); // start rig on its thread
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
|
@ -2782,6 +2833,7 @@ void Configuration::impl::transceiver_frequency (Frequency f)
|
||||||
cached_rig_state_.frequency (apply_calibration (f + current_offset_));
|
cached_rig_state_.frequency (apply_calibration (f + current_offset_));
|
||||||
|
|
||||||
// qDebug () << "Configuration::impl::transceiver_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
// qDebug () << "Configuration::impl::transceiver_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
||||||
|
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2808,6 +2860,7 @@ void Configuration::impl::transceiver_tx_frequency (Frequency f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// qDebug () << "Configuration::impl::transceiver_tx_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
// qDebug () << "Configuration::impl::transceiver_tx_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
||||||
|
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2817,6 +2870,7 @@ void Configuration::impl::transceiver_mode (MODE m)
|
||||||
cached_rig_state_.online (true); // we want the rig online
|
cached_rig_state_.online (true); // we want the rig online
|
||||||
cached_rig_state_.mode (m);
|
cached_rig_state_.mode (m);
|
||||||
// qDebug () << "Configuration::impl::transceiver_mode: n:" << transceiver_command_number_ + 1 << "m:" << m;
|
// qDebug () << "Configuration::impl::transceiver_mode: n:" << transceiver_command_number_ + 1 << "m:" << m;
|
||||||
|
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2826,6 +2880,7 @@ void Configuration::impl::transceiver_ptt (bool on)
|
||||||
set_cached_mode ();
|
set_cached_mode ();
|
||||||
cached_rig_state_.ptt (on);
|
cached_rig_state_.ptt (on);
|
||||||
// qDebug () << "Configuration::impl::transceiver_ptt: n:" << transceiver_command_number_ + 1 << "on:" << on;
|
// qDebug () << "Configuration::impl::transceiver_ptt: n:" << transceiver_command_number_ + 1 << "on:" << on;
|
||||||
|
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2909,6 +2964,7 @@ void Configuration::impl::close_rig ()
|
||||||
if (rig_active_)
|
if (rig_active_)
|
||||||
{
|
{
|
||||||
ui_->test_CAT_push_button->setStyleSheet ("QPushButton {background-color: red;}");
|
ui_->test_CAT_push_button->setStyleSheet ("QPushButton {background-color: red;}");
|
||||||
|
LOG_TRACE ("emitting stop_transceiver");
|
||||||
Q_EMIT stop_transceiver ();
|
Q_EMIT stop_transceiver ();
|
||||||
for (auto const& connection: rig_connections_)
|
for (auto const& connection: rig_connections_)
|
||||||
{
|
{
|
||||||
|
|
|
@ -134,6 +134,7 @@ public:
|
||||||
bool split_mode () const;
|
bool split_mode () const;
|
||||||
bool enable_VHF_features () const;
|
bool enable_VHF_features () const;
|
||||||
bool decode_at_52s () const;
|
bool decode_at_52s () const;
|
||||||
|
bool Tune_watchdog_disabled () const;
|
||||||
bool single_decode () const;
|
bool single_decode () const;
|
||||||
bool twoPass() const;
|
bool twoPass() const;
|
||||||
bool bFox() const;
|
bool bFox() const;
|
||||||
|
@ -181,8 +182,14 @@ public:
|
||||||
bool highlight_by_mode () const;
|
bool highlight_by_mode () const;
|
||||||
bool highlight_only_fields () const;
|
bool highlight_only_fields () const;
|
||||||
bool include_WAE_entities () const;
|
bool include_WAE_entities () const;
|
||||||
|
bool highlight_73 () const;
|
||||||
|
void setSpecial_Hound();
|
||||||
|
void setSpecial_Fox();
|
||||||
|
void setSpecial_None();
|
||||||
|
bool highlight_DXcall () const;
|
||||||
|
bool highlight_DXgrid () const;
|
||||||
|
|
||||||
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND};
|
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, ARRL_DIGI, FOX, HOUND};
|
||||||
SpecialOperatingActivity special_op_id () const;
|
SpecialOperatingActivity special_op_id () const;
|
||||||
|
|
||||||
struct CalibrationParams
|
struct CalibrationParams
|
||||||
|
|
518
Configuration.ui
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>554</width>
|
<width>588</width>
|
||||||
<height>560</height>
|
<height>642</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -171,46 +171,6 @@
|
||||||
<string>Display</string>
|
<string>Display</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="TX_messages_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Tx messages to Rx frequency window</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="DXCC_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Show if decoded stations are new DXCC entities or worked before.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Show &DXCC, grid, and worked-before status</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QCheckBox" name="decodes_from_top_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Start new period decodes at top</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QCheckBox" name="ppfx_check_box">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show principal prefix instead of country name</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1" rowspan="4">
|
<item row="0" column="1" rowspan="4">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_21">
|
<layout class="QHBoxLayout" name="horizontalLayout_21">
|
||||||
<item>
|
<item>
|
||||||
|
@ -285,6 +245,60 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QCheckBox" name="cbHighlightDXgrid">
|
||||||
|
<property name="text">
|
||||||
|
<string>Highlight DX Grid in message</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="ppfx_check_box">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show principal prefix instead of country name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QCheckBox" name="cbHighlightDXcall">
|
||||||
|
<property name="text">
|
||||||
|
<string>Highlight DX Call in message</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="decodes_from_top_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Start new period decodes at top</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="TX_messages_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Tx messages to Rx frequency window</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="DXCC_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Show if decoded stations are new DXCC entities or worked before.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Show &DXCC, grid, and worked-before status</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -489,6 +503,16 @@ quiet period when decoding is done.</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="disable_Tune_watchdog_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Disable the Tune watchdog.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Disable Tune watchdog</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -2302,6 +2326,23 @@ Right click for insert and delete options.</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="include_WAE_check_box">
|
||||||
|
<property name="text">
|
||||||
|
<string>Include extra WAE entities</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="only_fields_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Only grid Fields sought</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="0" colspan="2">
|
<item row="0" column="0" colspan="2">
|
||||||
<widget class="DecodeHighlightingListView" name="highlighting_list_view">
|
<widget class="DecodeHighlightingListView" name="highlighting_list_view">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
@ -2349,20 +2390,10 @@ Right click for insert and delete options.</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QCheckBox" name="include_WAE_check_box">
|
<widget class="QCheckBox" name="highlight_73_check_box">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Include extra WAE entities</string>
|
<string>Highlight also messages with 73 or RR73</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="only_fields_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Only grid Fields sought</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -2483,78 +2514,10 @@ Right click for insert and delete options.</string>
|
||||||
<string>Advanced</string>
|
<string>Advanced</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="gridLayout_9">
|
<layout class="QGridLayout" name="gridLayout_9">
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QGroupBox" name="groupBox_6">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QFormLayout" name="formLayout_11">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Random erasure patterns:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>sbNtrials</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QSpinBox" name="sbNtrials">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>Aggressive decoding level:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>sbAggressive</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QSpinBox" name="sbAggressive">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>10</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="cbTwoPass">
|
|
||||||
<property name="text">
|
|
||||||
<string>Two-pass decoding</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" colspan="2">
|
<item row="1" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="gbSpecialOpActivity">
|
<widget class="QGroupBox" name="gbSpecialOpActivity">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Special operating activity: Generation of FT4, FT8, and MSK144 messages</string>
|
<string>Special operating activity</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
@ -2563,47 +2526,6 @@ Right click for insert and delete options.</string>
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,0,0,0">
|
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,0,0,0">
|
||||||
<item row="0" column="3">
|
|
||||||
<widget class="QRadioButton" name="rbHound">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleName">
|
|
||||||
<string>Hound</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Hound</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<attribute name="buttonGroup">
|
|
||||||
<string notr="true">special_op_activity_button_group</string>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QRadioButton" name="rbNA_VHF_Contest">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleName">
|
|
||||||
<string>NA VHF Contest</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>NA VHF Contest</string>
|
|
||||||
</property>
|
|
||||||
<attribute name="buttonGroup">
|
|
||||||
<string notr="true">special_op_activity_button_group</string>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QRadioButton" name="rbFox">
|
<widget class="QRadioButton" name="rbFox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
|
@ -2645,6 +2567,28 @@ Right click for insert and delete options.</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QRadioButton" name="rbNA_VHF_Contest">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>NA VHF Contest</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>NA VHF</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="buttonGroup">
|
||||||
|
<string notr="true">special_op_activity_button_group</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="1" rowspan="3">
|
<item row="0" column="1" rowspan="3">
|
||||||
<spacer name="horizontalSpacer_11">
|
<spacer name="horizontalSpacer_11">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -2658,74 +2602,24 @@ Right click for insert and delete options.</string>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="3">
|
<item row="0" column="3">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
|
<widget class="QRadioButton" name="rbHound">
|
||||||
<item>
|
<property name="toolTip">
|
||||||
<widget class="QRadioButton" name="rbRTTY_Roundup">
|
<string><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></string>
|
||||||
<property name="toolTip">
|
</property>
|
||||||
<string><html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></string>
|
<property name="accessibleName">
|
||||||
</property>
|
<string>Hound</string>
|
||||||
<property name="accessibleName">
|
</property>
|
||||||
<string>R T T Y Roundup</string>
|
<property name="text">
|
||||||
</property>
|
<string>Hound</string>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>RTTY Roundup messages</string>
|
<property name="checked">
|
||||||
</property>
|
<bool>true</bool>
|
||||||
<attribute name="buttonGroup">
|
</property>
|
||||||
<string notr="true">special_op_activity_button_group</string>
|
<attribute name="buttonGroup">
|
||||||
</attribute>
|
<string notr="true">special_op_activity_button_group</string>
|
||||||
</widget>
|
</attribute>
|
||||||
</item>
|
</widget>
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_10">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QFormLayout" name="formLayout_17">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="labRTTY">
|
|
||||||
<property name="accessibleName">
|
|
||||||
<string>RTTY Roundup exchange</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>RTTY RU Exch:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>RTTY_Exchange</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QLineEdit" name="RTTY_Exchange">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>70</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>NJ</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="3">
|
<item row="1" column="3">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
|
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
|
||||||
|
@ -2818,6 +2712,88 @@ Right click for insert and delete options.</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="3">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="rbRTTY_Roundup">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>FT Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>R T T Y Roundup</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>FT Roundup</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="buttonGroup">
|
||||||
|
<string notr="true">special_op_activity_button_group</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_10">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QFormLayout" name="formLayout_17">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="labRTTY">
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>RTTY Roundup exchange</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>FT RU Exch:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>RTTY_Exchange</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLineEdit" name="RTTY_Exchange">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>70</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>FT Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>NJ</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="3">
|
||||||
|
<widget class="QRadioButton" name="rbARRL_Digi">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>ARRL International Digital Contest</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>ARRL Digi Contest</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="buttonGroup">
|
||||||
|
<string notr="true">special_op_activity_button_group</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -2993,6 +2969,74 @@ Right click for insert and delete options.</string>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QGroupBox" name="groupBox_6">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_11">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Random erasure patterns:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>sbNtrials</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="sbNtrials">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Aggressive decoding level:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>sbAggressive</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="sbAggressive">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QCheckBox" name="cbTwoPass">
|
||||||
|
<property name="text">
|
||||||
|
<string>Two-pass decoding</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="2" column="0" colspan="2">
|
<item row="2" column="0" colspan="2">
|
||||||
<spacer name="verticalSpacer_8">
|
<spacer name="verticalSpacer_8">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -3234,12 +3278,12 @@ Right click for insert and delete options.</string>
|
||||||
</connections>
|
</connections>
|
||||||
<buttongroups>
|
<buttongroups>
|
||||||
<buttongroup name="TX_audio_source_button_group"/>
|
<buttongroup name="TX_audio_source_button_group"/>
|
||||||
|
<buttongroup name="special_op_activity_button_group"/>
|
||||||
|
<buttongroup name="split_mode_button_group"/>
|
||||||
|
<buttongroup name="CAT_data_bits_button_group"/>
|
||||||
|
<buttongroup name="PTT_method_button_group"/>
|
||||||
<buttongroup name="CAT_stop_bits_button_group"/>
|
<buttongroup name="CAT_stop_bits_button_group"/>
|
||||||
<buttongroup name="CAT_handshake_button_group"/>
|
<buttongroup name="CAT_handshake_button_group"/>
|
||||||
<buttongroup name="CAT_data_bits_button_group"/>
|
|
||||||
<buttongroup name="TX_mode_button_group"/>
|
<buttongroup name="TX_mode_button_group"/>
|
||||||
<buttongroup name="special_op_activity_button_group"/>
|
|
||||||
<buttongroup name="PTT_method_button_group"/>
|
|
||||||
<buttongroup name="split_mode_button_group"/>
|
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -6,7 +6,7 @@ you change the name in the Applications folder from WSJT-X to WSJT-X_previous
|
||||||
before proceeding.
|
before proceeding.
|
||||||
|
|
||||||
I recommend that you follow the installation instructions especially if you
|
I recommend that you follow the installation instructions especially if you
|
||||||
are moving from v2.2 to v2.3 or later, of WSJT-X or you have upgraded macOS.
|
are moving from v2.3 to v2.4 or later, of WSJT-X or you have upgraded macOS.
|
||||||
|
|
||||||
Double-click on the wsjtx-...-Darwin.dmg file you have downloaded from K1JT's web-site.
|
Double-click on the wsjtx-...-Darwin.dmg file you have downloaded from K1JT's web-site.
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ change has been made by typing:
|
||||||
|
|
||||||
sysctl -a | grep sysv.shm
|
sysctl -a | grep sysv.shm
|
||||||
|
|
||||||
If shmmax is not shown as 52428800 then contact me since WSJT-X will fail to load with
|
If shmmax is not shown as 52428800 then contact me since WSJT-X might fail to load with
|
||||||
an error message: "Unable to create shared memory segment".
|
an error message: "Unable to create shared memory segment".
|
||||||
|
|
||||||
You can now close the Terminal window. It will not be necessary to repeat this procedure
|
You can now close the Terminal window. It will not be necessary to repeat this procedure
|
||||||
|
@ -72,7 +72,9 @@ Please email me if you have problems.
|
||||||
|
|
||||||
--- John G4KLA (g4kla@rmnjmn.co.uk)
|
--- John G4KLA (g4kla@rmnjmn.co.uk)
|
||||||
|
|
||||||
Addendum: Information about com.wsjtx.sysctl.plist and multiple instances of WSJT-X.
|
Additional Notes:
|
||||||
|
|
||||||
|
1. Information about com.wsjtx.sysctl.plist and multiple instances of WSJT-X
|
||||||
|
|
||||||
WSJT-X makes use of a block of memory which is shared between different parts of
|
WSJT-X makes use of a block of memory which is shared between different parts of
|
||||||
the code. The normal allocation of shared memory on a Mac is insufficient and this
|
the code. The normal allocation of shared memory on a Mac is insufficient and this
|
||||||
|
@ -87,7 +89,8 @@ simultaneously, the shmall parameter in the com.wsjtx.sysctl.plist file needs to
|
||||||
The shmall parameter determines the amount of shared memory which is allocated in 4096 byte pages
|
The shmall parameter determines the amount of shared memory which is allocated in 4096 byte pages
|
||||||
with 50MB (52428800) required for each instance. The shmall parameter is calculated as:
|
with 50MB (52428800) required for each instance. The shmall parameter is calculated as:
|
||||||
(n * 52428800)/4096 where 'n' is the number of instances required to run simultaneously.
|
(n * 52428800)/4096 where 'n' is the number of instances required to run simultaneously.
|
||||||
Remember to reboot your Mac afterwards.
|
Replace your new version of this file in /Library/LaunchDaemons and remember to reboot your
|
||||||
|
Mac afterwards.
|
||||||
|
|
||||||
Note that the shmmax parameter remains unchanged. This is the maximum amount of shared memory that
|
Note that the shmmax parameter remains unchanged. This is the maximum amount of shared memory that
|
||||||
any one instance is allowed to request from the total shared memory allocation and should not
|
any one instance is allowed to request from the total shared memory allocation and should not
|
||||||
|
@ -96,4 +99,15 @@ be changed.
|
||||||
If two instances of WSJT-X are running, it is likely that you might need additional
|
If two instances of WSJT-X are running, it is likely that you might need additional
|
||||||
audio devices, from two rigs for example. Visit Audio MIDI Setup and create an Aggregate Device
|
audio devices, from two rigs for example. Visit Audio MIDI Setup and create an Aggregate Device
|
||||||
which will allow you to specify more than one interface. I recommend you consult Apple's guide
|
which will allow you to specify more than one interface. I recommend you consult Apple's guide
|
||||||
on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000.
|
on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000.
|
||||||
|
|
||||||
|
2. Preventing WSJT-X from being put into 'sleep' mode (App Nap).
|
||||||
|
|
||||||
|
In normal circumstances an application which has not been directly accessed for a while can be
|
||||||
|
subject to App Nap which means it is suspended until such time as its windows are accessed. If
|
||||||
|
it is intended that WSJT-X should be submitting continued reports to, for example, PSK Reporter
|
||||||
|
then reporting will be interrupted. App Nap can be disabled as follows, but first quit WSJT-X:
|
||||||
|
|
||||||
|
Open a Terminal window and type: defaults write org.k1jt.wsjtx NSAppSleepDisable -bool YES
|
||||||
|
If you type: defaults read org.k1jt.wsjtx then the response will be: NSAppSleepDisable = 1;
|
||||||
|
Close the Terminal window and launch WSJT-X. (If you 'Hide' WSJT-X, this scheme will be suspended.)
|
||||||
|
|
|
@ -11,7 +11,39 @@ extern "C" {
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{1,4}|\d{3}))|[A-Z0-9/]+|\.{3})\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"};
|
QRegularExpression tokens_re {R"(
|
||||||
|
^
|
||||||
|
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
|
||||||
|
(?:
|
||||||
|
(?<word1>
|
||||||
|
(?:CQ|DE|QRZ)
|
||||||
|
(?:\s?DX|\s
|
||||||
|
(?:[A-Z]{1,4}|\d{3}) # directional CQ
|
||||||
|
)
|
||||||
|
| [A-Z0-9/]+ # DX call
|
||||||
|
|\.{3} # unknown hash code
|
||||||
|
)\s
|
||||||
|
)
|
||||||
|
(?:
|
||||||
|
(?<word2>[A-Z0-9/]+) # DE call
|
||||||
|
(?:\s
|
||||||
|
(?<word3>[-+A-Z0-9]+) # report
|
||||||
|
(?:\s
|
||||||
|
(?<word4>
|
||||||
|
(?:
|
||||||
|
OOO # EME
|
||||||
|
| (?!RR73)[A-R]{2}[0-9]{2} # grid square (not RR73)
|
||||||
|
| 5[0-9]{5} # EU VHF Contest report & serial
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(?:\s
|
||||||
|
(?<word5>[A-R]{2}[0-9]{2}[A-X]{2}) # EU VHF Contest grid locator
|
||||||
|
)?
|
||||||
|
)?
|
||||||
|
)?
|
||||||
|
)?
|
||||||
|
)"
|
||||||
|
, QRegularExpression::ExtendedPatternSyntaxOption};
|
||||||
}
|
}
|
||||||
|
|
||||||
DecodedText::DecodedText (QString const& the_string)
|
DecodedText::DecodedText (QString const& the_string)
|
||||||
|
@ -23,13 +55,15 @@ DecodedText::DecodedText (QString const& the_string)
|
||||||
, is_standard_ {false}
|
, is_standard_ {false}
|
||||||
{
|
{
|
||||||
// discard appended AP info
|
// discard appended AP info
|
||||||
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?a[0-9].*$)"}, "\\1");
|
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?[aq][0-9].*$)"}, "\\1");
|
||||||
|
|
||||||
// qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
|
// qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
|
||||||
if (message_.length() >= 1)
|
if (message_.length() >= 1)
|
||||||
{
|
{
|
||||||
message0_ = message_.left(36);
|
// remove appended confidence (?) and ap designators before truncating the message
|
||||||
message_ = message_.left(36).remove (QRegularExpression {"[<>]"});
|
message_ = clean_string_.mid (column_qsoText + padding_).trimmed ();
|
||||||
|
message0_ = message_.left(37);
|
||||||
|
message_ = message_.left(37).remove (QRegularExpression {"[<>]"});
|
||||||
int i1 = message_.indexOf ('\r');
|
int i1 = message_.indexOf ('\r');
|
||||||
if (i1 > 0)
|
if (i1 > 0)
|
||||||
{
|
{
|
||||||
|
@ -60,11 +94,13 @@ QStringList DecodedText::messageWords () const
|
||||||
// extract up to the first four message words
|
// extract up to the first four message words
|
||||||
QString t=message_;
|
QString t=message_;
|
||||||
if(t.left(4)=="TU; ") t=message_.mid(4,-1);
|
if(t.left(4)=="TU; ") t=message_.mid(4,-1);
|
||||||
return words_re.match(t).capturedTexts();
|
return tokens_re.match(t).capturedTexts();
|
||||||
}
|
}
|
||||||
// simple word split for free text messages
|
// simple word split for free text messages
|
||||||
auto words = message_.split (' ', SkipEmptyParts);
|
auto words = message_.split (' ', SkipEmptyParts);
|
||||||
// add whole message as item 0 to mimic RE capture list
|
// add whole message and two empty strings as item 0 & 1 to mimic RE
|
||||||
|
// capture list
|
||||||
|
words.prepend (QString {});
|
||||||
words.prepend (message_);
|
words.prepend (message_);
|
||||||
return words;
|
return words;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +130,7 @@ bool DecodedText::isTX() const
|
||||||
|
|
||||||
bool DecodedText::isLowConfidence () const
|
bool DecodedText::isLowConfidence () const
|
||||||
{
|
{
|
||||||
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 21, 1);
|
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 36, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DecodedText::frequencyOffset() const
|
int DecodedText::frequencyOffset() const
|
||||||
|
@ -128,31 +164,37 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
|
||||||
if (message_.size () < 1) return false;
|
if (message_.size () < 1) return false;
|
||||||
|
|
||||||
QStringList const& w = message_.split(" ", SkipEmptyParts);
|
QStringList const& w = message_.split(" ", SkipEmptyParts);
|
||||||
if (w.size ()
|
int offset {0};
|
||||||
&& is_standard_ && (w[0] == myBaseCall
|
if (w.size () > 2)
|
||||||
|| w[0].endsWith ("/" + myBaseCall)
|
|
||||||
|| w[0].startsWith (myBaseCall + "/")
|
|
||||||
|| (w.size () > 1 && !dxBaseCall.isEmpty ()
|
|
||||||
&& (w[1] == dxBaseCall
|
|
||||||
|| w[1].endsWith ("/" + dxBaseCall)
|
|
||||||
|| w[1].startsWith (dxBaseCall + "/")))))
|
|
||||||
{
|
{
|
||||||
QString tt="";
|
if ("RR73;" == w[1] && w.size () > 3)
|
||||||
if(w.size() > 2) tt=w[2];
|
|
||||||
bool ok;
|
|
||||||
auto i1=tt.toInt(&ok);
|
|
||||||
if (ok and i1>=-50 and i1<50)
|
|
||||||
{
|
{
|
||||||
report = tt;
|
offset = 2;
|
||||||
}
|
}
|
||||||
else
|
if (is_standard_ && (w[offset] == myBaseCall
|
||||||
|
|| w[offset].endsWith ("/" + myBaseCall)
|
||||||
|
|| w[offset].startsWith (myBaseCall + "/")
|
||||||
|
|| (w.size () > offset + 1 && !dxBaseCall.isEmpty ()
|
||||||
|
&& (w[offset + 1] == dxBaseCall
|
||||||
|
|| w[offset + 1].endsWith ("/" + dxBaseCall)
|
||||||
|
|| w[offset + 1].startsWith (dxBaseCall + "/")))))
|
||||||
{
|
{
|
||||||
if (tt.mid(0,1)=="R")
|
bool ok;
|
||||||
|
auto tt = w[offset + 2];
|
||||||
|
auto i1=tt.toInt(&ok);
|
||||||
|
if (ok and i1>=-50 and i1<50)
|
||||||
{
|
{
|
||||||
i1=tt.mid(1).toInt(&ok);
|
report = tt;
|
||||||
if(ok and i1>=-50 and i1<50)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tt.mid(0,1)=="R")
|
||||||
{
|
{
|
||||||
report = tt.mid(1);
|
i1=tt.mid(1).toInt(&ok);
|
||||||
|
if(ok and i1>=-50 and i1<50)
|
||||||
|
{
|
||||||
|
report = tt.mid(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -163,7 +205,7 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
|
||||||
// get the first text word, usually the call
|
// get the first text word, usually the call
|
||||||
QString DecodedText::call() const
|
QString DecodedText::call() const
|
||||||
{
|
{
|
||||||
return words_re.match (message_).captured ("word1");
|
return tokens_re.match (message_).captured ("word1");
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the second word, most likely the de call and the third word, most likely grid
|
// get the second word, most likely the de call and the third word, most likely grid
|
||||||
|
@ -175,7 +217,7 @@ void DecodedText::deCallAndGrid(/*out*/QString& call, QString& grid) const
|
||||||
{
|
{
|
||||||
msg = msg.mid (p + 2);
|
msg = msg.mid (p + 2);
|
||||||
}
|
}
|
||||||
auto const& match = words_re.match (msg);
|
auto const& match = tokens_re.match (msg);
|
||||||
call = match.captured ("word2");
|
call = match.captured ("word2");
|
||||||
grid = match.captured ("word3");
|
grid = match.captured ("word3");
|
||||||
if ("R" == grid) grid = match.captured ("word4");
|
if ("R" == grid) grid = match.captured ("word4");
|
||||||
|
|
|
@ -443,7 +443,7 @@ void EqualizationToolsDialog::impl::plot_current ()
|
||||||
plot_.graph (3)->rescaleValueAxis ();
|
plot_.graph (3)->rescaleValueAxis ();
|
||||||
|
|
||||||
QFileInfo refspec_file_info {data_directory_.absoluteFilePath ("refspec.dat")};
|
QFileInfo refspec_file_info {data_directory_.absoluteFilePath ("refspec.dat")};
|
||||||
std::ifstream refspec_file (refspec_file_info.absoluteFilePath ().toLatin1 ().constData (), std::ifstream::in);
|
std::ifstream refspec_file (refspec_file_info.absoluteFilePath ().toLocal8Bit ().constData (), std::ifstream::in);
|
||||||
unsigned n;
|
unsigned n;
|
||||||
if (refspec_file >> amp_poly_low_ >> amp_poly_high_ >> n)
|
if (refspec_file >> amp_poly_low_ >> amp_poly_high_ >> n)
|
||||||
{
|
{
|
||||||
|
@ -499,7 +499,7 @@ void EqualizationToolsDialog::impl::plot_phase ()
|
||||||
, "Phase Coefficient Files (*.pcoeff)");
|
, "Phase Coefficient Files (*.pcoeff)");
|
||||||
if (!phase_file_name.size ()) return;
|
if (!phase_file_name.size ()) return;
|
||||||
|
|
||||||
std::ifstream phase_file (phase_file_name.toLatin1 ().constData (), std::ifstream::in);
|
std::ifstream phase_file (phase_file_name.toLocal8Bit ().constData (), std::ifstream::in);
|
||||||
int n;
|
int n;
|
||||||
float chi;
|
float chi;
|
||||||
float rmsdiff;
|
float rmsdiff;
|
||||||
|
|
378
NEWS
|
@ -9,7 +9,375 @@
|
||||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||||
|
|
||||||
|
|
||||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
|
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||||
|
|
||||||
|
Release: WSJT-X 2.6.0-rc2
|
||||||
|
July 21, 2022
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
|
||||||
|
well as some bug fixes.
|
||||||
|
|
||||||
|
- The "Measure" function in Echo mode now uses the computed Doppler
|
||||||
|
spread for DX grid, when available. This feature is especially
|
||||||
|
helpful for microwave EME tests, enabling accurate measurement of
|
||||||
|
SNR for a DX station.
|
||||||
|
|
||||||
|
- Settings for T/R period and Submode are now remembered by mode when
|
||||||
|
you switch directly between (for example) MSK144-15, Q65-60A,
|
||||||
|
JT65C, or FST4-120.
|
||||||
|
|
||||||
|
- Tx and Rx audio frequencies are remembered and restored when you
|
||||||
|
return from a mode that sets a default frequency of 1500 Hz
|
||||||
|
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
|
||||||
|
FT4, FT8, Q65, JT65, or FST4.
|
||||||
|
|
||||||
|
- QSOs in the Contest Log can now be displayed in increasing or
|
||||||
|
decreasing order of logged time. By default the log is scrolled to
|
||||||
|
the latest logged QSO, ready for insertion of a new contact. The
|
||||||
|
total number of QSOs in the Contest Log is displayed at bottom left
|
||||||
|
of its window.
|
||||||
|
|
||||||
|
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
|
||||||
|
|
||||||
|
- Layout of mode buttons has been optimized for 4K screens.
|
||||||
|
|
||||||
|
- Display of Keyboard Shortcuts has been updated.
|
||||||
|
|
||||||
|
- The OK button now has default focus in the LogQSO dialog window.
|
||||||
|
You may just hit Enter to log the QSO.
|
||||||
|
|
||||||
|
- Bug fix: The Tx Freq spinbox remained red when coming back from
|
||||||
|
some Q65 submodes. Corrected.
|
||||||
|
|
||||||
|
- Hamlib bug fixes: make sure that VFOB is selected when required on
|
||||||
|
some rigs (e.g. IC7610, IC7100), and others.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.6.0-rc1
|
||||||
|
June 20, 2022
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
|
||||||
|
International Digital Contest; performance enhancements for FT8, Q65,
|
||||||
|
and EME Echo mode; new controls and options on the GUI; and several
|
||||||
|
bug fixes.
|
||||||
|
|
||||||
|
In program WSJT-X:
|
||||||
|
|
||||||
|
- Improved decoding for FT8: additional messages are marked 'a7'
|
||||||
|
|
||||||
|
- Improved decoding for Q65 when AP is in use
|
||||||
|
|
||||||
|
- Optional new "Active Stations" window and other features
|
||||||
|
supporting ARRL International Digital Contest
|
||||||
|
|
||||||
|
- Accurate SNR measurements in Echo mode, including large Doppler
|
||||||
|
spreads
|
||||||
|
|
||||||
|
- Add mode selection buttons on main window for FT4, FT8, JT65,
|
||||||
|
MSK144, and Q65
|
||||||
|
|
||||||
|
- Add a button to toggle FT8's Hound mode ON or OFF
|
||||||
|
|
||||||
|
- Add a "Clr Avg" button for Echo mode
|
||||||
|
|
||||||
|
- Add optional highlighting of DX Call and DX Grid
|
||||||
|
|
||||||
|
- Add optional highlighting of messages containing RR73 or 73
|
||||||
|
|
||||||
|
- New options for writing to ALL.TXT: split the file yearly, monthly,
|
||||||
|
or disable writing altogether
|
||||||
|
|
||||||
|
- Add Russian to available translations of user interface
|
||||||
|
|
||||||
|
- Add a 90 s Tune watchdog with optional disable
|
||||||
|
|
||||||
|
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
|
||||||
|
Hold Tx Freq is enabled
|
||||||
|
|
||||||
|
- Suppress transmission of blank messages
|
||||||
|
|
||||||
|
- Suppress self-spotting when running multiple instances
|
||||||
|
|
||||||
|
- Correct the handling of messages starting with "CQ xxxx ..."
|
||||||
|
|
||||||
|
- Correct a flaw that could cause Windows to drop audio samples
|
||||||
|
|
||||||
|
- Correct a flaw that could send incorrect frequencies to ALL.TXT
|
||||||
|
and PSK Reporter after a band change
|
||||||
|
|
||||||
|
- Correct the auto-sequencing logic in several specific circumstances
|
||||||
|
|
||||||
|
- Correct a flaw in WSPR mode when handling three-character callsigns
|
||||||
|
|
||||||
|
- Correct a flaw that could cause OmniRig 1.19 or later to set
|
||||||
|
incorrect frequencies after initialization
|
||||||
|
|
||||||
|
- Clean up some ToolTips
|
||||||
|
|
||||||
|
- Fix an inconsistancy in the macOS installation package that caused
|
||||||
|
the pwr slider to behave incorrectly on macOS 12
|
||||||
|
|
||||||
|
In program MAP65 (Windows only):
|
||||||
|
|
||||||
|
- Send additional information to file azel.dat
|
||||||
|
|
||||||
|
- Allow optional scaling of digital I/Q data
|
||||||
|
|
||||||
|
- Suppress a bounds error caused by too-wide setting of display
|
||||||
|
bandwidth
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.4
|
||||||
|
Dec 28, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This is mostly a bug fix release. It has the following changes since
|
||||||
|
release 2.5.3:
|
||||||
|
|
||||||
|
WSJTX:
|
||||||
|
- Repair a defect that caused occasional crashes when in QSO with
|
||||||
|
stations using nonstandard callsigns.
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
|
||||||
|
user.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.3
|
||||||
|
Dec 7, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This release has the following changes since release 2.5.2:
|
||||||
|
|
||||||
|
- Add a note in memory of G4WJS to the About window
|
||||||
|
|
||||||
|
- Add a simple $DXCALL macro capability for Tx messages, and update
|
||||||
|
the User Guide accordingly
|
||||||
|
|
||||||
|
- Ensure that MAIN VFO is used for receiving on rigs that require it
|
||||||
|
|
||||||
|
- Repair a defect in reporting low-confidence decodes to PskReporter
|
||||||
|
|
||||||
|
- Updated CTY.DAT database, tnx to Jim AD1C
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.2
|
||||||
|
Nov 4, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This is mostly a bug fix release. It has the following changes since
|
||||||
|
release 2.5.1:
|
||||||
|
|
||||||
|
- Repair a longstanding regression that caused signal reports from
|
||||||
|
tail-ended Tx2 messages to be omitted from logged information
|
||||||
|
|
||||||
|
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
|
||||||
|
n3=1 DXpedition mode) in regular 77-bit modes
|
||||||
|
|
||||||
|
- Repair a regression associated with setting the main window width
|
||||||
|
on program startup.
|
||||||
|
|
||||||
|
- Repair a problem with Q65 decodes of type 'q3' for messages of the
|
||||||
|
form "<Call_1> Call_2"
|
||||||
|
|
||||||
|
- Execute code associated with Q65 decodes of type 'q5' only when the
|
||||||
|
Max Drift control is set to 50. This fix prevents
|
||||||
|
double-incrementing of the message averaging counter on the first
|
||||||
|
decoding sequence.
|
||||||
|
|
||||||
|
- Polarization offset 'Dpol' from the astronomical data window is now
|
||||||
|
written to file azel.dat if environment variable
|
||||||
|
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
|
||||||
|
especially useful for EME on the higher microwave bands.
|
||||||
|
|
||||||
|
- The Auto Log QSO option in "Settings->Reporting" now behaves the
|
||||||
|
same as the Prompt to log QSO option when not in a special
|
||||||
|
operating context mode.
|
||||||
|
|
||||||
|
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
|
||||||
|
and is no longer reset to Fast on program startup or when Settings
|
||||||
|
has been opened. The user selection is used for automatic decodes,
|
||||||
|
but Deep is used for any subsequent manual decode attempts.
|
||||||
|
|
||||||
|
- New hamlib code to correct minor flaws in controlling several rigs.
|
||||||
|
|
||||||
|
- Update the Chinese and Hong Kong translations of the user
|
||||||
|
interface.
|
||||||
|
|
||||||
|
- Note that since the WSJT-X v2.5.0 GA release we have not been
|
||||||
|
providing pre-built 32-bit packages for Linux on Intel CPUs, this
|
||||||
|
is due to the mainstream Linux Desktop distributions no longer
|
||||||
|
providing updates for 32-bit only systems. 32-bit WSJT-X can still
|
||||||
|
be built for Linux Intel and is supported at least until some
|
||||||
|
prerequisite package is no longer available.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.1
|
||||||
|
Oct 21, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This release mainly contains improvements and defect repairs related
|
||||||
|
to Q65 and JT65 modes when used with non-standard and compound
|
||||||
|
calls. Also included is a new feature for microwave aircraft scatter
|
||||||
|
and repairs for defects detected since the 2.5.0 GA release.
|
||||||
|
|
||||||
|
- Improved Q65 support for 10GHz Aircraft Scatter contributed by Rex,
|
||||||
|
VK7MO, and Roger, W3SZ. (See "10 GHz Terrestrial with Q65" in DUBUS
|
||||||
|
Vol 1/2021 page 64.) Decodes of type 'q3' may now include
|
||||||
|
corrections for frequency drift.
|
||||||
|
|
||||||
|
- Repair a defect that failed to pre-load the DE and DX calls to the
|
||||||
|
hash lookup tables in the Q65 decoder.
|
||||||
|
|
||||||
|
- Repair standard message Tx4 and Tx5 generation in Q65 mode when
|
||||||
|
using a non-standard call.
|
||||||
|
|
||||||
|
- Repair a defect in generation of the standard Tx2 JT65 message in
|
||||||
|
EME mode when using a compound call.
|
||||||
|
|
||||||
|
- Repair a defect when decoding 77-bit type 4 non-standard call
|
||||||
|
message.
|
||||||
|
|
||||||
|
- Repair a defect that could cause a crash when switching from Q65 to
|
||||||
|
JT65 mode and attempting a double-click decode.
|
||||||
|
|
||||||
|
- Enable 'q3' AP decoding in Q65 mode for messages containing a
|
||||||
|
non-standard call.
|
||||||
|
|
||||||
|
- Repair a defect that required a blank DX Grid to achieve Q65 'q3'
|
||||||
|
decodes of messages containing a non-standard call.
|
||||||
|
|
||||||
|
- Repair the logic that sets parameters for Q65 "Deep" decoding.
|
||||||
|
|
||||||
|
- In Q65 mode, allow 'q2' decodes when MyCall is compound or
|
||||||
|
non-standard.
|
||||||
|
|
||||||
|
- Repair a long-standing defect that could cause a crash when
|
||||||
|
reference spectrum correction is enabled.
|
||||||
|
|
||||||
|
- Updated UI translations from Xavi, EA3W, Oba-san, JA7UDE, and a new
|
||||||
|
translation for Traditional Chinese by Steven, BU2EL.
|
||||||
|
|
||||||
|
- Updated CTY.DAT database, tnx to Jim AD1C
|
||||||
|
|
||||||
|
- Improved main window layout to ensure TxN messages are fully
|
||||||
|
visible.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0
|
||||||
|
Sept 27, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
WSJT-X in this release is nearly identical to that in WSJT-X 2.4.0.
|
||||||
|
The Q65 decoder has been enhanced to measure and compensate for linear
|
||||||
|
frequency drift in Q65 signals. In addition, the Windows installation
|
||||||
|
package now includes version 3.0 of application MAP65 which has Q65
|
||||||
|
support to match and improve on its existing JT65 capabilities.
|
||||||
|
|
||||||
|
See the 2.5.0 release candidate notices below for a summaries of the
|
||||||
|
other changes included in this release. WSJT-X 2.5.0 is bundled with
|
||||||
|
Hamlib version 4.3.1 which includes important regression repairs over
|
||||||
|
the earlier 4.3 release.
|
||||||
|
|
||||||
|
Other changes in the package since WSJT-X 2.5.0-rc6 include the
|
||||||
|
following enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Ensure that CALL3.TXT is not deleted while updating the file (this
|
||||||
|
allows sharing using symlinks to work).
|
||||||
|
- Fix MAP65's generation of Tx3 message for abs(SNR)< 10.
|
||||||
|
|
||||||
|
WSJTX:
|
||||||
|
- Repair a defect that caused CAT errors when using WSPR band hopping
|
||||||
|
and auto tune-up with some Icom rigs.
|
||||||
|
- Ensure that CALL3.TXT is not deleted while updating the file (this
|
||||||
|
allows sharing using symlinks to work).
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc6
|
||||||
|
Sept 6, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc5 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- There are no functional changes to MAP65 in this release.
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a file handle leak in wsprd (tnx Phil, KA9Q).
|
||||||
|
- Better handling of the Tx1 buttons when changing special operating
|
||||||
|
modes.
|
||||||
|
- Q65 mode now supports contest special operating modes.
|
||||||
|
- Repair an issue when non-ASCII characters used in account names.
|
||||||
|
- Repair a regression that prevented WSPR band-hopping working when
|
||||||
|
the Tx percentage is zero.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc5
|
||||||
|
Aug 5, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc4 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- When you double-click on lower waterfall, Ftol is set to 100
|
||||||
|
only if it is currently set to a higher value.
|
||||||
|
- Early decoding pass is skipped when data are read from disk.
|
||||||
|
- Duplicate decodes are suppressed only when at the same frequency.
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a regression that caused some messages involving compound
|
||||||
|
or nonstandard callsigns to be encoded as free text
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc4
|
||||||
|
Aug 2, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc3 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Suppress display of duplicate decodes
|
||||||
|
- Increase the length of .tf2 & .iq files to 56 s
|
||||||
|
- Implements an early decoding pass at 52 s
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a defect in CALL3.TXT lookups that incorrectly matched
|
||||||
|
partial calls
|
||||||
|
- Instructions in macOS ReadMe.txt to suppress App Nap energy saving
|
||||||
|
- Revised User Guide using FT8 mode for the basic tutorial
|
||||||
|
- Allow contest and FD operating in Q65 mode
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc3
|
||||||
|
Jul 5, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc2 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Correct two defects that could cause "hung decoder" status
|
||||||
|
- Translate reported frequencies so that |DF| <= 500 Hz for Q65
|
||||||
|
decodes.
|
||||||
|
- Provide access to Release Notes from the Help menu
|
||||||
|
- Correct the formatting of Q65 messages to livecq
|
||||||
|
- Repair an Xpol polarization finding hang
|
||||||
|
- Build MAP65 to start without an attached console
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a long standing defect that caused UDP Protocol Heartbeat
|
||||||
|
messages to not be sent when no other intervening messages are
|
||||||
|
sent.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.5.0-rc2
|
Release: WSJT-X 2.5.0-rc2
|
||||||
|
@ -52,6 +420,7 @@ WSJT-X (including the decoder for Q65 used by MAP65):
|
||||||
series rigs, and support for the Icom IC-575 rig.
|
series rigs, and support for the Icom IC-575 rig.
|
||||||
- Updated CTY.DAT database
|
- Updated CTY.DAT database
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.5.0-rc1
|
Release: WSJT-X 2.5.0-rc1
|
||||||
Jun 3, 2021
|
Jun 3, 2021
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -406,7 +775,6 @@ release candidate.
|
||||||
- Several updates to international UI translations.
|
- Several updates to international UI translations.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.3.0-rc2
|
Release: WSJT-X 2.3.0-rc2
|
||||||
Nov 16, 2020
|
Nov 16, 2020
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -871,6 +1239,7 @@ prior v2.1.0 release.
|
||||||
- Fix a production issue with the macOS tool chain that generated
|
- Fix a production issue with the macOS tool chain that generated
|
||||||
broken executables.
|
broken executables.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.1
|
Release: WSJT-X 2.1
|
||||||
July 15, 2019
|
July 15, 2019
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -940,6 +1309,7 @@ feedback to guide future development.
|
||||||
*Note* this release is not for general public release and we request
|
*Note* this release is not for general public release and we request
|
||||||
that it is not distributed.
|
that it is not distributed.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.1.0-rc1
|
Release: WSJT-X 2.1.0-rc1
|
||||||
March 25, 2019
|
March 25, 2019
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -1073,6 +1443,7 @@ Some details of changes since WSJT-X-rc5 include the following:
|
||||||
- Update the WSJT-X User Guide to v2.0 (more to come...)
|
- Update the WSJT-X User Guide to v2.0 (more to come...)
|
||||||
- Update cty.dat
|
- Update cty.dat
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.0-rc5
|
Release: WSJT-X 2.0-rc5
|
||||||
November 26, 2018
|
November 26, 2018
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -1304,7 +1675,6 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
|
||||||
to be CAT controlled by WSJT-X.
|
to be CAT controlled by WSJT-X.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0-rc2
|
Release: WSJT-X Version 1.9.0-rc2
|
||||||
February 26, 2018
|
February 26, 2018
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -1474,8 +1844,6 @@ message from populating the Tx message boxes.
|
||||||
- Fix an issue with editing IARU regions in the working frequencies table.
|
- Fix an issue with editing IARU regions in the working frequencies table.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0-rc2
|
Release: WSJT-X Version 1.8.0-rc2
|
||||||
September 2, 2017
|
September 2, 2017
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
|
@ -71,12 +71,12 @@ public:
|
||||||
void heartbeat ();
|
void heartbeat ();
|
||||||
void closedown ();
|
void closedown ();
|
||||||
StreamStatus check_status (QDataStream const&) const;
|
StreamStatus check_status (QDataStream const&) const;
|
||||||
void send_message (QByteArray const&, bool queue_if_pending = true);
|
void send_message (QByteArray const&, bool queue_if_pending = true, bool allow_duplicates = false);
|
||||||
void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true)
|
void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true, bool allow_duplicates = false)
|
||||||
{
|
{
|
||||||
if (OK == check_status (out))
|
if (OK == check_status (out))
|
||||||
{
|
{
|
||||||
send_message (message, queue_if_pending);
|
send_message (message, queue_if_pending, allow_duplicates);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -197,7 +197,7 @@ void MessageClient::impl::start ()
|
||||||
// clear any backlog
|
// clear any backlog
|
||||||
while (pending_messages_.size ())
|
while (pending_messages_.size ())
|
||||||
{
|
{
|
||||||
send_message (pending_messages_.dequeue (), false);
|
send_message (pending_messages_.dequeue (), true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,7 +429,7 @@ void MessageClient::impl::heartbeat ()
|
||||||
out << NetworkMessage::Builder::schema_number // maximum schema number accepted
|
out << NetworkMessage::Builder::schema_number // maximum schema number accepted
|
||||||
<< version_.toUtf8 () << revision_.toUtf8 ();
|
<< version_.toUtf8 () << revision_.toUtf8 ();
|
||||||
TRACE_UDP ("schema:" << schema_ << "max schema:" << NetworkMessage::Builder::schema_number << "version:" << version_ << "revision:" << revision_);
|
TRACE_UDP ("schema:" << schema_ << "max schema:" << NetworkMessage::Builder::schema_number << "version:" << version_ << "revision:" << revision_);
|
||||||
send_message (out, message, false);
|
send_message (out, message, false, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,13 +444,13 @@ void MessageClient::impl::closedown ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending)
|
void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending, bool allow_duplicates)
|
||||||
{
|
{
|
||||||
if (server_port_)
|
if (server_port_)
|
||||||
{
|
{
|
||||||
if (!server_.isNull ())
|
if (!server_.isNull ())
|
||||||
{
|
{
|
||||||
if (message != last_message_) // avoid duplicates
|
if (allow_duplicates || message != last_message_) // avoid duplicates
|
||||||
{
|
{
|
||||||
if (is_multicast_address (server_))
|
if (is_multicast_address (server_))
|
||||||
{
|
{
|
||||||
|
|
47
README
|
@ -13,26 +13,28 @@
|
||||||
|
|
||||||
Copyright (C) 2001 - 2021 by Joe Taylor, K1JT.
|
Copyright (C) 2001 - 2021 by Joe Taylor, K1JT.
|
||||||
|
|
||||||
WSJT-X Version 2.3 offers ten different protocols or modes: FT4, FT8,
|
WSJT-X Version 2.5 offers eleven different protocols or modes: FT4,
|
||||||
JT4, JT9, JT65, QRA64, FST4, ISCAT, MSK144, WSPR, FST4W, and Echo. The
|
FT8, JT4, JT9, JT65, Q65, FST4, MSK144, WSPR, FST4W, and Echo. The
|
||||||
first seven are designed for making reliable QSOs under weak-signal
|
first seven are designed for making reliable QSOs under weak-signal
|
||||||
conditions. They use nearly identical message structure and source
|
conditions. They use nearly identical message structure and source
|
||||||
encoding. JT65 and QRA64 were designed for EME (“moonbounce”) on the
|
encoding. JT65 and Q65 were designed for EME (“moonbounce”), but not
|
||||||
VHF/UHF bands and have also proven very effective for worldwide QRP
|
limited to just that propagation path, on the VHF/UHF bands and JT65
|
||||||
communication on the HF bands. QRA64 has a number of advantages over
|
has also proven very effective for worldwide QRP communication on the
|
||||||
JT65, including better performance on the very weakest signals. We
|
HF bands. Q65 has a number of advantages over JT65, including better
|
||||||
imagine that over time it may replace JT65 for EME use. JT9 was
|
performance on the very weakest signals and variants with different
|
||||||
originally designed for the LF, MF, and lower HF bands. Its submode
|
T/R period lengths. We imagine that over time it may replace JT65 for
|
||||||
JT9A is 2 dB more sensitive than JT65 while using less than 10% of the
|
EME use, it has also proved to be very effective for iono-scatter
|
||||||
bandwidth. JT4 offers a wide variety of tone spacings and has proven
|
paths on 6m. JT9 was originally designed for the LF, MF, and lower HF
|
||||||
highly effective for EME on microwave bands up to 24 GHz. These four
|
bands. Its submode JT9A is 2 dB more sensitive than JT65 while using
|
||||||
“slow” modes use one-minute timed sequences of alternating
|
less than 10% of the bandwidth. JT4 offers a wide variety of tone
|
||||||
transmission and reception, so a minimal QSO takes four to six minutes
|
spacings and has proven highly effective for EME on microwave bands up
|
||||||
— two or three transmissions by each station, one sending in odd UTC
|
to 24 GHz. These four “slow” modes use one-minute timed sequences of
|
||||||
minutes and the other even. FT8 is operationally similar but four
|
alternating transmission and reception, so a minimal QSO takes four to
|
||||||
times faster (15-second T/R sequences) and less sensitive by a few
|
six minutes — two or three transmissions by each station, one sending
|
||||||
dB. FT4 is faster still (7.5 s T/R sequences) and especially well
|
in odd UTC minutes and the other even. FT8 is operationally similar
|
||||||
suited for radio contesting. On the HF bands, world-wide QSOs are
|
but four times faster (15-second T/R sequences) and less sensitive by
|
||||||
|
a few dB. FT4 is faster still (7.5 s T/R sequences) and especially
|
||||||
|
well suited for radio contesting. On the HF bands, world-wide QSOs are
|
||||||
possible with any of these modes using power levels of a few watts (or
|
possible with any of these modes using power levels of a few watts (or
|
||||||
even milliwatts) and compromise antennas. QSOs are possible at signal
|
even milliwatts) and compromise antennas. QSOs are possible at signal
|
||||||
levels 10 to 15 dB below those required for CW. FST4 has similarities
|
levels 10 to 15 dB below those required for CW. FST4 has similarities
|
||||||
|
@ -48,14 +50,13 @@ once per transmission. All fast modes in WSJT-X send their message
|
||||||
frames repeatedly, as many times as will fit into the Tx sequence
|
frames repeatedly, as many times as will fit into the Tx sequence
|
||||||
length.
|
length.
|
||||||
|
|
||||||
ISCAT, MSK144, and optionally submodes JT9E-H are “fast” protocols
|
MSK144, and optionally submodes JT9E-H are “fast” protocols designed
|
||||||
designed to take advantage of brief signal enhancements from ionized
|
to take advantage of brief signal enhancements from ionized meteor
|
||||||
meteor trails, aircraft scatter, and other types of scatter
|
trails, aircraft scatter, and other types of scatter
|
||||||
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
|
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
|
||||||
duration. User messages are transmitted repeatedly at high rate (up to
|
duration. User messages are transmitted repeatedly at high rate (up to
|
||||||
250 characters per second, for MSK144) to make good use of the
|
250 characters per second, for MSK144) to make good use of the
|
||||||
shortest meteor-trail reflections or “pings”. ISCAT uses free-form
|
shortest meteor-trail reflections or “pings”. MSK144 uses the same
|
||||||
messages up to 28 characters long, while MSK144 uses the same
|
|
||||||
structured messages as the slow modes and optionally an abbreviated
|
structured messages as the slow modes and optionally an abbreviated
|
||||||
format with hashed callsigns.
|
format with hashed callsigns.
|
||||||
|
|
||||||
|
|
32
Radio.cpp
|
@ -42,14 +42,27 @@ namespace Radio
|
||||||
value = v.toDouble ();
|
value = v.toDouble ();
|
||||||
if (ok) *ok = true;
|
if (ok) *ok = true;
|
||||||
}
|
}
|
||||||
|
if (ok && !*ok)
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return frequency (value, scale, ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
Frequency frequency (double value, int scale, bool * ok)
|
||||||
|
{
|
||||||
value *= std::pow (10., scale);
|
value *= std::pow (10., scale);
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
if (value < 0. || value > std::numeric_limits<Frequency>::max ())
|
if (value < 0. || value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
|
||||||
{
|
{
|
||||||
value = 0.;
|
value = 0.;
|
||||||
*ok = false;
|
*ok = false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*ok = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return std::llround (value);
|
return std::llround (value);
|
||||||
}
|
}
|
||||||
|
@ -66,15 +79,28 @@ namespace Radio
|
||||||
value = v.toDouble ();
|
value = v.toDouble ();
|
||||||
if (ok) *ok = true;
|
if (ok) *ok = true;
|
||||||
}
|
}
|
||||||
|
if (ok && !*ok)
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return frequency_delta (value, scale, ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
FrequencyDelta frequency_delta (double value, int scale, bool * ok)
|
||||||
|
{
|
||||||
value *= std::pow (10., scale);
|
value *= std::pow (10., scale);
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
if (value < -std::numeric_limits<Frequency>::max ()
|
if (value < static_cast<double>(std::numeric_limits<Frequency>::min ())
|
||||||
|| value > std::numeric_limits<Frequency>::max ())
|
|| value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
|
||||||
{
|
{
|
||||||
value = 0.;
|
value = 0.;
|
||||||
*ok = false;
|
*ok = false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*ok = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return std::llround (value);
|
return std::llround (value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,10 +34,12 @@ namespace Radio
|
||||||
// QVariant argument is convertible to double and is assumed to
|
// QVariant argument is convertible to double and is assumed to
|
||||||
// be scaled by (10 ** -scale).
|
// be scaled by (10 ** -scale).
|
||||||
//
|
//
|
||||||
Frequency UDP_EXPORT frequency (QVariant const&, int scale,
|
Frequency UDP_EXPORT frequency (QVariant const&, int scale = 0,
|
||||||
bool * ok = nullptr, QLocale const& = QLocale ());
|
bool * ok = nullptr, QLocale const& = QLocale ());
|
||||||
FrequencyDelta UDP_EXPORT frequency_delta (QVariant const&, int scale,
|
FrequencyDelta UDP_EXPORT frequency_delta (QVariant const&, int scale = 0,
|
||||||
bool * ok = nullptr, QLocale const& = QLocale ());
|
bool * ok = nullptr, QLocale const& = QLocale ());
|
||||||
|
Frequency UDP_EXPORT frequency (double, int scale = 0, bool * ok = nullptr);
|
||||||
|
FrequencyDelta UDP_EXPORT frequency_delta (double, int scale = 0, bool * ok = nullptr);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Frequency type formatting
|
// Frequency type formatting
|
||||||
|
|
|
@ -9,7 +9,376 @@
|
||||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||||
|
|
||||||
|
|
||||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
|
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||||
|
|
||||||
|
Release: WSJT-X 2.6.0-rc2
|
||||||
|
July 21, 2022
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
|
||||||
|
well as some bug fixes.
|
||||||
|
|
||||||
|
- The "Measure" function in Echo mode now uses the computed Doppler
|
||||||
|
spread for DX grid, when available. This feature is especially
|
||||||
|
helpful for microwave EME tests, enabling accurate measurement of
|
||||||
|
SNR for a DX station.
|
||||||
|
|
||||||
|
- Settings for T/R period and Submode are now remembered by mode when
|
||||||
|
you switch directly between (for example) MSK144-15, Q65-60A,
|
||||||
|
JT65C, or FST4-120.
|
||||||
|
|
||||||
|
- Tx and Rx audio frequencies are remembered and restored when you
|
||||||
|
return from a mode that sets a default frequency of 1500 Hz
|
||||||
|
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
|
||||||
|
FT4, FT8, Q65, JT65, or FST4.
|
||||||
|
|
||||||
|
- QSOs in the Contest Log can now be displayed in increasing or
|
||||||
|
decreasing order of logged time. By default the log is scrolled to
|
||||||
|
the latest logged QSO, ready for insertion of a new contact. The
|
||||||
|
total number of QSOs in the Contest Log is displayed at bottom left
|
||||||
|
of its window.
|
||||||
|
|
||||||
|
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
|
||||||
|
|
||||||
|
- Layout of mode buttons has been optimized for 4K screens.
|
||||||
|
|
||||||
|
- Display of Keyboard Shortcuts has been updated.
|
||||||
|
|
||||||
|
- The OK button now has default focus in the LogQSO dialog window.
|
||||||
|
You may just hit Enter to log the QSO.
|
||||||
|
|
||||||
|
- Bug fix: The Tx Freq spinbox remained red when coming back from
|
||||||
|
some Q65 submodes. Corrected.
|
||||||
|
|
||||||
|
- Hamlib bug fixes: make sure that VFOB is selected when required on
|
||||||
|
some rigs (e.g. IC7610, IC7100), and others.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.6.0-rc1
|
||||||
|
June 20, 2022
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
|
||||||
|
International Digital Contest; performance enhancements for FT8, Q65,
|
||||||
|
and EME Echo mode; new controls and options on the GUI; and several
|
||||||
|
bug fixes.
|
||||||
|
|
||||||
|
In program WSJT-X:
|
||||||
|
|
||||||
|
- Improved decoding for FT8: additional messages are marked 'a7'
|
||||||
|
|
||||||
|
- Improved decoding for Q65 when AP is in use
|
||||||
|
|
||||||
|
- Optional new "Active Stations" window and other features
|
||||||
|
supporting ARRL International Digital Contest
|
||||||
|
|
||||||
|
- Accurate SNR measurements in Echo mode, including large Doppler
|
||||||
|
spreads
|
||||||
|
|
||||||
|
- Add mode selection buttons on main window for FT4, FT8, JT65,
|
||||||
|
MSK144, and Q65
|
||||||
|
|
||||||
|
- Add a button to toggle FT8's Hound mode ON or OFF
|
||||||
|
|
||||||
|
- Add a "Clr Avg" button for Echo mode
|
||||||
|
|
||||||
|
- Add optional highlighting of DX Call and DX Grid
|
||||||
|
|
||||||
|
- Add optional highlighting of messages containing RR73 or 73
|
||||||
|
|
||||||
|
- New options for writing to ALL.TXT: split the file yearly, monthly,
|
||||||
|
or disable writing altogether
|
||||||
|
|
||||||
|
- Add Russian to available translations of user interface
|
||||||
|
|
||||||
|
- Add a 90 s Tune watchdog with optional disable
|
||||||
|
|
||||||
|
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
|
||||||
|
Hold Tx Freq is enabled
|
||||||
|
|
||||||
|
- Suppress transmission of blank messages
|
||||||
|
|
||||||
|
- Suppress self-spotting when running multiple instances
|
||||||
|
|
||||||
|
- Correct the handling of messages starting with "CQ xxxx ..."
|
||||||
|
|
||||||
|
- Correct a flaw that could cause Windows to drop audio samples
|
||||||
|
|
||||||
|
- Correct a flaw that could send incorrect frequencies to ALL.TXT
|
||||||
|
and PSK Reporter after a band change
|
||||||
|
|
||||||
|
- Correct the auto-sequencing logic in several specific circumstances
|
||||||
|
|
||||||
|
- Correct a flaw in WSPR mode when handling three-character callsigns
|
||||||
|
|
||||||
|
- Correct a flaw that could cause OmniRig 1.19 or later to set
|
||||||
|
incorrect frequencies after initialization
|
||||||
|
|
||||||
|
- Clean up some ToolTips
|
||||||
|
|
||||||
|
- Fix an inconsistancy in the macOS installation package that caused
|
||||||
|
the pwr slider to behave incorrectly on macOS 12
|
||||||
|
|
||||||
|
In program MAP65 (Windows only):
|
||||||
|
|
||||||
|
- Send additional information to file azel.dat
|
||||||
|
|
||||||
|
- Allow optional scaling of digital I/Q data
|
||||||
|
|
||||||
|
- Suppress a bounds error caused by too-wide setting of display
|
||||||
|
bandwidth
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.4
|
||||||
|
Dec 28, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This is mostly a bug fix release. It has the following changes since
|
||||||
|
release 2.5.3:
|
||||||
|
|
||||||
|
WSJTX:
|
||||||
|
- Repair a defect that caused occasional crashes when in QSO with
|
||||||
|
stations using nonstandard callsigns.
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
|
||||||
|
user.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.3
|
||||||
|
Dec 7, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This release has the following changes since release 2.5.2:
|
||||||
|
|
||||||
|
- Add a note in memory of G4WJS to the About window
|
||||||
|
|
||||||
|
- Add a simple $DXCALL macro capability for Tx messages, and update
|
||||||
|
the User Guide accordingly
|
||||||
|
|
||||||
|
- Ensure that MAIN VFO is used for receiving on rigs that require it
|
||||||
|
|
||||||
|
- Repair a defect in reporting low-confidence decodes to PskReporter
|
||||||
|
|
||||||
|
- Updated CTY.DAT database, tnx to Jim AD1C
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.2
|
||||||
|
Nov 4, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This is mostly a bug fix release. It has the following changes since
|
||||||
|
release 2.5.1:
|
||||||
|
|
||||||
|
- Repair a longstanding regression that caused signal reports from
|
||||||
|
tail-ended Tx2 messages to be omitted from logged information
|
||||||
|
|
||||||
|
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
|
||||||
|
n3=1 DXpedition mode) in regular 77-bit modes
|
||||||
|
|
||||||
|
- Repair a regression associated with setting the main window width
|
||||||
|
on program startup.
|
||||||
|
|
||||||
|
- Repair a problem with Q65 decodes of type 'q3' for messages of the
|
||||||
|
form "<Call_1> Call_2"
|
||||||
|
|
||||||
|
- Execute code associated with Q65 decodes of type 'q5' only when the
|
||||||
|
Max Drift control is set to 50. This fix prevents
|
||||||
|
double-incrementing of the message averaging counter on the first
|
||||||
|
decoding sequence.
|
||||||
|
|
||||||
|
- Polarization offset 'Dpol' from the astronomical data window is now
|
||||||
|
written to file azel.dat if environment variable
|
||||||
|
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
|
||||||
|
especially useful for EME on the higher microwave bands.
|
||||||
|
|
||||||
|
- The Auto Log QSO option in "Settings->Reporting" now behaves the
|
||||||
|
same as the Prompt to log QSO option when not in a special
|
||||||
|
operating context mode.
|
||||||
|
|
||||||
|
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
|
||||||
|
and is no longer reset to Fast on program startup or when Settings
|
||||||
|
has been opened. The user selection is used for automatic decodes,
|
||||||
|
but Deep is used for any subsequent manual decode attempts.
|
||||||
|
|
||||||
|
- New hamlib code to correct minor flaws in controlling several rigs.
|
||||||
|
|
||||||
|
- Update the Chinese and Hong Kong translations of the user
|
||||||
|
interface.
|
||||||
|
|
||||||
|
- Note that since the WSJT-X v2.5.0 GA release we have not been
|
||||||
|
providing pre-built 32-bit packages for Linux on Intel CPUs, this
|
||||||
|
is due to the mainstream Linux Desktop distributions no longer
|
||||||
|
providing updates for 32-bit only systems. 32-bit WSJT-X can still
|
||||||
|
be built for Linux Intel and is supported at least until some
|
||||||
|
prerequisite package is no longer available.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.1
|
||||||
|
Oct 21, 2021
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This release mainly contains improvements and defect repairs related
|
||||||
|
to Q65 and JT65 modes when used with non-standard and compound
|
||||||
|
calls. Also included is a new feature for microwave aircraft scatter
|
||||||
|
and repairs for defects detected since the 2.5.0 GA release.
|
||||||
|
|
||||||
|
- Improved Q65 support for 10GHz Aircraft Scatter contributed by Rex,
|
||||||
|
VK7MO, and Roger, W3SZ. (See "10 GHz Terrestrial with Q65" in DUBUS
|
||||||
|
Vol 1/2021 page 64.) Decodes of type 'q3' may now include
|
||||||
|
corrections for frequency drift.
|
||||||
|
|
||||||
|
- Repair a defect that failed to pre-load the DE and DX calls to the
|
||||||
|
hash lookup tables in the Q65 decoder.
|
||||||
|
|
||||||
|
- Repair standard message Tx4 and Tx5 generation in Q65 mode when
|
||||||
|
using a non-standard call.
|
||||||
|
|
||||||
|
- Repair a defect in generation of the standard Tx2 JT65 message in
|
||||||
|
EME mode when using a compound call.
|
||||||
|
|
||||||
|
- Repair a defect when decoding 77-bit type 4 non-standard call
|
||||||
|
message.
|
||||||
|
|
||||||
|
- Repair a defect that could cause a crash when switching from Q65 to
|
||||||
|
JT65 mode and attempting a double-click decode.
|
||||||
|
|
||||||
|
- Enable 'q3' AP decoding in Q65 mode for messages containing a
|
||||||
|
non-standard call.
|
||||||
|
|
||||||
|
- Repair a defect that required a blank DX Grid to achieve Q65 'q3'
|
||||||
|
decodes of messages containing a non-standard call.
|
||||||
|
|
||||||
|
- Repair the logic that sets parameters for Q65 "Deep" decoding.
|
||||||
|
|
||||||
|
- In Q65 mode, allow 'q2' decodes when MyCall is compound or
|
||||||
|
non-standard.
|
||||||
|
|
||||||
|
- Repair a long-standing defect that could cause a crash when
|
||||||
|
reference spectrum correction is enabled.
|
||||||
|
|
||||||
|
- Updated UI translations from Xavi, EA3W, Oba-san, JA7UDE, and a new
|
||||||
|
translation for Traditional Chinese by Steven, BU2EL.
|
||||||
|
|
||||||
|
- Updated CTY.DAT database, tnx to Jim AD1C
|
||||||
|
|
||||||
|
- Improved main window layout to ensure TxN messages are fully
|
||||||
|
visible.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0
|
||||||
|
Sept 27, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
WSJT-X in this release is nearly identical to that in WSJT-X 2.4.0.
|
||||||
|
The Q65 decoder has been enhanced to measure and compensate for linear
|
||||||
|
frequency drift in Q65 signals. In addition, the Windows installation
|
||||||
|
package now includes version 3.0 of application MAP65 which has Q65
|
||||||
|
support to match and improve on its existing JT65 capabilities.
|
||||||
|
|
||||||
|
See the 2.5.0 release candidate notices below for a summaries of the
|
||||||
|
other changes included in this release. WSJT-X 2.5.0 is bundled with
|
||||||
|
Hamlib version 4.3.1 which includes important regression repairs over
|
||||||
|
the earlier 4.3 release.
|
||||||
|
|
||||||
|
Other changes in the package since WSJT-X 2.5.0-rc6 include the
|
||||||
|
following enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Ensure that CALL3.TXT is not deleted while updating the file (this
|
||||||
|
allows sharing using symlinks to work).
|
||||||
|
- Fix MAP65's generation of Tx3 message for abs(SNR)< 10.
|
||||||
|
|
||||||
|
WSJTX:
|
||||||
|
- Repair a defect that caused CAT errors when using WSPR band hopping
|
||||||
|
and auto tune-up with some Icom rigs.
|
||||||
|
- Ensure that CALL3.TXT is not deleted while updating the file (this
|
||||||
|
allows sharing using symlinks to work).
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc6
|
||||||
|
Sept 6, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc5 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- There are no functional changes to MAP65 in this release.
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a file handle leak in wsprd (tnx Phil, KA9Q).
|
||||||
|
- Better handling of the Tx1 buttons when changing special operating
|
||||||
|
modes.
|
||||||
|
- Q65 mode now supports contest special operating modes.
|
||||||
|
- Repair an issue when non-ASCII characters used in account names.
|
||||||
|
- Repair a regression that prevented WSPR band-hopping working when
|
||||||
|
the Tx percentage is zero.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc5
|
||||||
|
Aug 5, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc4 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- When you double-click on lower waterfall, Ftol is set to 100
|
||||||
|
only if it is currently set to a higher value.
|
||||||
|
- Early decoding pass is skipped when data are read from disk.
|
||||||
|
- Duplicate decodes are suppressed only when at the same frequency.
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a regression that caused some messages involving compound
|
||||||
|
or nonstandard callsigns to be encoded as free text
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc4
|
||||||
|
Aug 1, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc3 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Suppress display of duplicate decodes
|
||||||
|
- Increase the length of .tf2 & .iq files to 56 s
|
||||||
|
- Implement an early decoding pass at 52 s
|
||||||
|
- Clean up the output written to map65_rx.log
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a defect in CALL3.TXT lookups that incorrectly matched
|
||||||
|
partial calls
|
||||||
|
- Instructions in macOS ReadMe.txt to suppress App Nap energy saving
|
||||||
|
- Revised User Guide using FT8 mode for the basic tutorial
|
||||||
|
- Allow contest and FD operating in Q65 mode
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.5.0-rc3
|
||||||
|
Jul 5, 2021
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
|
||||||
|
in the package since WSJT-X 2.5.0-rc2 include the following
|
||||||
|
enhancements and defect repairs:
|
||||||
|
|
||||||
|
MAP65:
|
||||||
|
- Correct two defects that could cause "hung decoder" status
|
||||||
|
- Translate reported frequencies so that |DF| <= 500 Hz for Q65
|
||||||
|
decodes.
|
||||||
|
- Provide access to Release Notes from the Help menu
|
||||||
|
- Correct the formatting of Q65 messages to livecq
|
||||||
|
- Repair an Xpol polarization finding hang
|
||||||
|
- Build MAP65 to start without an attached console
|
||||||
|
|
||||||
|
WSJT-X:
|
||||||
|
- Repair a long standing defect that caused UDP Protocol Heartbeat
|
||||||
|
messages to not be sent when no other intervening messages are
|
||||||
|
sent.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.5.0-rc2
|
Release: WSJT-X 2.5.0-rc2
|
||||||
|
@ -23,7 +392,7 @@ enhancements and defect repairs:
|
||||||
MAP65:
|
MAP65:
|
||||||
- Compute polarization angle for Xpol systems and display to nearest
|
- Compute polarization angle for Xpol systems and display to nearest
|
||||||
degree
|
degree
|
||||||
- Compute and display the recommended Tx polarization
|
- Compute and display the recommended Tx polarization
|
||||||
- Protect against Fortran bounds errors in several places
|
- Protect against Fortran bounds errors in several places
|
||||||
- Insert leading 0 when needed in UTC hours and minutes on waterfall
|
- Insert leading 0 when needed in UTC hours and minutes on waterfall
|
||||||
- Wideband Q65 synchronization corrected to include single-polarization
|
- Wideband Q65 synchronization corrected to include single-polarization
|
||||||
|
@ -52,6 +421,7 @@ WSJT-X (including the decoder for Q65 used by MAP65):
|
||||||
series rigs, and support for the Icom IC-575 rig.
|
series rigs, and support for the Icom IC-575 rig.
|
||||||
- Updated CTY.DAT database
|
- Updated CTY.DAT database
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.5.0-rc1
|
Release: WSJT-X 2.5.0-rc1
|
||||||
Jun 3, 2021
|
Jun 3, 2021
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -406,7 +776,6 @@ release candidate.
|
||||||
- Several updates to international UI translations.
|
- Several updates to international UI translations.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.3.0-rc2
|
Release: WSJT-X 2.3.0-rc2
|
||||||
Nov 16, 2020
|
Nov 16, 2020
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -439,7 +808,6 @@ includes some new functionality that missed the RC1 cut off deadline.
|
||||||
choice.
|
choice.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.3.0-rc1
|
Release: WSJT-X 2.3.0-rc1
|
||||||
Sept 28, 2020
|
Sept 28, 2020
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -872,6 +1240,7 @@ prior v2.1.0 release.
|
||||||
- Fix a production issue with the macOS tool chain that generated
|
- Fix a production issue with the macOS tool chain that generated
|
||||||
broken executables.
|
broken executables.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.1
|
Release: WSJT-X 2.1
|
||||||
July 15, 2019
|
July 15, 2019
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -893,6 +1262,7 @@ There are numerous minor enhancements and bug fixes.
|
||||||
We now provide a separate installation package for 64-bit Windows 7
|
We now provide a separate installation package for 64-bit Windows 7
|
||||||
and later, with significant improvements in decoding speed.
|
and later, with significant improvements in decoding speed.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.1.0-rc7
|
Release: WSJT-X 2.1.0-rc7
|
||||||
June 3, 2019
|
June 3, 2019
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -1023,6 +1393,7 @@ feedback to guide future development.
|
||||||
*Note* this release is not for general public release and we request
|
*Note* this release is not for general public release and we request
|
||||||
that it is not distributed.
|
that it is not distributed.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.1.0-rc1
|
Release: WSJT-X 2.1.0-rc1
|
||||||
March 25, 2019
|
March 25, 2019
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -1156,6 +1527,7 @@ Some details of changes since WSJT-X-rc5 include the following:
|
||||||
- Update the WSJT-X User Guide to v2.0 (more to come...)
|
- Update the WSJT-X User Guide to v2.0 (more to come...)
|
||||||
- Update cty.dat
|
- Update cty.dat
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.0-rc5
|
Release: WSJT-X 2.0-rc5
|
||||||
November 26, 2018
|
November 26, 2018
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -1385,7 +1757,6 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
|
||||||
to be CAT controlled by WSJT-X.
|
to be CAT controlled by WSJT-X.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0-rc2
|
Release: WSJT-X Version 1.9.0-rc2
|
||||||
February 26, 2018
|
February 26, 2018
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -1555,8 +1926,6 @@ message from populating the Tx message boxes.
|
||||||
- Fix an issue with editing IARU regions in the working frequencies table.
|
- Fix an issue with editing IARU regions in the working frequencies table.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0-rc2
|
Release: WSJT-X Version 1.8.0-rc2
|
||||||
September 2, 2017
|
September 2, 2017
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
|
@ -385,7 +385,7 @@ auto DXLabSuiteCommanderTransceiver::get_mode () -> MODE
|
||||||
|
|
||||||
void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
|
void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
|
||||||
{
|
{
|
||||||
Q_ASSERT (commander_);
|
if (!commander_) return;
|
||||||
|
|
||||||
CAT_TRACE (cmd);
|
CAT_TRACE (cmd);
|
||||||
|
|
||||||
|
@ -398,7 +398,7 @@ void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
|
||||||
|
|
||||||
QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
|
QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
|
||||||
{
|
{
|
||||||
Q_ASSERT (commander_);
|
if (!commander_) return QString {};
|
||||||
|
|
||||||
if (!write_to_port (cmd))
|
if (!write_to_port (cmd))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1005,7 +1005,7 @@ void HRDTransceiver::do_poll ()
|
||||||
|
|
||||||
QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
|
QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
|
||||||
{
|
{
|
||||||
Q_ASSERT (hrd_);
|
if (!hrd_) return QString {};
|
||||||
|
|
||||||
QString result;
|
QString result;
|
||||||
|
|
||||||
|
|
|
@ -882,7 +882,12 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
|
||||||
{
|
{
|
||||||
// for the 1st time as a band change may cause a recalled mode to be
|
// for the 1st time as a band change may cause a recalled mode to be
|
||||||
// set
|
// set
|
||||||
m_->error_check (rig_set_freq (m_->rig_.data (), RIG_VFO_CURR, f), tr ("setting frequency"));
|
vfo_t target_vfo = RIG_VFO_CURR;
|
||||||
|
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
|
||||||
|
{
|
||||||
|
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
|
||||||
|
}
|
||||||
|
m_->error_check (rig_set_freq (m_->rig_.data (), target_vfo, f), tr ("setting frequency"));
|
||||||
update_rx_frequency (f);
|
update_rx_frequency (f);
|
||||||
|
|
||||||
if (m_->mode_query_works_ && UNK != m)
|
if (m_->mode_query_works_ && UNK != m)
|
||||||
|
@ -890,13 +895,13 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
|
||||||
rmode_t current_mode;
|
rmode_t current_mode;
|
||||||
pbwidth_t current_width;
|
pbwidth_t current_width;
|
||||||
auto new_mode = m_->map_mode (m);
|
auto new_mode = m_->map_mode (m);
|
||||||
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
||||||
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
|
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
|
||||||
|
|
||||||
if (new_mode != current_mode)
|
if (new_mode != current_mode)
|
||||||
{
|
{
|
||||||
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
||||||
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||||
|
|
||||||
// for the 2nd time because a mode change may have caused a
|
// for the 2nd time because a mode change may have caused a
|
||||||
// frequency change
|
// frequency change
|
||||||
|
@ -905,7 +910,8 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
|
||||||
// for the second time because some rigs change mode according
|
// for the second time because some rigs change mode according
|
||||||
// to frequency such as the TS-2000 auto mode setting
|
// to frequency such as the TS-2000 auto mode setting
|
||||||
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
||||||
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||||
|
rig_set_mode (m_->rig_.data (), RIG_VFO_B, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting VFOB mode");
|
||||||
}
|
}
|
||||||
update_mode (m);
|
update_mode (m);
|
||||||
}
|
}
|
||||||
|
@ -1037,16 +1043,22 @@ void HamlibTransceiver::do_mode (MODE mode)
|
||||||
pbwidth_t current_width;
|
pbwidth_t current_width;
|
||||||
auto new_mode = m_->map_mode (mode);
|
auto new_mode = m_->map_mode (mode);
|
||||||
|
|
||||||
|
vfo_t target_vfo = RIG_VFO_CURR;
|
||||||
|
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
|
||||||
|
{
|
||||||
|
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
|
||||||
|
}
|
||||||
|
|
||||||
// only change when receiving or simplex if direct VFO addressing unavailable
|
// only change when receiving or simplex if direct VFO addressing unavailable
|
||||||
if (!(state ().ptt () && state ().split () && m_->one_VFO_))
|
if (!(state ().ptt () && state ().split () && m_->one_VFO_))
|
||||||
{
|
{
|
||||||
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
||||||
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
|
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
|
||||||
|
|
||||||
if (new_mode != current_mode)
|
if (new_mode != current_mode)
|
||||||
{
|
{
|
||||||
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
|
||||||
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1128,7 +1140,7 @@ void HamlibTransceiver::do_poll ()
|
||||||
{
|
{
|
||||||
m_->error_check (rig_get_freq (m_->rig_.data (), RIG_VFO_CURR, &f), tr ("getting current VFO frequency"));
|
m_->error_check (rig_get_freq (m_->rig_.data (), RIG_VFO_CURR, &f), tr ("getting current VFO frequency"));
|
||||||
f = std::round (f);
|
f = std::round (f);
|
||||||
CAT_TRACE ("rig_get_freq frequency=" << f);
|
CAT_TRACE ("rig_get_freq frequency=" << Radio::frequency (f));
|
||||||
update_rx_frequency (f);
|
update_rx_frequency (f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,11 +96,11 @@ void OmniRigTransceiver::register_transceivers (logger_type *,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
OmniRigTransceiver::OmniRigTransceiver (logger_type * logger,
|
OmniRigTransceiver::OmniRigTransceiver (logger_type * the_logger,
|
||||||
std::unique_ptr<TransceiverBase> wrapped,
|
std::unique_ptr<TransceiverBase> wrapped,
|
||||||
RigNumber n, TransceiverFactory::PTTMethod ptt_type,
|
RigNumber n, TransceiverFactory::PTTMethod ptt_type,
|
||||||
QString const& ptt_port, QObject * parent)
|
QString const& ptt_port, QObject * parent)
|
||||||
: TransceiverBase {logger, parent}
|
: TransceiverBase {the_logger, parent}
|
||||||
, wrapped_ {std::move (wrapped)}
|
, wrapped_ {std::move (wrapped)}
|
||||||
, use_for_ptt_ {TransceiverFactory::PTT_method_CAT == ptt_type || ("CAT" == ptt_port && (TransceiverFactory::PTT_method_RTS == ptt_type || TransceiverFactory::PTT_method_DTR == ptt_type))}
|
, use_for_ptt_ {TransceiverFactory::PTT_method_CAT == ptt_type || ("CAT" == ptt_port && (TransceiverFactory::PTT_method_RTS == ptt_type || TransceiverFactory::PTT_method_DTR == ptt_type))}
|
||||||
, ptt_type_ {ptt_type}
|
, ptt_type_ {ptt_type}
|
||||||
|
@ -111,173 +111,131 @@ OmniRigTransceiver::OmniRigTransceiver (logger_type * logger,
|
||||||
, reversed_ {false}
|
, reversed_ {false}
|
||||||
{
|
{
|
||||||
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
|
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
|
||||||
|
CAT_TRACE ("constructed");
|
||||||
}
|
}
|
||||||
|
|
||||||
OmniRigTransceiver::~OmniRigTransceiver ()
|
OmniRigTransceiver::~OmniRigTransceiver ()
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("destroying");
|
||||||
CoUninitialize ();
|
CoUninitialize ();
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns false on time out
|
|
||||||
bool OmniRigTransceiver::await_notification_with_timeout (int timeout)
|
|
||||||
{
|
|
||||||
QEventLoop el;
|
|
||||||
connect (this, &OmniRigTransceiver::notified, &el, [&el] () {el.exit (1);});
|
|
||||||
QTimer::singleShot (timeout, Qt::CoarseTimer, &el, [&el] () {el.exit (0);});
|
|
||||||
return 1 == el.exec (); // wait for notify or timer
|
|
||||||
}
|
|
||||||
|
|
||||||
int OmniRigTransceiver::do_start ()
|
int OmniRigTransceiver::do_start ()
|
||||||
{
|
{
|
||||||
CAT_TRACE ("starting");
|
CAT_TRACE ("starting");
|
||||||
|
try
|
||||||
if (wrapped_) wrapped_->start (0);
|
|
||||||
|
|
||||||
omni_rig_.reset (new OmniRig::OmniRigX {this});
|
|
||||||
if (omni_rig_->isNull ())
|
|
||||||
{
|
{
|
||||||
CAT_ERROR ("failed to start COM server");
|
if (wrapped_) wrapped_->start (0);
|
||||||
throw_qstring (tr ("Failed to start OmniRig COM server"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// COM/OLE exceptions get signaled
|
omni_rig_.reset (new OmniRig::OmniRigX {this});
|
||||||
connect (&*omni_rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
if (omni_rig_->isNull ())
|
||||||
|
{
|
||||||
// IOmniRigXEvent interface signals
|
CAT_ERROR ("failed to start COM server");
|
||||||
connect (&*omni_rig_, SIGNAL (VisibleChange ()), this, SLOT (handle_visible_change ()));
|
throw_qstring (tr ("Failed to start OmniRig COM server"));
|
||||||
connect (&*omni_rig_, SIGNAL (RigTypeChange (int)), this, SLOT (handle_rig_type_change (int)));
|
}
|
||||||
connect (&*omni_rig_, SIGNAL (StatusChange (int)), this, SLOT (handle_status_change (int)));
|
|
||||||
connect (&*omni_rig_, SIGNAL (ParamsChange (int, int)), this, SLOT (handle_params_change (int, int)));
|
|
||||||
connect (&*omni_rig_
|
|
||||||
, SIGNAL (CustomReply (int, QVariant const&, QVariant const&))
|
|
||||||
, this, SLOT (handle_custom_reply (int, QVariant const&, QVariant const&)));
|
|
||||||
|
|
||||||
CAT_INFO ("OmniRig s/w version: " << omni_rig_->SoftwareVersion ()
|
|
||||||
<< "i/f version: " << omni_rig_->InterfaceVersion ());
|
|
||||||
|
|
||||||
// fetch the interface of the RigX CoClass and instantiate a proxy object
|
|
||||||
switch (rig_number_)
|
|
||||||
{
|
|
||||||
case One: rig_.reset (new OmniRig::RigX (omni_rig_->Rig1 ())); break;
|
|
||||||
case Two: rig_.reset (new OmniRig::RigX (omni_rig_->Rig2 ())); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_ASSERT (rig_);
|
|
||||||
Q_ASSERT (!rig_->isNull ());
|
|
||||||
|
|
||||||
// COM/OLE exceptions get signaled
|
|
||||||
connect (&*rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
|
||||||
|
|
||||||
offline_timer_.reset (new QTimer); // instantiate here as
|
|
||||||
// constructor runs in wrong
|
|
||||||
// thread
|
|
||||||
offline_timer_->setSingleShot (true);
|
|
||||||
connect (offline_timer_.data (), &QTimer::timeout, [this] () {offline ("Rig went offline");});
|
|
||||||
|
|
||||||
if (use_for_ptt_ && (TransceiverFactory::PTT_method_DTR == ptt_type_ || TransceiverFactory::PTT_method_RTS == ptt_type_))
|
|
||||||
{
|
|
||||||
// fetch the interface for the serial port if we need it for PTT
|
|
||||||
port_.reset (new OmniRig::PortBits (rig_->PortBits ()));
|
|
||||||
|
|
||||||
Q_ASSERT (port_);
|
|
||||||
Q_ASSERT (!port_->isNull ());
|
|
||||||
|
|
||||||
// COM/OLE exceptions get signaled
|
// COM/OLE exceptions get signaled
|
||||||
connect (&*port_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
connect (&*omni_rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
||||||
|
|
||||||
CAT_TRACE ("OmniRig RTS state: " << port_->Rts ());
|
// IOmniRigXEvent interface signals
|
||||||
|
connect (&*omni_rig_, SIGNAL (VisibleChange ()), this, SLOT (handle_visible_change ()));
|
||||||
|
connect (&*omni_rig_, SIGNAL (RigTypeChange (int)), this, SLOT (handle_rig_type_change (int)));
|
||||||
|
connect (&*omni_rig_, SIGNAL (StatusChange (int)), this, SLOT (handle_status_change (int)));
|
||||||
|
connect (&*omni_rig_, SIGNAL (ParamsChange (int, int)), this, SLOT (handle_params_change (int, int)));
|
||||||
|
connect (&*omni_rig_
|
||||||
|
, SIGNAL (CustomReply (int, QVariant const&, QVariant const&))
|
||||||
|
, this, SLOT (handle_custom_reply (int, QVariant const&, QVariant const&)));
|
||||||
|
|
||||||
// remove locking because it doesn't seem to work properly
|
CAT_INFO ("OmniRig s/w version: " << static_cast<quint16> (omni_rig_->SoftwareVersion () >> 16)
|
||||||
// if (!port_->Lock ()) // try to take exclusive use of the OmniRig serial port for PTT
|
<< '.' << static_cast<quint16> (omni_rig_->SoftwareVersion () & 0xffff)
|
||||||
// {
|
<< " i/f version: " << static_cast<int> (omni_rig_->InterfaceVersion () >> 8 & 0xff)
|
||||||
// CAT_WARNING ("Failed to get exclusive use of serial port for PTT from OmniRig");
|
<< '.' << static_cast<int> (omni_rig_->InterfaceVersion () && 0xff));
|
||||||
// }
|
|
||||||
|
|
||||||
// start off so we don't accidentally key the radio
|
// fetch the interface of the RigX CoClass and instantiate a proxy object
|
||||||
if (TransceiverFactory::PTT_method_DTR == ptt_type_)
|
switch (rig_number_)
|
||||||
{
|
{
|
||||||
port_->SetDtr (false);
|
case One: rig_.reset (new OmniRig::RigX (omni_rig_->Rig1 ())); break;
|
||||||
|
case Two: rig_.reset (new OmniRig::RigX (omni_rig_->Rig2 ())); break;
|
||||||
}
|
}
|
||||||
else // RTS
|
|
||||||
{
|
|
||||||
port_->SetRts (false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rig_type_ = rig_->RigType ();
|
Q_ASSERT (rig_);
|
||||||
readable_params_ = rig_->ReadableParams ();
|
Q_ASSERT (!rig_->isNull ());
|
||||||
writable_params_ = rig_->WriteableParams ();
|
|
||||||
|
|
||||||
CAT_INFO (QString {"OmniRig initial rig type: %1 readable params=0x%2 writable params=0x%3 for rig %4"}
|
// COM/OLE exceptions get signaled
|
||||||
.arg (rig_type_)
|
connect (&*rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
||||||
.arg (readable_params_, 8, 16, QChar ('0'))
|
|
||||||
.arg (writable_params_, 8, 16, QChar ('0'))
|
offline_timer_.reset (new QTimer); // instantiate here as constructor runs in wrong thread
|
||||||
.arg (rig_number_));
|
offline_timer_->setSingleShot (true);
|
||||||
for (int i = 0; i < 5; ++i)
|
connect (offline_timer_.data (), &QTimer::timeout, [this] () {offline ("Rig went offline");});
|
||||||
{
|
|
||||||
if (OmniRig::ST_ONLINE == rig_->Status ())
|
for (int i = 0; i < 5; ++i)
|
||||||
{
|
{
|
||||||
break;
|
// leave some time for Omni-Rig to do its first poll
|
||||||
|
QThread::msleep (250);
|
||||||
|
if (OmniRig::ST_ONLINE == rig_->Status ())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
await_notification_with_timeout (1000);
|
|
||||||
}
|
if (OmniRig::ST_ONLINE != rig_->Status ())
|
||||||
if (OmniRig::ST_ONLINE != rig_->Status ())
|
{
|
||||||
{
|
CAT_ERROR ("rig not online");
|
||||||
throw_qstring ("OmniRig: " + rig_->StatusStr ());
|
throw_qstring ("OmniRig: " + rig_->StatusStr ());
|
||||||
}
|
}
|
||||||
QThread::msleep (500); // leave some time for Omni-Rig to get
|
|
||||||
// the rig status for the 1st. time
|
if (use_for_ptt_ && (TransceiverFactory::PTT_method_DTR == ptt_type_ || TransceiverFactory::PTT_method_RTS == ptt_type_))
|
||||||
auto f = rig_->GetRxFrequency ();
|
{
|
||||||
for (int i = 0; (f == 0) && (i < 5); ++i)
|
// fetch the interface for the serial port if we need it for PTT
|
||||||
{
|
port_.reset (new OmniRig::PortBits (rig_->PortBits ()));
|
||||||
await_notification_with_timeout (1000);
|
|
||||||
f = rig_->GetRxFrequency ();
|
Q_ASSERT (port_);
|
||||||
}
|
Q_ASSERT (!port_->isNull ());
|
||||||
update_rx_frequency (f);
|
|
||||||
int resolution {0};
|
// COM/OLE exceptions get signaled
|
||||||
if (OmniRig::PM_UNKNOWN == rig_->Vfo ()
|
connect (&*port_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
|
||||||
&& (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
|
|
||||||
== (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
|
CAT_TRACE ("OmniRig RTS state: " << port_->Rts ());
|
||||||
{
|
|
||||||
// start with VFO A (probably MAIN) on rigs that we
|
// remove locking because it doesn't seem to work properly
|
||||||
// can't query VFO but can set explicitly
|
// if (!port_->Lock ()) // try to take exclusive use of the OmniRig serial port for PTT
|
||||||
rig_->SetVfo (OmniRig::PM_VFOA);
|
// {
|
||||||
}
|
// CAT_WARNING ("Failed to get exclusive use of serial port for PTT from OmniRig");
|
||||||
f = state ().frequency ();
|
// }
|
||||||
if (f % 10) return resolution; // 1Hz resolution
|
|
||||||
auto test_frequency = f - f % 100 + 55;
|
// start off so we don't accidentally key the radio
|
||||||
if (OmniRig::PM_FREQ & writable_params_)
|
if (TransceiverFactory::PTT_method_DTR == ptt_type_)
|
||||||
{
|
{
|
||||||
rig_->SetFreq (test_frequency);
|
port_->SetDtr (false);
|
||||||
}
|
}
|
||||||
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
|
else // RTS
|
||||||
{
|
{
|
||||||
rig_->SetFreqB (test_frequency);
|
port_->SetRts (false);
|
||||||
}
|
}
|
||||||
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
|
}
|
||||||
{
|
|
||||||
rig_->SetFreqA (test_frequency);
|
rig_type_ = rig_->RigType ();
|
||||||
}
|
readable_params_ = rig_->ReadableParams ();
|
||||||
else
|
writable_params_ = rig_->WriteableParams ();
|
||||||
{
|
|
||||||
throw_qstring (tr ("OmniRig: don't know how to set rig frequency"));
|
CAT_INFO (QString {"OmniRig initial rig type: %1 readable params=0x%2 writable params=0x%3 for rig %4"}
|
||||||
}
|
.arg (rig_type_)
|
||||||
if (!await_notification_with_timeout (1000))
|
.arg (readable_params_, 8, 16, QChar ('0'))
|
||||||
{
|
.arg (writable_params_, 8, 16, QChar ('0'))
|
||||||
CAT_ERROR ("do_start 1: wait timed out");
|
.arg (rig_number_));
|
||||||
throw_qstring (tr ("OmniRig: timeout waiting for update from rig"));
|
update_rx_frequency (rig_->GetRxFrequency ());
|
||||||
}
|
int resolution {0};
|
||||||
switch (rig_->GetRxFrequency () - test_frequency)
|
if (OmniRig::PM_UNKNOWN == rig_->Vfo ()
|
||||||
{
|
&& (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
|
||||||
case -5: resolution = -1; break; // 10Hz truncated
|
== (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
|
||||||
case 5: resolution = 1; break; // 10Hz rounded
|
{
|
||||||
case -15: resolution = -2; break; // 20Hz truncated
|
// start with VFO A (probably MAIN) on rigs that we
|
||||||
case -55: resolution = -2; break; // 100Hz truncated
|
// can't query VFO but can set explicitly
|
||||||
case 45: resolution = 2; break; // 100Hz rounded
|
rig_->SetVfo (OmniRig::PM_VFOA);
|
||||||
}
|
}
|
||||||
if (1 == resolution) // may be 20Hz rounded
|
auto f = state ().frequency ();
|
||||||
{
|
if (f % 10) return resolution; // 1Hz resolution
|
||||||
test_frequency = f - f % 100 + 51;
|
auto test_frequency = f - f % 100 + 55;
|
||||||
if (OmniRig::PM_FREQ & writable_params_)
|
if (OmniRig::PM_FREQ & writable_params_)
|
||||||
{
|
{
|
||||||
rig_->SetFreq (test_frequency);
|
rig_->SetFreq (test_frequency);
|
||||||
|
@ -290,34 +248,78 @@ int OmniRigTransceiver::do_start ()
|
||||||
{
|
{
|
||||||
rig_->SetFreqA (test_frequency);
|
rig_->SetFreqA (test_frequency);
|
||||||
}
|
}
|
||||||
if (!await_notification_with_timeout (2000))
|
else
|
||||||
{
|
{
|
||||||
CAT_ERROR ("do_start 2: wait timed out");
|
throw_qstring (tr ("OmniRig: don't know how to set rig frequency"));
|
||||||
throw_qstring (tr ("OmniRig: timeout waiting for update from rig"));
|
|
||||||
}
|
}
|
||||||
if (9 == rig_->GetRxFrequency () - test_frequency)
|
switch (rig_->GetRxFrequency () - test_frequency)
|
||||||
{
|
{
|
||||||
resolution = 2; // 20Hz rounded
|
case -5: resolution = -1; break; // 10Hz truncated
|
||||||
|
case 5: resolution = 1; break; // 10Hz rounded
|
||||||
|
case -15: resolution = -2; break; // 20Hz truncated
|
||||||
|
case -55: resolution = -2; break; // 100Hz truncated
|
||||||
|
case 45: resolution = 2; break; // 100Hz rounded
|
||||||
}
|
}
|
||||||
|
if (1 == resolution) // may be 20Hz rounded
|
||||||
|
{
|
||||||
|
test_frequency = f - f % 100 + 51;
|
||||||
|
if (OmniRig::PM_FREQ & writable_params_)
|
||||||
|
{
|
||||||
|
rig_->SetFreq (test_frequency);
|
||||||
|
}
|
||||||
|
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
|
||||||
|
{
|
||||||
|
rig_->SetFreqB (test_frequency);
|
||||||
|
}
|
||||||
|
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
|
||||||
|
{
|
||||||
|
rig_->SetFreqA (test_frequency);
|
||||||
|
}
|
||||||
|
if (9 == rig_->GetRxFrequency () - test_frequency)
|
||||||
|
{
|
||||||
|
resolution = 2; // 20Hz rounded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For OmniRig v1.19 or later we need a delay between GetRxFrequency () and SetFreq (f),
|
||||||
|
// otherwise rig QRG stays at f+55 Hz. 200 ms should do job for all modern transceivers.
|
||||||
|
// However, with very slow rigs, QRG may still stay at f+55 Hz. Such rigs should use v1.18.
|
||||||
|
// Due to the asynchronous nature of Omnirig commands, a better solution would be to implement
|
||||||
|
// an event handler for OmniRig's OnParamChange event and read the frequency inside that handler.
|
||||||
|
|
||||||
|
if (OmniRig::PM_FREQ & writable_params_)
|
||||||
|
{
|
||||||
|
QTimer::singleShot (200, [=] {
|
||||||
|
rig_->SetFreq (f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
|
||||||
|
{
|
||||||
|
QTimer::singleShot (200, [=] {
|
||||||
|
rig_->SetFreqB (f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
|
||||||
|
{
|
||||||
|
QTimer::singleShot (200, [=] {
|
||||||
|
rig_->SetFreqA (f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
update_rx_frequency (f);
|
||||||
|
CAT_TRACE ("started");
|
||||||
|
|
||||||
|
return resolution;
|
||||||
}
|
}
|
||||||
if (OmniRig::PM_FREQ & writable_params_)
|
catch (...)
|
||||||
{
|
{
|
||||||
rig_->SetFreq (f);
|
CAT_TRACE ("start threw exception");
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
|
|
||||||
{
|
|
||||||
rig_->SetFreqB (f);
|
|
||||||
}
|
|
||||||
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
|
|
||||||
{
|
|
||||||
rig_->SetFreqA (f);
|
|
||||||
}
|
|
||||||
update_rx_frequency (f);
|
|
||||||
return resolution;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OmniRigTransceiver::do_stop ()
|
void OmniRigTransceiver::do_stop ()
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("stopping");
|
||||||
QThread::msleep (200); // leave some time for pending
|
QThread::msleep (200); // leave some time for pending
|
||||||
// commands at the server end
|
// commands at the server end
|
||||||
|
|
||||||
|
@ -337,6 +339,7 @@ void OmniRigTransceiver::do_stop ()
|
||||||
{
|
{
|
||||||
rig_->clear ();
|
rig_->clear ();
|
||||||
rig_.reset ();
|
rig_.reset ();
|
||||||
|
CAT_TRACE ("rig_ reset");
|
||||||
}
|
}
|
||||||
omni_rig_->clear ();
|
omni_rig_->clear ();
|
||||||
omni_rig_.reset ();
|
omni_rig_.reset ();
|
||||||
|
@ -396,7 +399,6 @@ void OmniRigTransceiver::handle_status_change (int rig_number)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
offline_timer_->stop (); // good to go again
|
offline_timer_->stop (); // good to go again
|
||||||
Q_EMIT notified ();
|
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
|
@ -467,7 +469,6 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params)
|
||||||
|
|
||||||
if (params & OmniRig::PM_FREQ)
|
if (params & OmniRig::PM_FREQ)
|
||||||
{
|
{
|
||||||
CAT_TRACE ("FREQ");
|
|
||||||
need_frequency = true;
|
need_frequency = true;
|
||||||
}
|
}
|
||||||
if (params & OmniRig::PM_FREQA)
|
if (params & OmniRig::PM_FREQA)
|
||||||
|
@ -653,7 +654,6 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params)
|
||||||
}
|
}
|
||||||
CAT_TRACE ("OmniRig params change: state after:" << state ());
|
CAT_TRACE ("OmniRig params change: state after:" << state ());
|
||||||
}
|
}
|
||||||
Q_EMIT notified ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& command, QVariant const& reply)
|
void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& command, QVariant const& reply)
|
||||||
|
@ -710,7 +710,7 @@ void OmniRigTransceiver::do_ptt (bool on)
|
||||||
|
|
||||||
void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
|
void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
|
||||||
{
|
{
|
||||||
CAT_TRACE (f << state ());
|
CAT_TRACE (f << ' ' << state ());
|
||||||
if (!rig_ || rig_->isNull ()) return;
|
if (!rig_ || rig_->isNull ()) return;
|
||||||
if (UNK != m)
|
if (UNK != m)
|
||||||
{
|
{
|
||||||
|
@ -739,7 +739,7 @@ void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
|
||||||
|
|
||||||
void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore*/)
|
void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore*/)
|
||||||
{
|
{
|
||||||
CAT_TRACE (tx << state ());
|
CAT_TRACE (tx << ' ' << state ());
|
||||||
if (!rig_ || rig_->isNull ()) return;
|
if (!rig_ || rig_->isNull ()) return;
|
||||||
bool split {tx != 0};
|
bool split {tx != 0};
|
||||||
if (split)
|
if (split)
|
||||||
|
@ -804,7 +804,7 @@ void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore
|
||||||
|
|
||||||
void OmniRigTransceiver::do_mode (MODE mode)
|
void OmniRigTransceiver::do_mode (MODE mode)
|
||||||
{
|
{
|
||||||
CAT_TRACE (mode << state ());
|
CAT_TRACE (mode << ' ' << state ());
|
||||||
if (!rig_ || rig_->isNull ()) return;
|
if (!rig_ || rig_->isNull ()) return;
|
||||||
// TODO: G4WJS OmniRig doesn't seem to have any capability of tracking/setting VFO B mode
|
// TODO: G4WJS OmniRig doesn't seem to have any capability of tracking/setting VFO B mode
|
||||||
auto mapped = map_mode (mode);
|
auto mapped = map_mode (mode);
|
||||||
|
|
|
@ -44,9 +44,6 @@ public:
|
||||||
void do_ptt (bool on) override;
|
void do_ptt (bool on) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool await_notification_with_timeout (int timeout);
|
|
||||||
Q_SIGNAL void notified () const;
|
|
||||||
// Q_SLOT void timeout_check ();
|
|
||||||
Q_SLOT void handle_COM_exception (int, QString, QString, QString);
|
Q_SLOT void handle_COM_exception (int, QString, QString, QString);
|
||||||
Q_SLOT void handle_visible_change ();
|
Q_SLOT void handle_visible_change ();
|
||||||
Q_SLOT void handle_rig_type_change (int rig_number);
|
Q_SLOT void handle_rig_type_change (int rig_number);
|
||||||
|
|
|
@ -23,6 +23,12 @@ QDebug operator << (QDebug d, Transceiver::TransceiverState const& s)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
std::ostream& operator << (std::ostream& os, Transceiver::MODE m)
|
||||||
|
{
|
||||||
|
auto const& mo = Transceiver::staticMetaObject; \
|
||||||
|
return os << mo.enumerator (mo.indexOfEnumerator ("MODE")).valueToKey (static_cast<int> (m)); \
|
||||||
|
}
|
||||||
|
|
||||||
std::ostream& operator << (std::ostream& os, Transceiver::TransceiverState const& s)
|
std::ostream& operator << (std::ostream& os, Transceiver::TransceiverState const& s)
|
||||||
{
|
{
|
||||||
return os
|
return os
|
||||||
|
|
|
@ -169,6 +169,7 @@ Q_DECLARE_METATYPE (Transceiver::TransceiverState);
|
||||||
QDebug operator << (QDebug, Transceiver::TransceiverState const&);
|
QDebug operator << (QDebug, Transceiver::TransceiverState const&);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
std::ostream& operator << (std::ostream&, Transceiver::MODE);
|
||||||
std::ostream& operator << (std::ostream&, Transceiver::TransceiverState const&);
|
std::ostream& operator << (std::ostream&, Transceiver::TransceiverState const&);
|
||||||
|
|
||||||
ENUM_QDATASTREAM_OPS_DECL (Transceiver, MODE);
|
ENUM_QDATASTREAM_OPS_DECL (Transceiver, MODE);
|
||||||
|
|
|
@ -16,6 +16,8 @@ namespace
|
||||||
|
|
||||||
void TransceiverBase::start (unsigned sequence_number) noexcept
|
void TransceiverBase::start (unsigned sequence_number) noexcept
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("#: " << sequence_number);
|
||||||
|
|
||||||
QString message;
|
QString message;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -26,10 +28,12 @@ void TransceiverBase::start (unsigned sequence_number) noexcept
|
||||||
}
|
}
|
||||||
catch (std::exception const& e)
|
catch (std::exception const& e)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("#: " << sequence_number << " what: " << e.what ());
|
||||||
message = e.what ();
|
message = e.what ();
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("#: " << sequence_number);
|
||||||
message = unexpected;
|
message = unexpected;
|
||||||
}
|
}
|
||||||
if (!message.isEmpty ())
|
if (!message.isEmpty ())
|
||||||
|
@ -41,7 +45,7 @@ void TransceiverBase::start (unsigned sequence_number) noexcept
|
||||||
void TransceiverBase::set (TransceiverState const& s,
|
void TransceiverBase::set (TransceiverState const& s,
|
||||||
unsigned sequence_number) noexcept
|
unsigned sequence_number) noexcept
|
||||||
{
|
{
|
||||||
CAT_TRACE ("#: " << sequence_number << " " << s);
|
CAT_TRACE ("#: " << s);
|
||||||
|
|
||||||
QString message;
|
QString message;
|
||||||
try
|
try
|
||||||
|
@ -77,8 +81,7 @@ void TransceiverBase::set (TransceiverState const& s,
|
||||||
}
|
}
|
||||||
if (s.frequency () // ignore bogus zero frequencies
|
if (s.frequency () // ignore bogus zero frequencies
|
||||||
&& ((s.frequency () != requested_.frequency () // and QSY
|
&& ((s.frequency () != requested_.frequency () // and QSY
|
||||||
|| (s.mode () != UNK && s.mode () != requested_.mode ())) // or mode change
|
|| (s.mode () != UNK && s.mode () != requested_.mode ())))) // or mode change
|
||||||
|| ptt_off)) // or just returned to rx
|
|
||||||
{
|
{
|
||||||
do_frequency (s.frequency (), s.mode (), ptt_off);
|
do_frequency (s.frequency (), s.mode (), ptt_off);
|
||||||
do_post_frequency (s.frequency (), s.mode ());
|
do_post_frequency (s.frequency (), s.mode ());
|
||||||
|
@ -119,10 +122,12 @@ void TransceiverBase::set (TransceiverState const& s,
|
||||||
}
|
}
|
||||||
catch (std::exception const& e)
|
catch (std::exception const& e)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("#: " << sequence_number << " what: " << e.what ());
|
||||||
message = e.what ();
|
message = e.what ();
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("#: " << sequence_number << " " << sequence_number);
|
||||||
message = unexpected;
|
message = unexpected;
|
||||||
}
|
}
|
||||||
if (!message.isEmpty ())
|
if (!message.isEmpty ())
|
||||||
|
@ -133,6 +138,7 @@ void TransceiverBase::set (TransceiverState const& s,
|
||||||
|
|
||||||
void TransceiverBase::startup ()
|
void TransceiverBase::startup ()
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("startup");
|
||||||
QString message;
|
QString message;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -144,10 +150,12 @@ void TransceiverBase::startup ()
|
||||||
}
|
}
|
||||||
catch (std::exception const& e)
|
catch (std::exception const& e)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("startup" << " what: " << e.what ());
|
||||||
message = e.what ();
|
message = e.what ();
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("startup");
|
||||||
message = unexpected;
|
message = unexpected;
|
||||||
}
|
}
|
||||||
if (!message.isEmpty ())
|
if (!message.isEmpty ())
|
||||||
|
@ -158,6 +166,7 @@ void TransceiverBase::startup ()
|
||||||
|
|
||||||
void TransceiverBase::shutdown ()
|
void TransceiverBase::shutdown ()
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("shutdown");
|
||||||
may_update u {this};
|
may_update u {this};
|
||||||
if (requested_.online ())
|
if (requested_.online ())
|
||||||
{
|
{
|
||||||
|
@ -177,6 +186,7 @@ void TransceiverBase::shutdown ()
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("shutdown");
|
||||||
// don't care about exceptions
|
// don't care about exceptions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,6 +196,7 @@ void TransceiverBase::shutdown ()
|
||||||
|
|
||||||
void TransceiverBase::stop () noexcept
|
void TransceiverBase::stop () noexcept
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("stop");
|
||||||
QString message;
|
QString message;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -193,10 +204,12 @@ void TransceiverBase::stop () noexcept
|
||||||
}
|
}
|
||||||
catch (std::exception const& e)
|
catch (std::exception const& e)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("stop" << " what: " << e.what ());
|
||||||
message = e.what ();
|
message = e.what ();
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("stop");
|
||||||
message = unexpected;
|
message = unexpected;
|
||||||
}
|
}
|
||||||
if (!message.isEmpty ())
|
if (!message.isEmpty ())
|
||||||
|
@ -211,6 +224,7 @@ void TransceiverBase::stop () noexcept
|
||||||
|
|
||||||
void TransceiverBase::update_rx_frequency (Frequency rx)
|
void TransceiverBase::update_rx_frequency (Frequency rx)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("frequency: " << rx);
|
||||||
if (rx)
|
if (rx)
|
||||||
{
|
{
|
||||||
actual_.frequency (rx);
|
actual_.frequency (rx);
|
||||||
|
@ -220,28 +234,35 @@ void TransceiverBase::update_rx_frequency (Frequency rx)
|
||||||
|
|
||||||
void TransceiverBase::update_other_frequency (Frequency tx)
|
void TransceiverBase::update_other_frequency (Frequency tx)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("frequency: " << tx);
|
||||||
actual_.tx_frequency (tx);
|
actual_.tx_frequency (tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransceiverBase::update_split (bool state)
|
void TransceiverBase::update_split (bool state)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("state: " << state);
|
||||||
actual_.split (state);
|
actual_.split (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransceiverBase::update_mode (MODE m)
|
void TransceiverBase::update_mode (MODE m)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("mode: " << m);
|
||||||
actual_.mode (m);
|
actual_.mode (m);
|
||||||
requested_.mode (m); // track rig changes
|
requested_.mode (m); // track rig changes
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransceiverBase::update_PTT (bool state)
|
void TransceiverBase::update_PTT (bool state)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("state: " << state);
|
||||||
actual_.ptt (state);
|
actual_.ptt (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransceiverBase::update_complete (bool force_signal)
|
void TransceiverBase::update_complete (bool force_signal)
|
||||||
{
|
{
|
||||||
if ((do_pre_update () && actual_ != last_) || force_signal)
|
CAT_TRACE ("force signal: " << force_signal);
|
||||||
|
if ((do_pre_update ()
|
||||||
|
&& actual_ != last_)
|
||||||
|
|| force_signal)
|
||||||
{
|
{
|
||||||
Q_EMIT update (actual_, last_sequence_number_);
|
Q_EMIT update (actual_, last_sequence_number_);
|
||||||
last_ = actual_;
|
last_ = actual_;
|
||||||
|
@ -250,6 +271,7 @@ void TransceiverBase::update_complete (bool force_signal)
|
||||||
|
|
||||||
void TransceiverBase::offline (QString const& reason)
|
void TransceiverBase::offline (QString const& reason)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("reason: " << reason);
|
||||||
Q_EMIT failure (reason);
|
Q_EMIT failure (reason);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -257,6 +279,7 @@ void TransceiverBase::offline (QString const& reason)
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
CAT_TRACE ("reason: " << reason);
|
||||||
// don't care
|
// don't care
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ JT4 11101000000011000011000000000000000000
|
||||||
JT4/VHF 11111001001011011011110000000000000000
|
JT4/VHF 11111001001011011011110000000000000000
|
||||||
JT9 11101000000011100001000000000000100000
|
JT9 11101000000011100001000000000000100000
|
||||||
JT9/VHF 11111010100011111001000000000000000000
|
JT9/VHF 11111010100011111001000000000000000000
|
||||||
JT9+JT65 11101000000111100001000000000000100000
|
|
||||||
JT65 11101000000011100001000000000000100000
|
JT65 11101000000011100001000000000000100000
|
||||||
JT65/VHF 11111001000011011010110001000000000000
|
JT65/VHF 11111001000011011010110001000000000000
|
||||||
Q65 11111101011011010011100000010000000011
|
Q65 11111101011011010011100000010000000011
|
||||||
|
|
|
@ -49,12 +49,11 @@ set (UG_SRCS
|
||||||
system-requirements.adoc
|
system-requirements.adoc
|
||||||
transceiver-setup.adoc
|
transceiver-setup.adoc
|
||||||
tutorial-example1.adoc
|
tutorial-example1.adoc
|
||||||
tutorial-example2.adoc
|
|
||||||
tutorial-example3.adoc
|
tutorial-example3.adoc
|
||||||
tutorial-example4.adoc
|
tutorial-example4.adoc
|
||||||
tutorial-example5.adoc
|
tutorial-example5.adoc
|
||||||
tutorial-example6.adoc
|
tutorial-example6.adoc
|
||||||
tutorial-main-window.adoc
|
tutorial-download-samples.adoc
|
||||||
tutorial-wide-graph-settings.adoc
|
tutorial-wide-graph-settings.adoc
|
||||||
utilities.adoc
|
utilities.adoc
|
||||||
vhf-features.adoc
|
vhf-features.adoc
|
||||||
|
@ -63,7 +62,7 @@ set (UG_SRCS
|
||||||
)
|
)
|
||||||
|
|
||||||
set (UG_IMGS
|
set (UG_IMGS
|
||||||
images/130610_2343-wav-80.png
|
images/active_stations.png
|
||||||
images/AstroData_2.png
|
images/AstroData_2.png
|
||||||
images/Astronomical_data.png
|
images/Astronomical_data.png
|
||||||
images/auto-seq.png
|
images/auto-seq.png
|
||||||
|
@ -72,7 +71,6 @@ set (UG_IMGS
|
||||||
images/colors.png
|
images/colors.png
|
||||||
images/config-menu.png
|
images/config-menu.png
|
||||||
images/decode-menu.png
|
images/decode-menu.png
|
||||||
images/decodes.png
|
|
||||||
images/download_samples.png
|
images/download_samples.png
|
||||||
images/echo_144.png
|
images/echo_144.png
|
||||||
images/EME_Deep_0.png
|
images/EME_Deep_0.png
|
||||||
|
|
|
@ -25,16 +25,17 @@ https://www.msys2.org/wiki/MSYS2-installation/
|
||||||
Take particular care to restart the MSYS2 shell window when directed
|
Take particular care to restart the MSYS2 shell window when directed
|
||||||
to.
|
to.
|
||||||
|
|
||||||
Once MSYS2 is installed you will find a start menu entry labelled
|
|
||||||
"MSYS2 MinGW 64-bit", use that to start a fresh MSYS2 shell window for
|
|
||||||
the rest of these instructions.
|
|
||||||
|
|
||||||
The first step is to install some prerequisite packages which contain
|
The first step is to install some prerequisite packages which contain
|
||||||
the tools needed to prepare and build the portaudio DLL. Execute the
|
the tools needed to prepare and build the portaudio DLL. Execute the
|
||||||
following command to do that:
|
following command to do that:
|
||||||
|
|
||||||
pacman -S make diffutils unzip mingw-w64-x86_64-gcc sed tar curl
|
pacman -S make diffutils unzip mingw-w64-x86_64-gcc sed tar curl
|
||||||
|
|
||||||
|
Once MSYS2 is installed and the prerequisite packages above are
|
||||||
|
installed you will find a new Windows Start Menu entry labelled "MSYS2
|
||||||
|
MinGW 64-bit", use that to start a fresh MSYS2 shell window for the
|
||||||
|
rest of these instructions.
|
||||||
|
|
||||||
Then make directories to put downloaded sources in and for building:
|
Then make directories to put downloaded sources in and for building:
|
||||||
|
|
||||||
mkdir -p ~/src ~/build/portaudio
|
mkdir -p ~/src ~/build/portaudio
|
||||||
|
|
|
@ -94,10 +94,11 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
||||||
:sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK]
|
:sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK]
|
||||||
:ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice]
|
:ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice]
|
||||||
:win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages]
|
:win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages]
|
||||||
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1k.msi[Win32 OpenSSL Light Package]
|
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1L.msi[Win32 OpenSSL Light Package]
|
||||||
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1k.msi[Win64 OpenSSL Light Package]
|
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1L.msi[Win64 OpenSSL Light Package]
|
||||||
:writelog: https://writelog.com/[Writelog]
|
:writelog: https://writelog.com/[Writelog]
|
||||||
:wsjtx_group: https://groups.io/g/WSJTX[WSJTX Group]
|
:wsjtx_group: https://groups.io/g/WSJTX[WSJTX Group]
|
||||||
|
:wsjtx_group2: https://groups.io/g/WSJTX[join the group]
|
||||||
:wsjtx: https://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]
|
:wsjtx: https://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]
|
||||||
:wspr0_guide: https://www.physics.princeton.edu/pulsar/K1JT/WSPR0_Instructions.TXT[WSPR0 Guide]
|
:wspr0_guide: https://www.physics.princeton.edu/pulsar/K1JT/WSPR0_Instructions.TXT[WSPR0 Guide]
|
||||||
:wspr: https://physics.princeton.edu/pulsar/K1JT/wspr.html[WSPR Home Page]
|
:wspr: https://physics.princeton.edu/pulsar/K1JT/wspr.html[WSPR Home Page]
|
||||||
|
@ -120,7 +121,8 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
||||||
:svn: https://subversion.apache.org/packages.html#windows[Subversion]
|
:svn: https://subversion.apache.org/packages.html#windows[Subversion]
|
||||||
:win32: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
|
:win32: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
|
||||||
:win64: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win64.exe[wsjtx-{VERSION}-win64.exe]
|
:win64: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win64.exe[wsjtx-{VERSION}-win64.exe]
|
||||||
:wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
|
:wsjt-devel: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[join the group]
|
||||||
|
:wsjt-devel2: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[subscribe to the list]
|
||||||
:wsjt_repo: https://sourceforge.net/p/wsjt/wsjt_orig/ci/master/tree/[WSJT Source Repository]
|
:wsjt_repo: https://sourceforge.net/p/wsjt/wsjt_orig/ci/master/tree/[WSJT Source Repository]
|
||||||
:wspr_code: https://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
|
:wspr_code: https://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
|
||||||
:wspr_svn: https://sourceforge.net/p/wsjt/wspr/ci/master/tree/[WSPR Source Repository]
|
:wspr_svn: https://sourceforge.net/p/wsjt/wspr/ci/master/tree/[WSPR Source Repository]
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
// Status=review
|
// Status=review
|
||||||
|
|
||||||
The _WSJT_ project was started by *K1JT* in 2001. Since 2005 it has
|
The _WSJT_ project was started by *K1JT* in 2001. Since 2005 it has
|
||||||
been an Open Source project, which now includes the programs _WSJT_,
|
been an Open Source project, and it has included the programs _WSJT_,
|
||||||
_MAP65_, _WSPR_, _WSJT-X_, and _WSPR-X_. *G4WJS* (since 2013), *K9AN*
|
_MAP65_, _WSPR_, _WSJT-X_, and _WSPR-X_. *G4WJS* (since 2013), *K9AN*
|
||||||
(since 2015), and *IV3NWV* (since 2016) have made major contributions
|
(since 2015), *IV3NWV* (since 2016), *KG4IYS* (since 2021), and
|
||||||
to _WSJT-X_. Together with K1JT they now form the core development
|
*DG2YCB* (since 2021) have made major contributions to _WSJT-X_.
|
||||||
team. *G4WJS* and *W9MDB* have made major contributiions to _hamlib_,
|
Together with K1JT they now form the core development team. *G4WJS*
|
||||||
on which _WSJT-X_ depends for rig control.
|
and *W9MDB* have made major contributions to the _hamlib_ library, on
|
||||||
|
which _WSJT-X_ depends for rig control.
|
||||||
|
|
||||||
All code in the _WSJT_ project is licensed under the GNU Public
|
All code in the _WSJT_ project is licensed under the GNU Public
|
||||||
License (GPL). Many users of these programs, too numerous to mention
|
License (GPL). Many users of these programs, too numerous to mention
|
||||||
|
@ -15,9 +16,9 @@ greatly aided the development of _WSJT_ and its sister programs. For
|
||||||
_WSJT-X_ in particular, we acknowledge contributions from *AC6SL,
|
_WSJT-X_ in particular, we acknowledge contributions from *AC6SL,
|
||||||
AE4JY, DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT, KA6MAL, KA9Q,
|
AE4JY, DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT, KA6MAL, KA9Q,
|
||||||
KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR, VE1SKY, VK3ACF, VK4BDJ,
|
KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR, VE1SKY, VK3ACF, VK4BDJ,
|
||||||
VK7MO, W3DJS, W4TI, W4TV, and W9MDB*. Each of these amateurs has helped to
|
VK7MO, W3DJS, W3SZ, W4TI, W4TV, and W9MDB*. Each of these amateurs
|
||||||
bring the program’s design, code, testing, and/or documentation to its
|
has helped to bring the program’s design, code, testing, and/or
|
||||||
present state.
|
documentation to its present state.
|
||||||
|
|
||||||
Most of the color palettes for the _WSJT-X_ waterfall were copied from
|
Most of the color palettes for the _WSJT-X_ waterfall were copied from
|
||||||
the excellent, well documented, open-source program _fldigi_, by *W1HKJ*
|
the excellent, well documented, open-source program _fldigi_, by *W1HKJ*
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
// Status=edited
|
// Status=edited
|
||||||
|
|
||||||
Controls related to frequency selection, received audio level, the
|
Controls related to frequency selection, received audio level, the
|
||||||
station being called, and date and time are found in the lower, left-hand section of the
|
station being called, and date and time are found in the lower,
|
||||||
main window:
|
left-hand section of the main window. Buttons are provided for making
|
||||||
|
quick changes among the modes FT8, FT4, MSK144, Q65, and JT65, and
|
||||||
|
for toggling FT8 Hound mode ON or OFF.
|
||||||
|
|
||||||
//.Misc Controls Left
|
//.Misc Controls Left
|
||||||
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]
|
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Status=edited
|
// Status=edited
|
||||||
|
|
||||||
The following controls appear just under the decoded text windows on
|
The following controls appear just under the decoded text windows on
|
||||||
the main screen:
|
the main screen. Some of them are visible only in certain modes.
|
||||||
|
|
||||||
//.Main UI
|
//.Main UI
|
||||||
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
|
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
|
||||||
|
@ -11,7 +11,9 @@ image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
|
||||||
* *Log QSO* raises a dialog window pre-filled with known information
|
* *Log QSO* raises a dialog window pre-filled with known information
|
||||||
about a QSO you have nearly completed. You can edit or add to this
|
about a QSO you have nearly completed. You can edit or add to this
|
||||||
information before clicking *OK* to log the QSO. If you check *Prompt
|
information before clicking *OK* to log the QSO. If you check *Prompt
|
||||||
me to log QSO* on the *File -> Settings -> Reporting* tab, the program raises the confirmation screen automatically when you send a message containing +73+. *Start Date* and *Start Time* are set when you click
|
me to log QSO* on the *File -> Settings -> Reporting* tab, the program
|
||||||
|
raises the confirmation screen automatically when you send a message
|
||||||
|
containing +73+. *Start Date* and *Start Time* are set when you click
|
||||||
to send the *Tx 2* or *Tx 3* message, and backed up by one or two
|
to send the *Tx 2* or *Tx 3* message, and backed up by one or two
|
||||||
sequence lengths, respectively. (Note that the actual start time may
|
sequence lengths, respectively. (Note that the actual start time may
|
||||||
have been earlier if repeats of early transmissions were required.)
|
have been earlier if repeats of early transmissions were required.)
|
||||||
|
|
|
@ -37,7 +37,18 @@ examples for configurations `FT8` and `Echo`:
|
||||||
==== View Menu
|
==== View Menu
|
||||||
image::view-menu.png[align="left",alt="View Menu"]
|
image::view-menu.png[align="left",alt="View Menu"]
|
||||||
|
|
||||||
The *SWL Mode* action reduces the _WSJT-X_ main window to a minimum
|
*Active Stations* displays a window that can help you to work the most
|
||||||
|
distant stations, in particular for the distance-scored ARRL
|
||||||
|
International Digital Contest. Controls are provided to set the
|
||||||
|
maximum length of the list and the maximum "`age`" of decodes in Rx
|
||||||
|
sequences. You can request display of only ready-to-be-called
|
||||||
|
stations. For the ARRL International Digital Contest the window
|
||||||
|
displays scoring rate (points in the most recent hour), total score,
|
||||||
|
and the number of band changes in the past hour.
|
||||||
|
|
||||||
|
image::active_stations.png[align="left",alt="Active Stations"]
|
||||||
|
|
||||||
|
*SWL Mode* reduces the _WSJT-X_ main window to a minimum
|
||||||
size with just the menus, decodes windows, and status bar visible. You
|
size with just the menus, decodes windows, and status bar visible. You
|
||||||
may find this useful when running multiple instances of the
|
may find this useful when running multiple instances of the
|
||||||
application. Both size and location of the main window are saved and
|
application. Both size and location of the main window are saved and
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
// Status=edited
|
// Status=edited
|
||||||
|
|
||||||
The following controls appear at the bottom of the Wide Graph window.
|
The following controls appear at the bottom of the Wide Graph window.
|
||||||
Decoding occurs only in the displayed frequency range; otherwise, with
|
Decoding occurs only in the displayed frequency range; otherwise,
|
||||||
the exceptions of *Start NNN Hz* and of *JT65 nnnn JT9* when operating
|
controls on the Wide Graph window have no effect on the decoding
|
||||||
in JT9+JT65 mode, controls on the Wide Graph window have no effect on
|
process.
|
||||||
the decoding process.
|
|
||||||
|
|
||||||
image::wide-graph-controls.png[align="center",alt="Wide Graph Controls"]
|
image::wide-graph-controls.png[align="center",alt="Wide Graph Controls"]
|
||||||
|
|
||||||
|
@ -13,11 +12,6 @@ value to 1 for the highest possible resolution, or to higher numbers
|
||||||
to compress the spectral display. Normal operation with a convenient
|
to compress the spectral display. Normal operation with a convenient
|
||||||
window size works well at 2 to 8 bins per pixel.
|
window size works well at 2 to 8 bins per pixel.
|
||||||
|
|
||||||
- *JT65 nnnn JT9* sets the dividing point (blue marker) for wide-band
|
|
||||||
decoding of JT65 and JT9 signals in *JT9+JT65* mode. The decoder
|
|
||||||
looks for JT65 signals everywhere, but JT9 signals only above this
|
|
||||||
frequency. This setting is stored separately for each band.
|
|
||||||
|
|
||||||
- *Start nnn Hz* sets the low-frequency starting point of the
|
- *Start nnn Hz* sets the low-frequency starting point of the
|
||||||
waterfall frequency scale.
|
waterfall frequency scale.
|
||||||
|
|
||||||
|
|
|
@ -24,20 +24,22 @@ AP bits, with a specified level of confidence. Successful AP decodes
|
||||||
are labeled with an end-of-line indicator of the form `aP`, where `P`
|
are labeled with an end-of-line indicator of the form `aP`, where `P`
|
||||||
is one of the single-digit AP decoding types listed in Table 1. For
|
is one of the single-digit AP decoding types listed in Table 1. For
|
||||||
example, `a2` indicates that the successful decode used MyCall as
|
example, `a2` indicates that the successful decode used MyCall as
|
||||||
hypothetically known information.
|
hypothetically known information. Type `a7`, used only in FT8 mode,
|
||||||
|
uses information from the previous Rx sequence.
|
||||||
|
|
||||||
[[FT8_AP_INFO_TABLE]]
|
[[FT8_AP_INFO_TABLE]]
|
||||||
.FST4, FT4, and FT8 AP information types
|
.FST4, FT4, and FT8 AP information types
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="35%",cols="1h,<10m",frame=topbot,options="header"]
|
||||||
|===============================================
|
|===
|
||||||
|aP | Message components
|
|aP|Message components
|
||||||
|a1 | CQ     ?     ?
|
|a1|CQ     ?     ?
|
||||||
|a2 | MyCall     ?     ?
|
|a2|MyCall     ?     ?
|
||||||
|a3 | MyCall DxCall     ?
|
|a3|MyCall DxCall     ?
|
||||||
|a4 | MyCall DxCall RRR
|
|a4|MyCall DxCall RRR
|
||||||
|a5 | MyCall DxCall 73
|
|a5|MyCall DxCall 73
|
||||||
|a6 | MyCall DxCall RR73
|
|a6|MyCall DxCall RR73
|
||||||
|===============================================
|
|a7|(Call_1 or CQ) Call_2     ?
|
||||||
|
|===
|
||||||
|
|
||||||
If a codeword is found that is judged to have high (but not
|
If a codeword is found that is judged to have high (but not
|
||||||
overwhelmingly high) probability of being correct, a `?` character is
|
overwhelmingly high) probability of being correct, a `?` character is
|
||||||
|
@ -53,8 +55,8 @@ is the same except that it omits the decoding attempts for AP types
|
||||||
|
|
||||||
[[FT8_AP_DECODING_TYPES_TABLE]]
|
[[FT8_AP_DECODING_TYPES_TABLE]]
|
||||||
.FT4 and FT8 AP decoding types for each QSO state
|
.FT4 and FT8 AP decoding types for each QSO state
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="35%",cols="10h,<20m",frame=topbot,options="header"]
|
||||||
|===========================================
|
|===
|
||||||
|State |AP type
|
|State |AP type
|
||||||
|CALLING STN | 2, 3
|
|CALLING STN | 2, 3
|
||||||
|REPORT | 2, 3
|
|REPORT | 2, 3
|
||||||
|
@ -62,15 +64,15 @@ is the same except that it omits the decoding attempts for AP types
|
||||||
|ROGERS | 3, 4, 5, 6
|
|ROGERS | 3, 4, 5, 6
|
||||||
|SIGNOFF | 3, 1, 2
|
|SIGNOFF | 3, 1, 2
|
||||||
|CALLING CQ | 1, 2
|
|CALLING CQ | 1, 2
|
||||||
|===========================================
|
|===
|
||||||
|
|
||||||
Decoding with _a priori_ information behaves slightly differently
|
Decoding with _a priori_ information behaves slightly differently
|
||||||
in JT65. Some details are provided in Tables 3 and 4.
|
in JT65. Some details are provided in Tables 3 and 4.
|
||||||
|
|
||||||
[[JT65_AP_INFO_TABLE]]
|
[[JT65_AP_INFO_TABLE]]
|
||||||
.JT65 AP information types
|
.JT65 AP information types
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="35%",cols="1h,<10m",frame=topbot,options="header"]
|
||||||
|===============================================
|
|===
|
||||||
|aP | Message components
|
|aP | Message components
|
||||||
|a1 | CQ     ?     ?
|
|a1 | CQ     ?     ?
|
||||||
|a2 | MyCall     ?     ?
|
|a2 | MyCall     ?     ?
|
||||||
|
@ -79,20 +81,20 @@ in JT65. Some details are provided in Tables 3 and 4.
|
||||||
|a5 | MyCall DxCall 73
|
|a5 | MyCall DxCall 73
|
||||||
|a6 | MyCall DxCall DxGrid
|
|a6 | MyCall DxCall DxGrid
|
||||||
|a7 | CQ DxCall DxGrid
|
|a7 | CQ DxCall DxGrid
|
||||||
|===============================================
|
|===
|
||||||
|
|
||||||
[[JT65_AP_DECODING_TYPES_TABLE]]
|
[[JT65_AP_DECODING_TYPES_TABLE]]
|
||||||
.JT65 AP decoding types for each QSO state
|
.JT65 AP decoding types for each QSO state
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="35%",cols="10h,<20m",frame=topbot,options="header"]
|
||||||
|===========================================
|
|===
|
||||||
|State |AP type
|
|State |AP type
|
||||||
|CALLING STN | 2, 3, 6, 7
|
|CALLING STN |2, 3, 6, 7
|
||||||
|REPORT | 2, 3
|
|REPORT |2, 3
|
||||||
|ROGER_REPORT | 3, 4, 5
|
|ROGER_REPORT |3, 4, 5
|
||||||
|ROGERS | 3, 4, 5
|
|ROGERS |3, 4, 5
|
||||||
|SIGNOFF | 2, 3, 4, 5
|
|SIGNOFF |2, 3, 4, 5
|
||||||
|CALLING CQ | 1, 2, 6
|
|CALLING CQ |1, 2, 6
|
||||||
|===========================================
|
|===
|
||||||
|
|
||||||
|
|
||||||
=== Decoded Lines
|
=== Decoded Lines
|
||||||
|
@ -109,18 +111,18 @@ summarized in the following Table:
|
||||||
[[DECODED_LINES_TABLE]]
|
[[DECODED_LINES_TABLE]]
|
||||||
.Notations used on decoded text lines
|
.Notations used on decoded text lines
|
||||||
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|
||||||
|===========================================
|
|===
|
||||||
|Mode |Mode character|Sync character|End of line information
|
|Mode |Mode character|Sync character|End of line information
|
||||||
|FST4 | ` | | ?   aP
|
|FST4 | ` | | ?   aP
|
||||||
|FT4 | + | | ?   aP
|
|FT4 | + | | ?   aP
|
||||||
|FT8 | ~ | | ?   aP
|
|FT8 | ~ | | ?   aP
|
||||||
|JT4 | $ | *, # | f, fN, dCN
|
|JT4 | $ | *, # | f, fN, dCN
|
||||||
|JT9 | @ | |
|
|JT9 | @ | |
|
||||||
|JT65 | # | |
|
|JT65 | # | |
|
||||||
|JT65 VHF| # | *, # | f, fN, dCN
|
|JT65 VHF| # | *, # | f, fN, dCN
|
||||||
|Q65 | : | | qP
|
|Q65 | : | | qP
|
||||||
|MSK144 | & | |
|
|MSK144 | & | |
|
||||||
|===========================================
|
|===
|
||||||
Sync character::
|
Sync character::
|
||||||
`*` - Normal sync +
|
`*` - Normal sync +
|
||||||
`#` - Alternate sync
|
`#` - Alternate sync
|
||||||
|
@ -136,12 +138,13 @@ End of line information::
|
||||||
|
|
||||||
[[Q65_AP_INFO_TABLE]]
|
[[Q65_AP_INFO_TABLE]]
|
||||||
.Q65 end-of-line codes
|
.Q65 end-of-line codes
|
||||||
[width="45%",cols="h10,<m20",frame=topbot,options="header"]
|
[width="50%",cols="1h,<10m",frame=topbot,options="header"]
|
||||||
|===============================================
|
|===
|
||||||
| | Message components
|
|qP|Message components
|
||||||
|q0 | ?     ?     ?
|
|q0|?     ?     ?
|
||||||
|q1 | CQ     ?     ?
|
|q1|CQ     ?     ?
|
||||||
|q2 | MyCall     ?     ?
|
|q2|MyCall     ?     ?
|
||||||
|q3 | MyCall DxCall     ?
|
|q3|MyCall DxCall     ?
|
||||||
|q4 | MyCall DxCall     [<blank> \| RRR \| RR73 \| 73]
|
|q4|MyCall DxCall     [<blank> \| RRR \| RR73 \| 73]
|
||||||
|===============================================
|
|q5|MyCall DxCall     ?         (*Max Drift* = 50)
|
||||||
|
|===
|
||||||
|
|
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.9 KiB |
|
@ -10,12 +10,6 @@ with the release for details of the targeted Linux distributions and
|
||||||
versions. If the binary package is not compatible with your Linux
|
versions. If the binary package is not compatible with your Linux
|
||||||
distribution or version, you must build the application from sources.
|
distribution or version, you must build the application from sources.
|
||||||
|
|
||||||
* 32-bit Intel/AMD: {debian32}
|
|
||||||
- To install:
|
|
||||||
+
|
|
||||||
[example]
|
|
||||||
sudo dpkg -i wsjtx_{VERSION}_i386.deb
|
|
||||||
|
|
||||||
* 64-bit Intel/AMD: {debian64}
|
* 64-bit Intel/AMD: {debian64}
|
||||||
- To install:
|
- To install:
|
||||||
+
|
+
|
||||||
|
@ -45,24 +39,18 @@ You may also need to execute the following command in a terminal:
|
||||||
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
|
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
|
||||||
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
|
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
|
||||||
libqt5sql5-sqlite libfftw3-single3 libgomp1 libboost-all-dev \
|
libqt5sql5-sqlite libfftw3-single3 libgomp1 libboost-all-dev \
|
||||||
libusb-1.0-0
|
libusb-1.0-0 libportaudio2
|
||||||
....
|
....
|
||||||
|
|
||||||
Fedora, CentOS, Red Hat, and other rpm-based systems:
|
Fedora, CentOS, Red Hat, and other rpm-based systems:
|
||||||
|
|
||||||
* 32-bit: {fedora32}
|
|
||||||
- To install:
|
|
||||||
+
|
|
||||||
[example]
|
|
||||||
sudo rpm -i wsjtx-{VERSION}-i686.rpm
|
|
||||||
|
|
||||||
* 64-bit: {fedora64}
|
* 64-bit: {fedora64}
|
||||||
- To install:
|
- To install:
|
||||||
+
|
+
|
||||||
[example]
|
[example]
|
||||||
sudo rpm -i wsjtx-{VERSION}-x86_64.rpm
|
sudo rpm -i wsjtx-{VERSION}-x86_64.rpm
|
||||||
|
|
||||||
* Uninstall for either of the above platforms:
|
* Uninstall:
|
||||||
+
|
+
|
||||||
[example]
|
[example]
|
||||||
sudo rpm -e wsjtx
|
sudo rpm -e wsjtx
|
||||||
|
@ -72,5 +60,5 @@ You may also need to execute the following command in a terminal:
|
||||||
....
|
....
|
||||||
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
|
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
|
||||||
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
|
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
|
||||||
qt5-qtserialport libgomp boost libusbx
|
qt5-qtserialport libgomp boost libusbx portaudio
|
||||||
....
|
....
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
=== Documentation Conventions
|
=== Documentation Conventions
|
||||||
|
|
||||||
|
We include screen shots that illustrate many of the settings and
|
||||||
|
features of _WSJT-X_. Keep in mind that _WSJT-X_ is a multi-platform
|
||||||
|
application: the detailed appearance of windows and user controls may
|
||||||
|
be significantly different in Windows, Linux, or macOS environments.
|
||||||
|
The underlying functionality is the same on all operating systems,
|
||||||
|
however. Where desirable we call special attention to important
|
||||||
|
platform differences.
|
||||||
|
|
||||||
In this manual the following icons call attention to particular types
|
In this manual the following icons call attention to particular types
|
||||||
of information:
|
of information:
|
||||||
|
|
||||||
|
@ -14,9 +22,14 @@ consequences.
|
||||||
|
|
||||||
=== User Interface in Other Languages
|
=== User Interface in Other Languages
|
||||||
|
|
||||||
The _WSJT-X_ user interface is now available in many languages. When
|
The _WSJT-X_ user interface (UI) is now available in many languages.
|
||||||
a translated user interface is available for the computer's default
|
When a translated UI is available for the computer's default System
|
||||||
System Language, it will appear automatically on program startup.
|
Language, it will appear automatically on program startup. The UI
|
||||||
|
language may be overridden if desired by starting _WSJT-X_ with a
|
||||||
|
command line option. For example, to start _WSJT-X_ with its user
|
||||||
|
interface in Spanish, enter this command at the prompt: +
|
||||||
|
|
||||||
|
`wsjtx --language es`
|
||||||
|
|
||||||
=== How You Can Contribute
|
=== How You Can Contribute
|
||||||
|
|
||||||
|
|
|
@ -89,3 +89,11 @@ Release candidates should be used _only_ during a short testing
|
||||||
period. They carry an implied obligation to provide feedback to the
|
period. They carry an implied obligation to provide feedback to the
|
||||||
program development group. Candidate releases should not be used on
|
program development group. Candidate releases should not be used on
|
||||||
the air after a full release with the same number is made.
|
the air after a full release with the same number is made.
|
||||||
|
|
||||||
|
A companion program _MAP65_, written by K1JT, is designed for EME
|
||||||
|
communication using the JT65 and Q65 protocols. When used with RF
|
||||||
|
hardware providing coherent signal channels for two orthogonal
|
||||||
|
polarizations, the program provides automatic polarization-matched
|
||||||
|
reception for every JT65 or Q65 signal in a 90 kHz passband. On the
|
||||||
|
Windows platform, _MAP65_ is installed automatically along with
|
||||||
|
_WSJT-X_.
|
||||||
|
|
|
@ -69,9 +69,9 @@ Check *Auto Seq* on the main window to enable this feature:
|
||||||
|
|
||||||
image::auto-seq.png[align="center",alt="AutoSeq"]
|
image::auto-seq.png[align="center",alt="AutoSeq"]
|
||||||
|
|
||||||
When calling CQ you may also choose to check the box *Call 1st*.
|
When calling CQ you may choose to select *CQ: First* to reply
|
||||||
_WSJT-X_ will then respond automatically to the first decoded
|
automatically to the first decoded responder, or *CQ: Max Dist*
|
||||||
responder to your CQ.
|
to reply to the most distant responder.
|
||||||
|
|
||||||
NOTE: When *Auto-Seq* is enabled, the program de-activates *Enable Tx*
|
NOTE: When *Auto-Seq* is enabled, the program de-activates *Enable Tx*
|
||||||
at the end of each QSO. It is not intended that _WSJT-X_ should make
|
at the end of each QSO. It is not intended that _WSJT-X_ should make
|
||||||
|
@ -83,14 +83,14 @@ operator replacement.
|
||||||
|
|
||||||
The FT4, FT8, and MSK144 protocols support special messages optimized
|
The FT4, FT8, and MSK144 protocols support special messages optimized
|
||||||
for *NA VHF* and *EU VHF* contests. FT4 and FT8 also support messages
|
for *NA VHF* and *EU VHF* contests. FT4 and FT8 also support messages
|
||||||
for *ARRL Field Day*, *ARRL RTTY Roundup*, and the *WW Digi* contest.
|
for *ARRL Field Day*, *FT Roundup*, and the *WW Digi* contest.
|
||||||
The decoders recognize and decode these messages at any time.
|
The decoders recognize and decode these messages at any time.
|
||||||
Configure the program to automatically generate the required message
|
Configure the program to automatically generate the required message
|
||||||
types for contest exchanges and carry out suitable auto-sequencing by
|
types for contest exchanges and carry out suitable auto-sequencing by
|
||||||
selecting a supported operating activity on the *Settings | Advanced*
|
selecting a supported operating activity on the *Settings | Advanced*
|
||||||
tab. Model QSOs then proceed as follows, for each event type:
|
tab. Model QSOs then proceed as follows, for each event type:
|
||||||
|
|
||||||
*NA VHF Contest*
|
*NA VHF Contest* and *ARRL International Digital Contest*
|
||||||
|
|
||||||
CQ TEST K1ABC FN42
|
CQ TEST K1ABC FN42
|
||||||
K1ABC W9XYZ EN37
|
K1ABC W9XYZ EN37
|
||||||
|
@ -98,8 +98,9 @@ tab. Model QSOs then proceed as follows, for each event type:
|
||||||
K1ABC W9XYZ RRR
|
K1ABC W9XYZ RRR
|
||||||
W9XYZ K1ABC 73
|
W9XYZ K1ABC 73
|
||||||
|
|
||||||
Either callsign (or both) may have /R appended. You can use RR73 in
|
Either callsign (or both) may have /R appended to signify a Rover in a
|
||||||
place of RRR, and the final 73 is optional.
|
VHF contest. You can use RR73 in place of RRR, and the final 73 is
|
||||||
|
optional.
|
||||||
|
|
||||||
|
|
||||||
*EU VHF Contest*
|
*EU VHF Contest*
|
||||||
|
@ -124,7 +125,7 @@ to upgrade _WSJT-X_ if you will use *EU VHF Contest* messages.
|
||||||
W9XYZ K1ABC R 2B EMA
|
W9XYZ K1ABC R 2B EMA
|
||||||
K1ABC W9XYZ RR73
|
K1ABC W9XYZ RR73
|
||||||
|
|
||||||
*ARRL RTTY Roundup*
|
*FT Roundup*
|
||||||
|
|
||||||
CQ RU K1ABC FN42
|
CQ RU K1ABC FN42
|
||||||
K1ABC W9XYZ 579 WI
|
K1ABC W9XYZ 579 WI
|
||||||
|
@ -144,7 +145,7 @@ station's log and not the supposed QSO partner's. To avoid Not-in-Log
|
||||||
(NIL) penalties for yourself and others, we recommend the following
|
(NIL) penalties for yourself and others, we recommend the following
|
||||||
guidelines for contest logging with FT4, FT8, and MSK144:
|
guidelines for contest logging with FT4, FT8, and MSK144:
|
||||||
|
|
||||||
- Activate and learn to use the alternate F1-F6 bindings selectable
|
- Activate and learn to use the *Alternate F1-F6 bindings* selectable
|
||||||
on the *Settings | General* tab.
|
on the *Settings | General* tab.
|
||||||
|
|
||||||
- Always log a QSO when you have received RRR, RR73, or 73 from a
|
- Always log a QSO when you have received RRR, RR73, or 73 from a
|
||||||
|
@ -153,8 +154,9 @@ guidelines for contest logging with FT4, FT8, and MSK144:
|
||||||
- Log a QSO when you send RR73 or 73 if you are reasonably confident
|
- Log a QSO when you send RR73 or 73 if you are reasonably confident
|
||||||
it will be copied. But be sure to watch for any indication that it
|
it will be copied. But be sure to watch for any indication that it
|
||||||
was not copied, and then take appropriate action. For example, if
|
was not copied, and then take appropriate action. For example, if
|
||||||
you receive the Tx3 message (R plus contest exchange) again, hit F4
|
you receive the Tx3 message (R plus contest exchange) again, and if
|
||||||
to re-send your RR73.
|
you have activated the *Alternate F1-F6 bindings*, hit *F4* to
|
||||||
|
re-send your RR73.
|
||||||
|
|
||||||
[[COMP-CALL]]
|
[[COMP-CALL]]
|
||||||
=== Nonstandard Callsigns
|
=== Nonstandard Callsigns
|
||||||
|
|
|
@ -1,27 +1,48 @@
|
||||||
[[NEW_FEATURES]]
|
[[NEW_FEATURES]]
|
||||||
=== New in Version {VERSION}
|
=== New in Version {VERSION_MAJOR}.{VERSION_MINOR}
|
||||||
|
|
||||||
_WSJT-X 2.5.0_ introduces an enhanced Q65 decoder that measures and
|
- _WSJT-X 2.6_ implements new features supporting the ARRL
|
||||||
compensates for linear frequency drifts of Q65 signals. Activate this
|
International Digital Contest and its distance based scoring. The
|
||||||
feature by setting a spinner control *Max Drift* on the _WSJT-X_ main
|
*Call 1st* checkbox has been replaced by a drop-down control offering
|
||||||
window to a number greater than 0. We suggest a setting of 10 for
|
*CQ Max Dist* as an alternative. With this option selected, the
|
||||||
submode Q65-60A, the recommended submode for EME on 50 and 144 MHz,
|
program will select the reply to your CQ that yields the most contest
|
||||||
which will accommodate drift rates up to 20 Hz/minute. Similarly, we
|
points. In addition, a new window labeled *Active Stations* displays
|
||||||
suggest *Max Drift* = 40 for submode Q65-15C, used for for 10 GHz QSOs
|
a list of received but unworked callsigns, sorted in decreasing order
|
||||||
(up to 900 km) via aircraft scatter and drift rates up to about 20
|
of potential contest points. Click on a line in this window to call
|
||||||
Hz/s.
|
that station.
|
||||||
|
|
||||||
|
- Decoding performance for FT8 and Q65 has been improved in a variety
|
||||||
|
of situations with available _a priori_ (AP) information.
|
||||||
|
|
||||||
|
- *Echo* mode now offers a *Clear Avg* button and produces reliable
|
||||||
|
measurements of SNR even when Doppler spread is large. The *Measure*
|
||||||
|
function can be used to measure SNR for a received unmodulated carrier
|
||||||
|
-- for example, a key-down test signal emitted by another station and
|
||||||
|
reflected from the Moon.
|
||||||
|
|
||||||
|
- New buttons on the main window allow quick changes between modes
|
||||||
|
FT4, FT8, MSK144, Q65, and JT65. Another new button allows toggling
|
||||||
|
FT8 Hound mode ON or OFF.
|
||||||
|
|
||||||
|
- Optional color highlighting is provided for specified DX Call and DX
|
||||||
|
Grid, and for messages containing RR73 or 73.
|
||||||
|
|
||||||
|
- New options are provided for writing to file ALL.TXT. You can
|
||||||
|
request automatic starting of a new file every month or every year,
|
||||||
|
and you can disable writing altogether.
|
||||||
|
|
||||||
|
- Settings for T/R period and Submode are remembered by mode when you
|
||||||
|
switch directly between (for example) MSK144-15, Q65-60A, JT65-C, or
|
||||||
|
FST4-120.
|
||||||
|
|
||||||
|
- Tx and Rx audio frequencies are remembered and restored when you
|
||||||
|
return from a mode that sets a default frequency 1500 Hz (MSK144,
|
||||||
|
FST4W, Echo, WSPR, FreqCal), then switching back to FT4, FT8, Q65,
|
||||||
|
JT65, or FST4.
|
||||||
|
|
||||||
|
- Other changes include bug fixes and rig control for some new radios.
|
||||||
|
|
||||||
|
- _MAP65 3.0_ (available for Windows only) now sends additional
|
||||||
|
information to file azel.dat and offers digital scaling of input I/Q
|
||||||
|
data.
|
||||||
|
|
||||||
On the Windows platform only, _WSJT-X 2.5.0_ installations now include
|
|
||||||
an early version of _MAP65 3.0_. This program works together with
|
|
||||||
suitable hardware that converts RF to baseband. The hardware/software
|
|
||||||
combination implements a wideband, highly optimized receiver for the
|
|
||||||
Q65 and JT65 protocols, with matching transmitting features that
|
|
||||||
require a standard SSB transceiver. _MAP65_ is effective in both
|
|
||||||
single-polarization and dual-polarization systems. If two
|
|
||||||
polarization channels are available, _MAP65_ determines and matches
|
|
||||||
the linear polarization angle of each decodable signal. This
|
|
||||||
capability provides a major advantage for efficient EME communication
|
|
||||||
on bands up to 432 MHz. A single-channel _MAP65_ system works
|
|
||||||
extremely well for EME on 1296 MHz and higher bands, displaying all
|
|
||||||
signals in a 90 kHz sub-band and decoding all the Q65 and JT65
|
|
||||||
signals.
|
|
||||||
|
|
|
@ -263,8 +263,8 @@ which the probability of decoding is 50% or higher.
|
||||||
|
|
||||||
[[SLOW_TAB]]
|
[[SLOW_TAB]]
|
||||||
.Parameters of Slow Modes
|
.Parameters of Slow Modes
|
||||||
[width="100%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2,^2",frame=topbot,options="header"]
|
[width="100%",cols="3h,^3,^2,^1,6*^2",frame=topbot,options="header"]
|
||||||
|===============================================================================
|
|===
|
||||||
|Mode |FEC Type |(n,k) | Q|Modulation type|Keying rate (Baud)|Bandwidth (Hz)
|
|Mode |FEC Type |(n,k) | Q|Modulation type|Keying rate (Baud)|Bandwidth (Hz)
|
||||||
|Sync Energy|Tx Duration (s)|S/N Threshold (dB)
|
|Sync Energy|Tx Duration (s)|S/N Threshold (dB)
|
||||||
|FST4-15 |LDPC | (240,101)| 4| 4-GFSK| 16.67 | 66.7 | 0.25| 9.6 | -20.7
|
|FST4-15 |LDPC | (240,101)| 4| 4-GFSK| 16.67 | 66.7 | 0.25| 9.6 | -20.7
|
||||||
|
@ -289,7 +289,7 @@ which the probability of decoding is 50% or higher.
|
||||||
|FST4W-300 |LDPC | (240,74)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -36.8
|
|FST4W-300 |LDPC | (240,74)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -36.8
|
||||||
|FST4W-900 |LDPC | (240,74)| 4| 4-GFSK| 0.180 | 0.72 | 0.25| 887.5 | -41.7
|
|FST4W-900 |LDPC | (240,74)| 4| 4-GFSK| 0.180 | 0.72 | 0.25| 887.5 | -41.7
|
||||||
|FST4W-1800 |LDPC | (240,74)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -44.8
|
|FST4W-1800 |LDPC | (240,74)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -44.8
|
||||||
|===============================================================================
|
|===
|
||||||
|
|
||||||
LDPC = Low Density Parity Check
|
LDPC = Low Density Parity Check
|
||||||
RS = Reed Solomon
|
RS = Reed Solomon
|
||||||
|
@ -304,7 +304,7 @@ comparable to tone spacing.
|
||||||
[[SLOW_SUBMODES]]
|
[[SLOW_SUBMODES]]
|
||||||
.Parameters of Slow Submodes JT4, JT9, and JT65 with Selectable Tone Spacings
|
.Parameters of Slow Submodes JT4, JT9, and JT65 with Selectable Tone Spacings
|
||||||
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|
||||||
|=====================================
|
|===
|
||||||
|Mode |Tone Spacing |BW (Hz)|S/N (dB)
|
|Mode |Tone Spacing |BW (Hz)|S/N (dB)
|
||||||
|JT4A |4.375| 17.5 |-23
|
|JT4A |4.375| 17.5 |-23
|
||||||
|JT4B |8.75 | 30.6 |-22
|
|JT4B |8.75 | 30.6 |-22
|
||||||
|
@ -324,18 +324,18 @@ comparable to tone spacing.
|
||||||
|JT65A |2.692| 177.6 |-25
|
|JT65A |2.692| 177.6 |-25
|
||||||
|JT65B |5.383| 352.6 |-25
|
|JT65B |5.383| 352.6 |-25
|
||||||
|JT65C |10.767| 702.5 |-25
|
|JT65C |10.767| 702.5 |-25
|
||||||
|=====================================
|
|===
|
||||||
|
|
||||||
.Parameters of Q65 Submodes
|
.Parameters of Q65 Submodes
|
||||||
[width="100%",cols="h,5*^",frame=topbot,options="header"]
|
[width="100%",cols="h,5*^",frame=topbot,options="header"]
|
||||||
|=====================================
|
|===
|
||||||
|T/R Period (s) |A Spacing Width (Hz)|B Spacing Width (Hz)|C Spacing Width (Hz)|D Spacing Width (Hz)|E Spacing Width (Hz)
|
|T/R Period (s) |A Spacing Width (Hz)|B Spacing Width (Hz)|C Spacing Width (Hz)|D Spacing Width (Hz)|E Spacing Width (Hz)
|
||||||
|15|6.67     4.33|13.33     867|26.67     1733|N/A|N/A
|
|15|6.67     4.33|13.33     867|26.67     1733|N/A|N/A
|
||||||
|30|3.33     217|6.67     433|13.33     867| 26.67     1733| N/A
|
|30|3.33     217|6.67     433|13.33     867| 26.67     1733| N/A
|
||||||
|60|1.67     108|3.33     217|6.67     433|13.33     867|26.67     1733
|
|60|1.67     108|3.33     217|6.67     433|13.33     867|26.67     1733
|
||||||
|120|0.75     49|1.50     98|3.00     195|6.00     390| 12.00     780
|
|120|0.75     49|1.50     98|3.00     195|6.00     390| 12.00     780
|
||||||
|300|0.29     19|0.58     38|1.16     75|2.31     150|4.63     301
|
|300|0.29     19|0.58     38|1.16     75|2.31     150|4.63     301
|
||||||
|=====================================
|
|===
|
||||||
|
|
||||||
[[FAST_MODES]]
|
[[FAST_MODES]]
|
||||||
=== Fast Modes
|
=== Fast Modes
|
||||||
|
@ -390,8 +390,8 @@ and your QSO partner ± 200 Hz.
|
||||||
==== Summary
|
==== Summary
|
||||||
|
|
||||||
.Parameters of Fast Modes
|
.Parameters of Fast Modes
|
||||||
[width="90%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2",frame="topbot",options="header"]
|
[width="90%",cols="3h,^3,^2,^1,5*^2",frame="topbot",options="header"]
|
||||||
|=====================================================================
|
|===
|
||||||
|Mode |FEC Type |(n,k) | Q|Modulation Type|Keying rate (Baud)
|
|Mode |FEC Type |(n,k) | Q|Modulation Type|Keying rate (Baud)
|
||||||
|Bandwidth (Hz)|Sync Energy|Tx Duration (s)
|
|Bandwidth (Hz)|Sync Energy|Tx Duration (s)
|
||||||
|JT9E |K=32, r=1/2|(206,72)| 8| 9-FSK| 25.0 | 225 | 0.19| 3.400
|
|JT9E |K=32, r=1/2|(206,72)| 8| 9-FSK| 25.0 | 225 | 0.19| 3.400
|
||||||
|
@ -400,4 +400,4 @@ and your QSO partner ± 200 Hz.
|
||||||
|JT9H |K=32, r=1/2|(206,72)| 8| 9-FSK|200.0 | 1800 | 0.19| 0.425
|
|JT9H |K=32, r=1/2|(206,72)| 8| 9-FSK|200.0 | 1800 | 0.19| 0.425
|
||||||
|MSK144 |LDPC |(128,90)| 2| OQPSK| 2000 | 2400 | 0.11| 0.072
|
|MSK144 |LDPC |(128,90)| 2| OQPSK| 2000 | 2400 | 0.11| 0.072
|
||||||
|MSK144 Sh|LDPC |(32,16) | 2| OQPSK| 2000 | 2400 | 0.20| 0.020
|
|MSK144 Sh|LDPC |(32,16) | 2| OQPSK| 2000 | 2400 | 0.20| 0.020
|
||||||
|=====================================================================
|
|===
|
||||||
|
|
|
@ -38,15 +38,14 @@ with twice or four times the normal tone spacing. This feature is
|
||||||
intended for use with specialized LF/MF transmitters that divide
|
intended for use with specialized LF/MF transmitters that divide
|
||||||
generated frequencies by 2 or 4 as part of the transmission process.
|
generated frequencies by 2 or 4 as part of the transmission process.
|
||||||
|
|
||||||
_Special Operating Activity: Generation of FT4, FT8, and MSK144
|
_Special Operating Activity_
|
||||||
messages_
|
|
||||||
|
|
||||||
- Check this box and select the type of activity to enable
|
- Check this box and select the type of activity to enable
|
||||||
auto-generation of special message formats for contesting and
|
auto-generation of special message formats for contesting and
|
||||||
DXpeditions. For *ARRL Field Day*, enter your operating Class and
|
DXpeditions. For *ARRL Field Day*, enter your operating Class and
|
||||||
ARRL/RAC section; for *ARRL RTTY Roundup*, enter your state or province.
|
ARRL/RAC section; for *FT Roundup*, enter your state or province.
|
||||||
Use “DX” for section or state if you are not in the US or Canada. In
|
Use “DX” for section or state if you are not in the US or Canada. In
|
||||||
the RTTY Roundup, Stations in Alaska and Hawaii should enter “DX”.
|
the FT Roundup, Stations in Alaska and Hawaii should enter “DX”.
|
||||||
|
|
||||||
- Check *Fox* if you are a DXpedition station operating in FT8
|
- Check *Fox* if you are a DXpedition station operating in FT8
|
||||||
DXpedition Mode. Check *Hound* if you wish to make QSOs with such a
|
DXpedition Mode. Check *Hound* if you wish to make QSOs with such a
|
||||||
|
|
|
@ -39,7 +39,7 @@ image::RadioTab.png[align="center",alt="Radio Tab"]
|
||||||
+
|
+
|
||||||
|
|
||||||
NOTE: A special value of *USB* is available for custom USB devices
|
NOTE: A special value of *USB* is available for custom USB devices
|
||||||
like those used by some SDR kits. This is not the same a virtual
|
like those used by some SDR kits. This is not the same as the virtual
|
||||||
serial port provided by USB connected transceivers and CAT
|
serial port provided by USB connected transceivers and CAT
|
||||||
interfaces, for those use the COM or serial port name that
|
interfaces, for those use the COM or serial port name that
|
||||||
refers to them.
|
refers to them.
|
||||||
|
|
|
@ -7,8 +7,11 @@ messages such as the examples shown below.
|
||||||
|
|
||||||
image::tx-macros.png[align="center",alt="Tx Macros Screen"]
|
image::tx-macros.png[align="center",alt="Tx Macros Screen"]
|
||||||
|
|
||||||
- To add a new message to the list, enter the desired text (up to 13
|
- To add a new message to the list, enter the desired text in the
|
||||||
characters) in the entry field at top, then click *Add*.
|
entry field at top, then click *Add*.
|
||||||
|
|
||||||
|
- Remember that a transmitted free-text message is limited to 13
|
||||||
|
characters, including blanks.
|
||||||
|
|
||||||
- To remove an unwanted message, click on the message and then on
|
- To remove an unwanted message, click on the message and then on
|
||||||
*Delete*.
|
*Delete*.
|
||||||
|
@ -18,3 +21,7 @@ new order will be preserved when _WSJT-X_ is restarted.
|
||||||
|
|
||||||
- Messages can also be added from the main window's *Tx5*
|
- Messages can also be added from the main window's *Tx5*
|
||||||
field. Simply hit [Enter] after the message has been entered.
|
field. Simply hit [Enter] after the message has been entered.
|
||||||
|
|
||||||
|
- If the first word of a message is $DXCALL (or the shortened form
|
||||||
|
$DX), that word will be replaced on transmission by the base callsign
|
||||||
|
in the *DxCall* field.
|
||||||
|
|
|
@ -4,8 +4,8 @@ The best source of help in setting up your station or configuring
|
||||||
_WSJT-X_ is the {wsjtx_group} at email address
|
_WSJT-X_ is the {wsjtx_group} at email address
|
||||||
wsjtx@groups.io. The chances are good that someone with
|
wsjtx@groups.io. The chances are good that someone with
|
||||||
similar interests and equipment has already solved your problem and
|
similar interests and equipment has already solved your problem and
|
||||||
will be happy to help. To post messages here you will need to join
|
will be happy to help. To post messages here you will need to
|
||||||
the group.
|
{wsjt-devel}.
|
||||||
|
|
||||||
=== Bug Reports
|
=== Bug Reports
|
||||||
|
|
||||||
|
@ -13,8 +13,7 @@ One of your responsibilities as a _WSJT-X_ user is to help the
|
||||||
volunteer programmers to make the program better. Bugs may be
|
volunteer programmers to make the program better. Bugs may be
|
||||||
reported to the WSJTX forum on Groups.io {wsjtgroup_mail} or the WSJT
|
reported to the WSJTX forum on Groups.io {wsjtgroup_mail} or the WSJT
|
||||||
Developers list (wsjt-devel@lists.sourceforge.net). Again, you will
|
Developers list (wsjt-devel@lists.sourceforge.net). Again, you will
|
||||||
need to join the group or subscribe to the list. You can register for
|
need to {wsjtx_group2} or {wsjt-devel2}.
|
||||||
the list {wsjt-devel}.
|
|
||||||
|
|
||||||
To be useful, bug reports should include at least the following
|
To be useful, bug reports should include at least the following
|
||||||
information:
|
information:
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Status=review
|
||||||
|
|
||||||
|
[[DOWNLOAD_SAMPLES]]
|
||||||
|
=== Download Samples
|
||||||
|
|
||||||
|
The following steps will download sample audio Wave files that were originally recorded
|
||||||
|
by WSJT-X. These files can be read in and processed by WSJT-X to simulate realtime
|
||||||
|
operation.
|
||||||
|
|
||||||
|
- Select *Download samples...* from the *Help* menu.
|
||||||
|
|
||||||
|
- Download some or all of the available sample files using checkboxes
|
||||||
|
on the screen shown below. For this tutorial you will need at least
|
||||||
|
the FT8 files.
|
||||||
|
|
||||||
|
image::download_samples.png[width=400,align="center",alt="Download Samples"]
|
|
@ -1,121 +0,0 @@
|
||||||
// Status=review
|
|
||||||
.Main Window:
|
|
||||||
- Select *JT9+JT65* on the *Mode* menu.
|
|
||||||
- Toggle the *Tx mode* button to read *Tx JT65 #*, and set the Tx and Rx
|
|
||||||
frequencies to 1718 Hz.
|
|
||||||
- Double-click on *Erase* to clear both text windows.
|
|
||||||
|
|
||||||
.Wide Graph Settings:
|
|
||||||
|
|
||||||
- *Bins/Pixel* = 7
|
|
||||||
- *JT65 .... JT9* = 2500
|
|
||||||
- Adjust the width of the Wide Graph window so that the upper
|
|
||||||
frequency limit is approximately 4000 Hz.
|
|
||||||
|
|
||||||
.Open a Wave File:
|
|
||||||
|
|
||||||
- Select *File | Open* and navigate to +...\save\samples\JT9+JT65\130610_2343.wav+.
|
|
||||||
The waterfall should look something like this:
|
|
||||||
|
|
||||||
//.130610_2343.wav Decode
|
|
||||||
[[X14]]
|
|
||||||
image::130610_2343-wav-80.png[align="left",alt="Wide Graph Decode 130610_2343"]
|
|
||||||
|
|
||||||
The position of the blue marker on the waterfall scale is
|
|
||||||
set by the spinner control *JT65 nnnn JT9*, where nnnn is an audio
|
|
||||||
frequency in Hz. In *JT9+JT65* mode the program will automatically
|
|
||||||
decode JT9 signals only above this frequency. JT65 signals will be
|
|
||||||
decoded over the full displayed frequency range.
|
|
||||||
|
|
||||||
JT9 signals appear in the *Cumulative* spectrum as nearly rectangular
|
|
||||||
shapes about 16 Hz wide. They have no clearly visible sync tone like
|
|
||||||
the one at the low-frequency edge of all JT65 signals. By convention
|
|
||||||
the nominal frequency of both JT9 and JT65 signals is taken to be that
|
|
||||||
of the lowest tone, at the left edge of its spectrum.
|
|
||||||
|
|
||||||
This sample file contains 17 decodable signals — nine in JT65 mode
|
|
||||||
(flagged with the character # in the decoded text windows), and eight
|
|
||||||
in JT9 mode (flagged with @). On multi-core computers the decoders
|
|
||||||
for JT9 and JT65 modes run simultaneously, so their results will be
|
|
||||||
interspersed. The *Band Activity* window contains all decodes (you
|
|
||||||
might need to scroll back in the window to see some of them). A
|
|
||||||
signal at the frequency specified by the green marker is given
|
|
||||||
decoding priority, and its message is displayed also in the *Rx
|
|
||||||
Frequency* window.
|
|
||||||
|
|
||||||
[[FigDecodes]]
|
|
||||||
image::decodes.png[align="center"]
|
|
||||||
|
|
||||||
- Confirm that mouse-click behavior is similar to that described
|
|
||||||
earlier, in <<TUT_EX1,Example 1>>. _WSJT-X_ automatically determines
|
|
||||||
the mode of each JT9 or JT65 message.
|
|
||||||
|
|
||||||
+
|
|
||||||
|
|
||||||
TIP: When you double-click on a signal in the waterfall it will be
|
|
||||||
properly decoded even if on the "`wrong`" side of the *JT65 nnnn JT9*
|
|
||||||
marker. The Tx mode automatically switches to that of the decoded
|
|
||||||
signal and the Rx and Tx frequency markers on the waterfall scale
|
|
||||||
resize themselves accordingly. When selecting a JT65 signal, click on
|
|
||||||
the sync tone at its left edge.
|
|
||||||
|
|
||||||
- Double-click on the waterfall near 815 Hz: a JT65 message
|
|
||||||
originating from W7VP will be decoded and appear in the *Rx Frequency*
|
|
||||||
window. Between the *UTC* and *Freq* columns on the decoded text line
|
|
||||||
you will find *dB*, the measured signal-to-noise ratio, and *DT*, the
|
|
||||||
signal's time offset in seconds relative to your computer clock.
|
|
||||||
|
|
||||||
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|
|
||||||
|===
|
|
||||||
|UTC|dB|DT|Freq|Mode|Message
|
|
||||||
|+2343+|+-7+|+0.3+|+815+|+#+|+KK4DSD W7VP -16+
|
|
||||||
|===
|
|
||||||
|
|
||||||
- Double-click on the waterfall at 3196 Hz. The program will decode a
|
|
||||||
JT9 message from IZ0MIT:
|
|
||||||
|
|
||||||
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|
|
||||||
|===
|
|
||||||
|UTC|dB|DT|Freq|Mode|Message
|
|
||||||
|+2343+|+-8+|+0.3+|+3196+|+@+|+WB8QPG IZ0MIT -11+
|
|
||||||
|===
|
|
||||||
|
|
||||||
- Scroll back in the *Band Activity* window and double-click on the
|
|
||||||
message `CQ DL7ACA JO40`. The program will set *Tx mode* to JT65 and
|
|
||||||
the Rx frequency to that of DL7ACA, 975 Hz. If you hold down the
|
|
||||||
*Ctrl* key, both Rx and Tx frequencies will be moved. If you had
|
|
||||||
checked *Double-click on call sets Tx Enable* on the *Setup* menu, the
|
|
||||||
program would configure itself to begin a transmission and start a QSO
|
|
||||||
with DL7ACA.
|
|
||||||
|
|
||||||
- Hold *Ctrl* down and double-click on the decoded JT65 message `CQ
|
|
||||||
TA4A KM37`. The program will set Tx mode to JT9 and the Rx and Tx
|
|
||||||
frequencies to 3567 Hz. The program is now configured properly for a
|
|
||||||
JT9 QSO with TA4A.
|
|
||||||
|
|
||||||
.Reopen the First Sample File:
|
|
||||||
- Select *File | Open* and navigate to `...\save\samples\130418_1742.wav`.
|
|
||||||
|
|
||||||
Taking full advantage of the wide-band, dual-mode capability of
|
|
||||||
_WSJT-X_ requires a receiver bandwidth of at least 4 kHz. These
|
|
||||||
data were recorded with a much narrower Rx bandwidth, roughly 200 to
|
|
||||||
2400 Hz. If you have no Rx filter wider than about 2.7 kHz, you will
|
|
||||||
be using data like this. For best viewing, adjust *Bins/Pixel* and the
|
|
||||||
width of the Wide Graph so that only the active part of the spectrum
|
|
||||||
shows, say 200 to 2400 Hz. Re-open the example file after any change of
|
|
||||||
*Bins/Pixel* or Wide Graph width, to refresh the waterfall.
|
|
||||||
|
|
||||||
The signals in this file are all JT9 signals. To decode them
|
|
||||||
automatically in *JT9+JT65* mode you’ll need to move the *JT65 nnnn JT9*
|
|
||||||
delimiter down to 1000 Hz or less.
|
|
||||||
|
|
||||||
.Waterfall Controls
|
|
||||||
|
|
||||||
Now is a good time to experiment with the *Start* control and the
|
|
||||||
sliders controlling gain and zero-point of the waterfall and spectrum
|
|
||||||
plots. *Start* determines the frequency displayed at the left side of
|
|
||||||
the waterfall scale. Sliders set the baseline level and gain for the
|
|
||||||
waterfall and the several types of spectra. Good starting values
|
|
||||||
should be close to mid-scale. You might want to uncheck *Flatten*
|
|
||||||
when adjusting the sliders. Re-open the wave file after each change,
|
|
||||||
to see the new results.
|
|
|
@ -1,27 +1,92 @@
|
||||||
// Status=review
|
// Status=review
|
||||||
.Main Window:
|
.Main Window:
|
||||||
- Select *FT8* on the *Mode* menu.
|
- Click the *Stop* button on the main window to halt any data acquisition.
|
||||||
|
- Select *FT8* from the *Mode* menu and *Deep* from the *Decode* menu.
|
||||||
- Double-click on *Erase* to clear both text windows.
|
- Double-click on *Erase* to clear both text windows.
|
||||||
|
|
||||||
.Wide Graph Settings:
|
|
||||||
|
|
||||||
- *Bins/Pixel* = 5, *Start* = 100 Hz, *N Avg* = 2
|
|
||||||
- Adjust the width of the Wide Graph window so that the upper
|
|
||||||
frequency limit is approximately 3300 Hz.
|
|
||||||
|
|
||||||
.Open a Wave File:
|
.Open a Wave File:
|
||||||
|
|
||||||
- Select *File | Open* and navigate to
|
- Select *File | Open log directory* and navigate to
|
||||||
+...\save\samples\FT8\181201_180245.wav+. The waterfall and Band
|
+...\save\samples\FT8\210703_133430.wav+. The waterfall and Band
|
||||||
Activity window should look something like the following screen shots.
|
Activity/Rx Frequency windows should look something like the following screen shots:
|
||||||
(This recording was made during the "FT8 Roundup" contest, so most
|
|
||||||
transmissions happen to be using *RTTY Roundup* message formats.)
|
- You may want to pretend you are K1JT
|
||||||
|
by entering that callsign temporarily as *My Call* on the
|
||||||
|
*Settings | General* tab. Your results should then be identical to
|
||||||
|
those shown in the screen shot below. Don't forget to change *My Call*
|
||||||
|
back to your own call when you are done!
|
||||||
|
|
||||||
[[X15]]
|
[[X15]]
|
||||||
image::FT8_waterfall.png[align="left",alt="Wide Graph Decode 170709_135615"]
|
image::FT8_waterfall.png[align="left",alt="Wide Graph Decode 210703_133430"]
|
||||||
|
|
||||||
image::ft8_decodes.png[align="left"]
|
image::ft8_decodes.png[align="left"]
|
||||||
|
|
||||||
|
|
||||||
|
.Decoding Overview
|
||||||
|
|
||||||
|
Decoding takes place at the end of a receive sequence. With *Decode* set
|
||||||
|
to *Deep*, three decoding passes will be done and the *Decode* button on the
|
||||||
|
mainwindow will illuminate three times, once for each pass.
|
||||||
|
The first decoding attempt in each decoding pass is done at the selected Rx frequency,
|
||||||
|
indicated by the U-shaped green marker on the waterfall frequency
|
||||||
|
scale. All decodes appear in the left (*Band Activity*) window. The right
|
||||||
|
(*Rx Frequency*) text window displays any decodes obtained at the current
|
||||||
|
Rx frequency along with any decodes addressed to *My Call* (K1JT in this case).
|
||||||
|
The red marker on the waterfall scale indicates your
|
||||||
|
Tx frequency.
|
||||||
|
|
||||||
|
Twenty one FT8 signals are decoded from the example file. The number
|
||||||
|
of decodes is shown in a box at the bottom of the main window.
|
||||||
|
When this file was recorded HA5WA was finishing a QSO with K1JT, and
|
||||||
|
his 73 message is shown in red because it is addressed to *My Call* (in this case K1JT).
|
||||||
|
By default, lines containing `CQ`
|
||||||
|
are highlighted in green, and lines with *My Call* (K1JT)
|
||||||
|
in red. Notice that K1JT has two callers; HA0DU and EA3AGB.
|
||||||
|
|
||||||
|
[[X13]]
|
||||||
|
.Decoding Controls
|
||||||
|
|
||||||
|
To gain some feeling for controls frequently used when making QSOs,
|
||||||
|
try double-clicking with the mouse on the decoded text lines and on the
|
||||||
|
waterfall spectral display. You should be able to confirm the
|
||||||
|
following behavior:
|
||||||
|
|
||||||
|
- Double-click on one of the decoded *CQ* messages highlighted in
|
||||||
|
green. These actions produce the following results:
|
||||||
|
|
||||||
|
** Callsign and locator of the station calling CQ are copied to the *DX
|
||||||
|
Call* and *DX Grid* entry fields.
|
||||||
|
|
||||||
|
** Messages are generated for a standard minimal QSO.
|
||||||
|
|
||||||
|
** The *Tx even* box is checked or cleared appropriately, so that you
|
||||||
|
will transmit in the proper (odd or even) minutes.
|
||||||
|
|
||||||
|
** The Rx frequency marker is moved to the frequency of the CQing
|
||||||
|
station.
|
||||||
|
|
||||||
|
** You can modify the double-click behavior by holding down the
|
||||||
|
*Shift* key to move only the Tx frequency or the *Ctrl* key to move
|
||||||
|
both Rx and Tx frequencies. (On a Mac computer, use the *command* key
|
||||||
|
instead of *Ctrl*).
|
||||||
|
|
||||||
|
** In addition, if *Double-click on call sets Tx enable* is checked on the
|
||||||
|
*Settings | General* tab then *Enable Tx* will be activated
|
||||||
|
so that a transmission will start automatically at the proper time.
|
||||||
|
|
||||||
|
|
||||||
|
+
|
||||||
|
|
||||||
|
NOTE: You can prevent your Tx frequency from being changed by checking the
|
||||||
|
box *Hold Tx Freq*.
|
||||||
|
|
||||||
|
- Double-click on the decoded message `K1JT HA0DU KN07`, highlighted
|
||||||
|
in red. Results will be similar to those in the previous step. The Tx
|
||||||
|
frequency (red marker) is not moved unless *Shift* or *Ctrl* is held
|
||||||
|
down. Messages highlighted in red are usually in response to your own
|
||||||
|
CQ or from a tail-ender, and you probably want your Tx frequency to
|
||||||
|
stay where it was.
|
||||||
|
|
||||||
- Click with the mouse anywhere on the waterfall display. The green Rx
|
- Click with the mouse anywhere on the waterfall display. The green Rx
|
||||||
frequency marker will jump to your selected frequency, and the Rx
|
frequency marker will jump to your selected frequency, and the Rx
|
||||||
frequency control on the main window will be updated accordingly.
|
frequency control on the main window will be updated accordingly.
|
||||||
|
@ -38,11 +103,12 @@ things just described and also invokes the decoder in a small range
|
||||||
around the Rx frequency. To decode a particular signal, double-click
|
around the Rx frequency. To decode a particular signal, double-click
|
||||||
near the left edge of its waterfall trace.
|
near the left edge of its waterfall trace.
|
||||||
|
|
||||||
- Now double-click on any of the lines of decoded text in the Band
|
- Ctrl-double-click on a signal to set both Rx and Tx frequencies and
|
||||||
Activity window. Any line will show the same behavior, setting
|
decode at the new frequency.
|
||||||
Rx frequency to that of the selected message and leaving Tx frequency
|
|
||||||
unchanged. To change both Rx and Tx frequencies, hold *Ctrl* down
|
- Click *Erase* to clear the right window.
|
||||||
when double-clicking.
|
|
||||||
|
- Double-click *Erase* to clear both text windows.
|
||||||
|
|
||||||
TIP: To avoid QRM from competing callers, it is usually best
|
TIP: To avoid QRM from competing callers, it is usually best
|
||||||
to answer a CQ on a different frequency from that of the CQing
|
to answer a CQ on a different frequency from that of the CQing
|
||||||
|
@ -53,6 +119,11 @@ box *Hold Tx Freq*.
|
||||||
TIP: Keyboard shortcuts *Shift+F11* and *Shift+F12* provide an easy
|
TIP: Keyboard shortcuts *Shift+F11* and *Shift+F12* provide an easy
|
||||||
way to move your Tx frequency down or up in 60 Hz steps.
|
way to move your Tx frequency down or up in 60 Hz steps.
|
||||||
|
|
||||||
|
TIP: Sliders and spinner controls respond to *Arrow* key presses
|
||||||
|
and *Page Up/Down* key presses, with the *Page* keys moving the
|
||||||
|
controls in larger steps. You can also type numbers directly into
|
||||||
|
the spinner controls or use the mouse wheel.
|
||||||
|
|
||||||
TIP: An online {ft8_tips} by ZL2IFB offers many additional tips on
|
TIP: An online {ft8_tips} by ZL2IFB offers many additional tips on
|
||||||
operating procedures.
|
operating procedures.
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ frequency limit is approximately 3300 Hz.
|
||||||
+...\save\samples\FT4\200514_182053.wav+. The waterfall and Band
|
+...\save\samples\FT4\200514_182053.wav+. The waterfall and Band
|
||||||
Activity window should look something like the following screen shots.
|
Activity window should look something like the following screen shots.
|
||||||
This sample file was recorded during a practice contest test session, so
|
This sample file was recorded during a practice contest test session, so
|
||||||
most of the decoded messages use the *RTTY Roundup* message formats.
|
most of the decoded messages use the *FT Roundup* message formats.
|
||||||
|
|
||||||
[[X16]]
|
[[X16]]
|
||||||
image::ft4_waterfall.png[align="left",alt="Wide Graph Decode FT4"]
|
image::ft4_waterfall.png[align="left",alt="Wide Graph Decode FT4"]
|
||||||
|
@ -56,7 +56,7 @@ and treat it as if you had double-clicked on that line of decoded
|
||||||
text. Here "best potential QSO partner" means "New Multiplier" (1st
|
text. Here "best potential QSO partner" means "New Multiplier" (1st
|
||||||
priority) or "New Call on Band" (2nd priority). "New Multiplier" is
|
priority) or "New Call on Band" (2nd priority). "New Multiplier" is
|
||||||
currently interpreted to mean "New DXCC"; a more broadly defined
|
currently interpreted to mean "New DXCC"; a more broadly defined
|
||||||
multiplier category (for the ARRL RTTY Roundup rules) will be
|
multiplier category (for the FT Roundup rules) will be
|
||||||
implemented in due course. We may provide additional priority
|
implemented in due course. We may provide additional priority
|
||||||
rankings, for example “New Grid on Band” (useful for North American
|
rankings, for example “New Grid on Band” (useful for North American
|
||||||
VHF contests), sorting by signal strength, etc.
|
VHF contests), sorting by signal strength, etc.
|
||||||
|
@ -66,7 +66,7 @@ supposed to mean. This is done by configuring suitable options on the
|
||||||
*Settings | Colors* tab. Selection and ordering of color-highlighting
|
*Settings | Colors* tab. Selection and ordering of color-highlighting
|
||||||
options determines what potential QSO partners will be chosen by the
|
options determines what potential QSO partners will be chosen by the
|
||||||
"Best S+P" feature. Optimum choices will be different for different
|
"Best S+P" feature. Optimum choices will be different for different
|
||||||
contests. In a contest using RTTY Roundup rules we recommend
|
contests. In a contest using FT Roundup rules we recommend
|
||||||
activating *My Call in message*, *New DXCC*, *New Call on Band*, *CQ
|
activating *My Call in message*, *New DXCC*, *New Call on Band*, *CQ
|
||||||
in message* and *Transmitted message*, reading from top to bottom.
|
in message* and *Transmitted message*, reading from top to bottom.
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ image::FST4_center.png[align="center"]
|
||||||
It's best to keep the decoding range fairly small, since QRM and
|
It's best to keep the decoding range fairly small, since QRM and
|
||||||
transmissions in other modes or sequence lengths will slow down the
|
transmissions in other modes or sequence lengths will slow down the
|
||||||
decoding process (and of course will be undecodable). By checking
|
decoding process (and of course will be undecodable). By checking
|
||||||
*Single decode* on the the *File | Settings | General* tab, you can
|
*Single decode* on the *File | Settings | General* tab, you can
|
||||||
further limit the decoding range to the setting of *F Tol* on
|
further limit the decoding range to the setting of *F Tol* on
|
||||||
either side of *Rx Freq*.
|
either side of *Rx Freq*.
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
// Status=review
|
|
||||||
|
|
||||||
- Click the *Stop* button on the main window to halt any data acquisition.
|
|
||||||
|
|
||||||
- Select *JT9* from the *Mode* menu and *Deep* from the *Decode* menu.
|
|
||||||
|
|
||||||
- Set the audio frequencies to *Tx 1224 Hz* and *Rx 1224 Hz*.
|
|
||||||
|
|
||||||
+
|
|
||||||
|
|
||||||
TIP: Sliders and spinner controls respond to *Arrow* key presses
|
|
||||||
and *Page Up/Down* key presses, with the *Page* keys moving the
|
|
||||||
controls in larger steps. You can also type numbers directly into
|
|
||||||
the spinner controls or use the mouse wheel.
|
|
||||||
|
|
||||||
[[DOWNLOAD_SAMPLES]]
|
|
||||||
=== Download Samples
|
|
||||||
|
|
||||||
- Select *Download samples...* from the *Help* menu.
|
|
||||||
|
|
||||||
- Download some or all of the available sample files using checkboxes
|
|
||||||
on the screen shown below. For this tutorial you will need at least
|
|
||||||
the JT9 and JT9+JT65 files.
|
|
||||||
|
|
||||||
image::download_samples.png[align="center",alt="Downlod Samples"]
|
|
|
@ -1,13 +1,46 @@
|
||||||
// Status=review
|
// Status=review
|
||||||
|
|
||||||
- *Bins/Pixel* = 4
|
The WSJT-X Wide Graph window displays the frequency spectrum of the received audio. Usually, the
|
||||||
- *Start* = 200 Hz
|
upper portion of the window shows a waterfall plot of the frequency spectrum (a spectrogram) and
|
||||||
- *N Avg* = 5
|
a line plot of the current or average spectrum. Controls at the bottom of the window are used to
|
||||||
- *Palette* = Digipan
|
set up the displayed audio frequency range, color palette, and scaling of the spectrum displays.
|
||||||
- *Flatten* = checked
|
A control on the bottom right of the Wide Graph (displayed as *Spec nn%*) lets you control
|
||||||
- Select *Cumulative* for data display
|
the vertical fraction of the window occupied by the spectrum line plot.
|
||||||
- *Gain* and *Zero* sliders for waterfall and spectrum set near midscale
|
It is important to set appropriate lower and upper
|
||||||
- *Spec* = 25%
|
audio frequency limits for the Wide Graph because these limits define the FT8 decoder's search window.
|
||||||
|
For this tutorial, the limits will be set to cover 100-3300 Hz:
|
||||||
|
|
||||||
|
- Set *Start* = 100 Hz.
|
||||||
|
- Set *Bins/Pixel* = 5. Smaller/larger values make the Wide Graph cover a smaller/larger
|
||||||
|
frequency range.
|
||||||
- Use the mouse to grab the left or right edge of the *Wide Graph*, and
|
- Use the mouse to grab the left or right edge of the *Wide Graph*, and
|
||||||
adjust its width so that the upper frequency limit is about 2400 Hz.
|
adjust its width so that the upper frequency limit is about 3300 Hz.
|
||||||
|
|
||||||
|
The *N Avg* setting controls how many spectra are averaged to produce each line in the spectrogram.
|
||||||
|
Smaller values make the spectrogram update more frequently, resulting in signals being more spread
|
||||||
|
out in the vertical (time) direction.
|
||||||
|
On the other hand, larger values make it easier to detect very weak signals:
|
||||||
|
|
||||||
|
- Set *N Avg* = 2.
|
||||||
|
|
||||||
|
The *Palette* setting controls the color scheme used for the spectrogram:
|
||||||
|
|
||||||
|
- Set *Palette* = Fldigi
|
||||||
|
|
||||||
|
When *Flatten* is checked, WSJT-X attempts to correct for slope or curvature in the receiver's
|
||||||
|
passband shape.
|
||||||
|
|
||||||
|
- *Flatten* = checked
|
||||||
|
|
||||||
|
The line plot can be set to display the current (un-averaged) spectrum or the cumulative (averaged)
|
||||||
|
spectrum:
|
||||||
|
|
||||||
|
- Select *Cumulative* for data display
|
||||||
|
- Set the *Gain* and *Zero* sliders for the waterfall and spectrum to near midscale
|
||||||
|
|
||||||
|
The *Spec nn%* setting determines what fraction of the vertical extent of the Wide Graph will
|
||||||
|
be used for the line plot of the spectrum. Setting *Spec* to 0 will eliminate the line plot and
|
||||||
|
a setting of 100 will eliminate the spectrogram and show only the line plot:
|
||||||
|
|
||||||
|
- Set *Spec* = 50%
|
||||||
|
|
||||||
|
|
|
@ -333,6 +333,27 @@ correlation algorithm. JT65 and Q65 offer _a priori_ (AP)
|
||||||
decoding, which takes advantage of naturally accumulating information
|
decoding, which takes advantage of naturally accumulating information
|
||||||
during a QSO.
|
during a QSO.
|
||||||
|
|
||||||
|
For CW mode on SHF and microwave EME WSJT-X can be used to do Doppler
|
||||||
|
shift correction if desired:
|
||||||
|
|
||||||
|
- Check the *Settings -> Radio -> Mode -> None* option, this stops _WSJT-X_
|
||||||
|
from trying to set the mode of your rig.
|
||||||
|
|
||||||
|
- Put you rig into CW mode as normal.
|
||||||
|
|
||||||
|
- Before transmitting press *Tune* in _WSJT-X_, no tones will be
|
||||||
|
transmitted as the rig is in CW mode, but importantly WSJT-X knows
|
||||||
|
your are transmitting and adjusts the Doppler shift correction as
|
||||||
|
needed for the currently selected Doppler shift correction mode in
|
||||||
|
transmit.
|
||||||
|
|
||||||
|
- When you have finish transmitting CW press *Tune* again to revert to
|
||||||
|
receive mode and the correct Doppler shift correction for receiving.
|
||||||
|
|
||||||
|
NOTE: The above assumes you are already set up for _WSJT-X_
|
||||||
|
<<VHF_SETUP,Doppler shift correction>> with working CAT control, and
|
||||||
|
*Monitor* enabled etc..
|
||||||
|
|
||||||
////
|
////
|
||||||
The following tutorial aims to familiarize you with
|
The following tutorial aims to familiarize you with
|
||||||
these program features, all of which are of special interest for EME
|
these program features, all of which are of special interest for EME
|
||||||
|
|
|
@ -141,31 +141,20 @@ include::transceiver-setup.adoc[]
|
||||||
== Basic Operating Tutorial
|
== Basic Operating Tutorial
|
||||||
|
|
||||||
This section introduces the basic user controls and program behavior
|
This section introduces the basic user controls and program behavior
|
||||||
of _WSJT-X_, with particular emphasis on the JT9, JT65, and FT8 modes.
|
of _WSJT-X_, with particular emphasis on the FT8 mode.
|
||||||
We suggest that new users should go through the full HF-oriented
|
We suggest that new users should go through the full HF-oriented
|
||||||
tutorial, preferably while at your radio. Note that as of late 2018,
|
tutorial, preferably while at your radio.
|
||||||
digital usage on the HF bands has mostly moved from JT65 and JT9 to FT8. So
|
|
||||||
you may wish to pay particular attention to *FT8*, in Section 6.6.
|
|
||||||
|
|
||||||
Subsequent sections cover additional details on <<MAKE_QSOS,Making
|
Subsequent sections cover additional details on <<MAKE_QSOS,Making
|
||||||
QSOs>>, <<WSPR,WSPR mode>> and <<VHF_AND_UP,VHF+ Features>>.
|
QSOs>>, <<WSPR,WSPR mode>> and <<VHF_AND_UP,VHF+ Features>>.
|
||||||
|
|
||||||
[[TUT_MAIN]]
|
[[TUT_SAMPLES]]
|
||||||
=== Main Window Settings
|
include::tutorial-download-samples.adoc[]
|
||||||
include::tutorial-main-window.adoc[]
|
|
||||||
|
|
||||||
[[TUT_WIDE_GRAPH]]
|
[[TUT_WIDE_GRAPH]]
|
||||||
=== Wide Graph Settings
|
=== Wide Graph Settings
|
||||||
include::tutorial-wide-graph-settings.adoc[]
|
include::tutorial-wide-graph-settings.adoc[]
|
||||||
|
|
||||||
[[TUT_EX1]]
|
|
||||||
=== JT9
|
|
||||||
include::tutorial-example1.adoc[]
|
|
||||||
|
|
||||||
[[TUT_EX2]]
|
|
||||||
=== JT9+JT65
|
|
||||||
include::tutorial-example2.adoc[]
|
|
||||||
|
|
||||||
[[TUT_EX3]]
|
[[TUT_EX3]]
|
||||||
=== FT8
|
=== FT8
|
||||||
include::tutorial-example3.adoc[]
|
include::tutorial-example3.adoc[]
|
||||||
|
|
|
@ -0,0 +1,569 @@
|
||||||
|
Joe Taylor, K1JT:
|
||||||
|
|
||||||
|
I am very sorry to convey the sad news that Bill Somerville,
|
||||||
|
G4WJS, died suddenly and unexpectedly a few days ago. He was only
|
||||||
|
about 65 years old.
|
||||||
|
|
||||||
|
Bill was a dear friend and very close colleague, though (as is often
|
||||||
|
the case with worldwide ham radio friendships) we had met in person
|
||||||
|
only a few times. In 2013 he was the first to join me in forming a
|
||||||
|
core development group for WSJT-X, which at that time was at program
|
||||||
|
version 0.99. Bill has been closely involved with WSJT-X and related
|
||||||
|
software projects ever since.
|
||||||
|
|
||||||
|
Our free, open-source software could not have achieved its extensive
|
||||||
|
worldwide popularity and influence in ham radio without Bill's
|
||||||
|
essential contributions. In addition to writing code for important
|
||||||
|
portions of the Qt-based user interface for WSJT-X, Bill helped to
|
||||||
|
bring the overall program structure more nearly up to professional
|
||||||
|
standards. Moreover, he devoted countless hours to program support,
|
||||||
|
patiently answering user's questions on WSJT-related forums.
|
||||||
|
|
||||||
|
I have only started to think about the many ways in which I will miss
|
||||||
|
Bill -- not no mention how we all will miss his immense and positive
|
||||||
|
impact on WSJT-X and related projects. For more than eight years Bill
|
||||||
|
and I communicated closely and regularly on ham radio topics,
|
||||||
|
sometimes many times per day. Perhaps I will be able to write more
|
||||||
|
about it in the near future.
|
||||||
|
|
||||||
|
Rest in peace, dear friend G4WJS.
|
||||||
|
|
||||||
|
|
||||||
|
Stan Gammons, KM4HQE:
|
||||||
|
|
||||||
|
So sad to hear that Joe. Bill will be greatly missed.
|
||||||
|
|
||||||
|
Prayers for his family and friends.
|
||||||
|
|
||||||
|
Rest in peace Bill
|
||||||
|
|
||||||
|
Colin Haig, VE3MSC:
|
||||||
|
|
||||||
|
Joe, this is truly sad news. Bill has been a wonderful resource and
|
||||||
|
supported all of us. Please pass condolences to his family.
|
||||||
|
|
||||||
|
PA3GCU:
|
||||||
|
|
||||||
|
May he rest in peace.
|
||||||
|
|
||||||
|
Philip Hazelton, G8PJH
|
||||||
|
|
||||||
|
This is shocking news, he was such talent, he will be sorely missed,
|
||||||
|
condolences to his family.
|
||||||
|
|
||||||
|
Philip Rose, GM3ZZA
|
||||||
|
|
||||||
|
You have provided an excellent service to the WSJT-X community. I
|
||||||
|
think your last post was a couple of days ago. We will all miss you,
|
||||||
|
and your incisive resolution of all our problems.
|
||||||
|
|
||||||
|
Requiescat in pace.
|
||||||
|
Dave, AA6YQ:
|
||||||
|
|
||||||
|
A huge loss for all of us. Bill always took the time to provide a
|
||||||
|
friendly, accurate, and helpful answer to any question that came his
|
||||||
|
way. He set one good example after another.
|
||||||
|
|
||||||
|
Reino Talarmo, OH3MA:
|
||||||
|
|
||||||
|
RIP Bill, We will miss your kind advice.
|
||||||
|
|
||||||
|
Tom V. Segalstad, LA4LN:
|
||||||
|
|
||||||
|
The silent key of Bill is very sad news.
|
||||||
|
|
||||||
|
Bill has been extremely helpful for radio amateurs to make WSJT-X fit
|
||||||
|
their different radios and computers. We have seen E-mail answers from
|
||||||
|
him coming at all times during borh day and night. And we wonder if he
|
||||||
|
ever got time to sleep or eat, in-between his good answers and advices
|
||||||
|
to radio amateurs world wide.
|
||||||
|
|
||||||
|
So rest in peace Bill, and thank you very much for all the help you
|
||||||
|
have provided to radio amateurs world wide, for making their digital
|
||||||
|
radio amateur activity very successful.
|
||||||
|
|
||||||
|
John, VE7KKQ:
|
||||||
|
|
||||||
|
So long, Bill, condolences to his family.
|
||||||
|
|
||||||
|
Tom, M0LTE:
|
||||||
|
|
||||||
|
Unreal. Deeply shocking.
|
||||||
|
|
||||||
|
Heartfelt condolences from us all at the Reading club, where Bill was
|
||||||
|
a member.
|
||||||
|
|
||||||
|
Борис Романов (Boris Romanov), UX8IW:
|
||||||
|
|
||||||
|
Sad news. Condolences to Bill's family and friends.
|
||||||
|
|
||||||
|
Ken Cox, WA8OMR:
|
||||||
|
|
||||||
|
Sorry to hear about Bill's passing. I will miss reading his answers to
|
||||||
|
the many questions posted. I have learned a lot from them.Ken WA8OMR.
|
||||||
|
|
||||||
|
Gary Trock:
|
||||||
|
|
||||||
|
Very Sad.
|
||||||
|
I’ve been reading his posts since I joined.
|
||||||
|
RIP.
|
||||||
|
|
||||||
|
Dave Sellars, KB4JB:
|
||||||
|
|
||||||
|
Very sad news indeed. Amateur Radio worldwide has lost a tremendous
|
||||||
|
ham and friend. His contributions to WSJT-X and this group will never
|
||||||
|
be forgotten.
|
||||||
|
|
||||||
|
Lynn Mears, K0CLM:
|
||||||
|
|
||||||
|
Extremely sad news. I haven’t been involved with WSJT that long, but
|
||||||
|
it was obvious that Bill donated a lot of time and effort towards WSJT
|
||||||
|
and helping in many different ways. He will be missed greatly.
|
||||||
|
|
||||||
|
Peter, M0PWX:
|
||||||
|
|
||||||
|
Sad news indeed, Bill was a great resource and font of so much
|
||||||
|
knowledge, as well as having the patience of a saint when dealing with
|
||||||
|
some members / questions
|
||||||
|
|
||||||
|
Will be greatly missed on here
|
||||||
|
|
||||||
|
|
||||||
|
Russ Ravella:
|
||||||
|
|
||||||
|
Incredibly sad news. What a wonderful, valuable and kind man Bill
|
||||||
|
was. How much better the world would be with more Bill’s in it.
|
||||||
|
Thank you and Rest In Peace Bill Somerville.
|
||||||
|
|
||||||
|
Sam Birnbaum, W2JDB:
|
||||||
|
|
||||||
|
So very sorry to hear this sad news. Bill has been very extremely
|
||||||
|
helpful to me in providing the information that allowed me to provide
|
||||||
|
a complimentary program for WSJT-X so that visually impaired/blind
|
||||||
|
hams can also partake in this fantastic program and its modes.
|
||||||
|
|
||||||
|
Rest In Peace Bill, you will be sorely missed by all.
|
||||||
|
|
||||||
|
Jack Trampler, N2JT
|
||||||
|
|
||||||
|
I never worked Bill. Did he even have time to operate? I never met
|
||||||
|
Bill. But I would have liked to. I never sent him an email, either
|
||||||
|
personal or on this group. I wish I had.
|
||||||
|
|
||||||
|
I enjoyed my daily (actually several times a day) reading of the
|
||||||
|
messages posted in this group and his replies. I learned a lot from
|
||||||
|
them. This man had so much knowledge and the fact that he took the
|
||||||
|
time to deal with almost every post in this group and share that
|
||||||
|
knowledge, its truly a testament to this man. I for one will surely
|
||||||
|
miss him.
|
||||||
|
|
||||||
|
I wish I knew him better. Rest in Peace, Bill.
|
||||||
|
|
||||||
|
Pete Smith, N4ZR:
|
||||||
|
|
||||||
|
Terrible news. Though I'm not a great devotee of the digital modes
|
||||||
|
(except CW), without Bill I'm convinced I would not have made a single
|
||||||
|
QSO using WSJT-X. My sympathy to his family and friends.
|
||||||
|
|
||||||
|
Neil Zampella, KN3ILZ:
|
||||||
|
|
||||||
|
I agree. Bill was patient with everyone, even me when I replied to a
|
||||||
|
post and chewed my foot up to the ankle.
|
||||||
|
|
||||||
|
His passing will affect much done within WSJT-X, as well as Hamlib.
|
||||||
|
He was a font of knowledge and 'corporate' memory.
|
||||||
|
|
||||||
|
We may not see his like again.
|
||||||
|
|
||||||
|
Jim Brown, K9YC:
|
||||||
|
|
||||||
|
If Bill had done nothing more than provide what seemed like 24/7
|
||||||
|
support here, his contribution would have been monumental. Thanks
|
||||||
|
Bill, RIP.
|
||||||
|
|
||||||
|
Jeff, K3JRZ:
|
||||||
|
|
||||||
|
Wow. Very sad to hear.
|
||||||
|
|
||||||
|
I had sent many emails to him looking for help with WSJT-X when I
|
||||||
|
first started having my first issues with it when I started with the
|
||||||
|
software and then again after several macOS updates. Always a great
|
||||||
|
guy to get help from. He will surely be missed. My condolences to his
|
||||||
|
family and to all that knew him.
|
||||||
|
|
||||||
|
Lance Collister, W7GJ:
|
||||||
|
|
||||||
|
Our heart-felt condolences to you, Joe, and to all the folks like me
|
||||||
|
whom he so patiently helped over the years. He was an amazing member
|
||||||
|
of the WSJT-X team, and I found myself always amazed at how in the
|
||||||
|
world he was able to answer all the questions posed to him by users of
|
||||||
|
WSJT-X on such a myriad of different rigs with different software. His
|
||||||
|
contributions will be long remembered, and very much appreciated. So
|
||||||
|
sad to see someone go who gave so much so freely to our
|
||||||
|
community. RIP, Bill.
|
||||||
|
|
||||||
|
Klaus Werner, G7RTI:
|
||||||
|
|
||||||
|
Thanks to Bill’s helpful explanations I was able to get going on
|
||||||
|
WSJTX.
|
||||||
|
|
||||||
|
I didn’t know him or anything about him except what has been written
|
||||||
|
in previous comments.
|
||||||
|
|
||||||
|
May he rest in peace.
|
||||||
|
|
||||||
|
Wayne Rash, N4HCR:
|
||||||
|
|
||||||
|
This is so sad. Bill always showed great patience with my dumb
|
||||||
|
questions. He played a big role in making WSJTX a joy to use. Ham
|
||||||
|
radio owes him a huge debt.
|
||||||
|
|
||||||
|
Rest In Peace, Bill.
|
||||||
|
|
||||||
|
Dave:
|
||||||
|
|
||||||
|
Very sad to hear. He will live in our memories and our operating.
|
||||||
|
|
||||||
|
Ed Radlo, AJ6V:
|
||||||
|
|
||||||
|
Bill always answered the various online queries vey quickly, and his
|
||||||
|
vast knowledge helped many of us get on track with all of these new
|
||||||
|
digital modes.
|
||||||
|
|
||||||
|
A great loss to ham radio.
|
||||||
|
|
||||||
|
Bob Bownes: (?)
|
||||||
|
|
||||||
|
Very sad to hear. May his memory be a blessing to his family and all
|
||||||
|
who knew him.
|
||||||
|
|
||||||
|
In the Law Enforcement, Fire and Emergency Medical Services, the
|
||||||
|
passing on of one such is often marked with a 'Last Call' or 'Final
|
||||||
|
Dispatch' in which the departed's call sign is requested thrice for
|
||||||
|
one last time. Usually at a pre-arranged or significant time. Seems
|
||||||
|
appropriate in this case as well. Perhaps you could do that for us
|
||||||
|
Joe.
|
||||||
|
|
||||||
|
Rick, I2BRT:
|
||||||
|
|
||||||
|
Very sad news and a great loss for our cumunity. Thanks for all the
|
||||||
|
effort and friendship Bill. Rest in peace.
|
||||||
|
|
||||||
|
Andy, GD0TEP:
|
||||||
|
|
||||||
|
I never worked Bill. Did he even have time to operate?
|
||||||
|
|
||||||
|
Yes, I worked him on 15m in August just gone, and on 6m back in
|
||||||
|
May. Both on FT8 of course.
|
||||||
|
|
||||||
|
Gwen, KI5PXQ:
|
||||||
|
|
||||||
|
I also worked him, 1600Z on the 24th of October, 15 meters, FT8.
|
||||||
|
|
||||||
|
Ria, N2RJ:
|
||||||
|
|
||||||
|
This is truly awful news. Bill will certainly be missed.
|
||||||
|
|
||||||
|
Walter, OE6IWG:
|
||||||
|
|
||||||
|
VY sad News :-(
|
||||||
|
|
||||||
|
Bill was a GREAT helper - also for me. My condolences to his family
|
||||||
|
and friends.
|
||||||
|
|
||||||
|
Ed Wilson, K0KC:
|
||||||
|
|
||||||
|
This is a tremendous loss to the amateur radio community, but as
|
||||||
|
someone who lost his brother only a few weeks ago, I know that the
|
||||||
|
loss is much greater to his family and close friends...my condolences
|
||||||
|
to each of them. RIP, Bill...
|
||||||
|
|
||||||
|
Amos Sobel, 4X4MF:
|
||||||
|
|
||||||
|
Me and the WSJT-X community mourn the departure of Bill Somerville
|
||||||
|
|
||||||
|
Bob, K4RCG:
|
||||||
|
|
||||||
|
I deeply regret not sending Bill a "personal thank you" e-mail for his
|
||||||
|
support of our hobby. I had planned on doing so, but didn't want to
|
||||||
|
add traffic to his in-box admin! He will be missed, but fondly
|
||||||
|
remembered.
|
||||||
|
|
||||||
|
Hamish, G0GLG:
|
||||||
|
|
||||||
|
Very sad day for amateur radio.
|
||||||
|
|
||||||
|
Paul Welford, G4YKQ:
|
||||||
|
|
||||||
|
A Tribute to my dearest friend Bill Somerville G4WJS.
|
||||||
|
|
||||||
|
I apologize for length of this post. This might answer a few previous
|
||||||
|
posts Knowing Bill he will be still reading all these posts from a
|
||||||
|
better place.
|
||||||
|
|
||||||
|
I thank you for your speedy post Joe.
|
||||||
|
|
||||||
|
Bill G4WJS was one of my dearest friends living just 4 miles apart.We
|
||||||
|
spoke 2/3 times a week and at times several times a day.
|
||||||
|
|
||||||
|
After a 20 year plus break Bill spurred me on to come back into the
|
||||||
|
radio family. I OWE HIM A LOT. Thanks to him my major interest in the
|
||||||
|
last 10 years has been WSJT-X. Bill also had a passion for Photography
|
||||||
|
and me being a Photographer for The Sun Newspaper In London before I
|
||||||
|
retired had another common interest we liked to have a good natter but
|
||||||
|
I often came off the worst.Bill lived on his own so we kept a close
|
||||||
|
eye on each other.
|
||||||
|
|
||||||
|
Bill had a degree in Chemistry but as I understand was self taught in
|
||||||
|
computing and electronics.Please see his QRZ page.
|
||||||
|
|
||||||
|
He was a whizz. He was a great natural teacher and Joe I think this was
|
||||||
|
one of the reasons he got on so well with you and the group.He
|
||||||
|
remarked to me many times "I never mind helping anyone provided they
|
||||||
|
help themselves" At times glaring at me muttering under his breath
|
||||||
|
"Read the notes and the posts" Sometimes it so annoyed him when I
|
||||||
|
could not keep a straight face..we all know the story.Bill always
|
||||||
|
willing to help with a computer grafted to his hand. Over the last
|
||||||
|
ten years he has like others in the group spent hours and hours
|
||||||
|
involved with WSJX-X.He had a great admiration for open source
|
||||||
|
programs.Made many friends within the digital community and a big
|
||||||
|
respect for Dxlabs {Dave] JTalert [Laurie] among others. I was always
|
||||||
|
giving him praise for taking a break and TXing winding up this 4 ele
|
||||||
|
,of late not often[Bill head in PC} every day I would have a crafty
|
||||||
|
check on his PSK. Bill was very much in favour of Using L.O.T.W but
|
||||||
|
never collected awards,but on receiving a trophy for technical
|
||||||
|
achievement announced at Dayton when he told me there was no emotion
|
||||||
|
but I knew Bill just to well he was chuffed !
|
||||||
|
|
||||||
|
Sadly last Friday after never responding to my calls I found Bill
|
||||||
|
seated in his shack at peace surrounded by the things he loved most.
|
||||||
|
|
||||||
|
I am still total shock!!!
|
||||||
|
|
||||||
|
Such a loss of a talented and loyal friend and as I have said he shall
|
||||||
|
be greatly missed by many in our radio family.
|
||||||
|
|
||||||
|
R.I.P.William [Bill ] G4WJS.
|
||||||
|
|
||||||
|
God Bless you and till we meet again 73.................. Cheers mate!
|
||||||
|
|
||||||
|
Ronnie Hull:
|
||||||
|
|
||||||
|
I am greatly saddened to hear this news.
|
||||||
|
|
||||||
|
Keith Wood, W4RPE:
|
||||||
|
|
||||||
|
Great tribute to a wonderful man.
|
||||||
|
|
||||||
|
Carlos, OE3JAG:
|
||||||
|
|
||||||
|
May I also do my sadly condolences to his family and his friends ! He
|
||||||
|
will surely be missed by all the hams. Thanks for got in touch with
|
||||||
|
you, dear Bill.
|
||||||
|
|
||||||
|
Good luck in your new place, Bill, I miss you,
|
||||||
|
|
||||||
|
William Hensley, WG8S:
|
||||||
|
|
||||||
|
A great tribute, Paul! I'm sorry you were the one to find him, yet I
|
||||||
|
sense you would both want it that way. I did not know Bill, but he
|
||||||
|
made a tremendous contribution to the WSJT-X community. He will be
|
||||||
|
missed.
|
||||||
|
|
||||||
|
RIP, Bill. Thank you, Paul.
|
||||||
|
|
||||||
|
Bernd, KB7AK:
|
||||||
|
|
||||||
|
Thank you for your tribute Paul, we will all miss Bill dearly.
|
||||||
|
|
||||||
|
Philip Rose, GM3ZZA:
|
||||||
|
|
||||||
|
As far as I can see we as amateurs who have been helped by Bill,
|
||||||
|
should keep up his good work. I know I can’t alone.
|
||||||
|
|
||||||
|
His advice was definitive. Others not so.
|
||||||
|
|
||||||
|
Jim Brown, K9YC:
|
||||||
|
|
||||||
|
Thanks very much, Paul, for this lovely and loving post. As you and
|
||||||
|
Joe have so eloquently written, Bill exemplified the best of the ham
|
||||||
|
spirit, by giving and sharing far more than he received.
|
||||||
|
|
||||||
|
Erik, VA7QI:
|
||||||
|
|
||||||
|
Very sorry to hear about Bill. I enjoyed reading his comments and
|
||||||
|
very much appreciate his contribution for WSTJ-X.
|
||||||
|
|
||||||
|
His name and callsign will be remembered for a long time as a shining
|
||||||
|
light of the ham radio community.
|
||||||
|
|
||||||
|
73 de va7qi, ....Erik.
|
||||||
|
|
||||||
|
Marco, PY1ZRJ:
|
||||||
|
My God! Whats terrible news is this!
|
||||||
|
|
||||||
|
Bill helped me in many occasions with WSJT-X always with a very pure
|
||||||
|
"ham-spirit" and availability.
|
||||||
|
|
||||||
|
My very sincere condolence to all his family and friends, I will miss
|
||||||
|
him a lot despite I never had the pleasure to meet him.
|
||||||
|
|
||||||
|
Martin Davies, G0HDB:
|
||||||
|
|
||||||
|
That is truly unwelcome and most distressing news, Joe; I'm sure the
|
||||||
|
vast amounts of time and effort that Bill devoted to the development
|
||||||
|
and support of WSJT-X will be very sorely missed by everyone in the
|
||||||
|
community, whether or not they had ever had any direct dealings with
|
||||||
|
Bill.
|
||||||
|
|
||||||
|
Please convey all our sympathies and our deepest condolences to Bill's
|
||||||
|
relatives and friends.
|
||||||
|
|
||||||
|
John Nelson, G4KLA:
|
||||||
|
|
||||||
|
I am saddened to learn of your news. This is blow to the WSJT-X
|
||||||
|
community.
|
||||||
|
|
||||||
|
In the early days of Bill’s involvement with WSJT he often logged into
|
||||||
|
my Macs at home to test his software modifications on a Mac until he
|
||||||
|
got a VM working. He and I had numerous discussions while testing new
|
||||||
|
versions on various Mac OS. He was generous with his time in helping
|
||||||
|
folks with problems either running the codes or attempting to build
|
||||||
|
the software on various platforms. The multitude of emails to the
|
||||||
|
development list is a tribute to his commitment to ensure that the
|
||||||
|
various programs operated flawlessly.
|
||||||
|
|
||||||
|
His involvement with the development of WSJT-X code especially with
|
||||||
|
modernising the structure of the whole program has been immense. I
|
||||||
|
will certainly miss his advice.
|
||||||
|
|
||||||
|
A sad day…
|
||||||
|
|
||||||
|
Alan, G0TLK:
|
||||||
|
|
||||||
|
Shocking and saddening news, he will be greatly missed.
|
||||||
|
|
||||||
|
My condolences to his family and friends, and RIP Bill.
|
||||||
|
|
||||||
|
Robin, G8DQX:
|
||||||
|
|
||||||
|
I only knew Bill through his contributions to the WSJT lists. Those
|
||||||
|
contributions were sharp, radical, and usually encouraging. He was a
|
||||||
|
clearly essential part of a team that is helping Amateur Radio to
|
||||||
|
grow, expand and develop, far beyond what you and I knew when,
|
||||||
|
soldering iron in hand, we first played with radio, all those years
|
||||||
|
ago.
|
||||||
|
|
||||||
|
My condolences to his family and friends. We shall all miss him.
|
||||||
|
|
||||||
|
Robin, G8DQX
|
||||||
|
|
||||||
|
Charlie Suckling, G3WDG/DL3WDG:
|
||||||
|
|
||||||
|
We were also shocked and very sorry to hear of Bill's sudden
|
||||||
|
passing. I never had the pleasure of meeting him in person. Like Bob,
|
||||||
|
he attended the same University and read the same degree.
|
||||||
|
|
||||||
|
We are so grateful for his contributions over many years to
|
||||||
|
WSJT-X. His support for users was first class, and he even joined the
|
||||||
|
EME reflectors to give support to EME users during the roll-out of
|
||||||
|
Q65, despite not being active himself on EME. He was contributing
|
||||||
|
there regularly, and some of his last efforts were to support the use
|
||||||
|
of WSJT-X for Doppler control on CW on the microwave bands.
|
||||||
|
|
||||||
|
He was also a very patient and diligent teacher, tutoring and helping
|
||||||
|
those who wished to make small contributions to the project. I am very
|
||||||
|
grateful for the time he spent in such ways.
|
||||||
|
|
||||||
|
Bill will surely be greatly missed, and sincere condolences to his
|
||||||
|
family and many friends.
|
||||||
|
|
||||||
|
RIP Bill.
|
||||||
|
|
||||||
|
James Shaver, N2ADV:
|
||||||
|
|
||||||
|
I had the pleasure of talking to Bill over Skype a few times during
|
||||||
|
the development of 1.7 and later 1.8 to chase down some CAT control
|
||||||
|
gremlins with several radios I happen to own. His patience and
|
||||||
|
intelligence was incredible. Such a huge loss to us all.
|
||||||
|
|
||||||
|
My sincerest condolences to his family and friends.
|
||||||
|
|
||||||
|
He will definitely be missed but his contributions to the advancement
|
||||||
|
of amateur radio will live on indefinitely.
|
||||||
|
|
||||||
|
Alessandro Gorobey, IK2
|
||||||
|
|
||||||
|
Very sad news and a great loss.
|
||||||
|
|
||||||
|
A great teacher.
|
||||||
|
|
||||||
|
My sincerest condolences to his family and friends.
|
||||||
|
|
||||||
|
Jim Preston, N6VH:
|
||||||
|
|
||||||
|
This is definitely very sad news. Bill was a very important part of
|
||||||
|
the WSJT team. He will be missed very much.
|
||||||
|
|
||||||
|
My condolences to his family.
|
||||||
|
|
||||||
|
Gary Lane, VK4OO
|
||||||
|
|
||||||
|
Very sad news, my condolences to Bills friends and family….
|
||||||
|
|
||||||
|
Bob Atkins, KA1GT:
|
||||||
|
|
||||||
|
I was shocked and saddened by the news of Bill's passing. We chatted
|
||||||
|
on line quite often though we never met in person. He attended the
|
||||||
|
same university as I didn't, reading the same subjects, but was a hear
|
||||||
|
of two behind me, so we never met their either. Bill will be greatly
|
||||||
|
missed and I send my condolences to his friends and family.
|
||||||
|
|
||||||
|
RIP Bill.
|
||||||
|
|
||||||
|
Dave Schmocker, KJ9I:
|
||||||
|
|
||||||
|
This is incredibly sad news. Bill was always so helpful, highly
|
||||||
|
responsive, and on-target with deep technical solutions.
|
||||||
|
|
||||||
|
What a wonderful asset Bill was to the hobby and to all with whom he
|
||||||
|
interfaced.
|
||||||
|
|
||||||
|
Jim, WB4CGS:
|
||||||
|
|
||||||
|
I am very sorry for this loss.
|
||||||
|
|
||||||
|
Conrad Farlow, Jim WB4GCS
|
||||||
|
|
||||||
|
Joe I am absolutely lost for words. What a terrible shock. I cannot
|
||||||
|
imagine him not being there. My condolences to you, Bill's family and
|
||||||
|
well the whole dev team. We will all miss him Most of all I am sorry
|
||||||
|
that you lost such a good friend.
|
||||||
|
|
||||||
|
Sam Jewell, G4DDK:
|
||||||
|
|
||||||
|
So sad to hear this news. One of the team who have revolutionised ham
|
||||||
|
radio operation, popularised digital and helped realise what we
|
||||||
|
thought should be possible.
|
||||||
|
|
||||||
|
Vale Bill.
|
||||||
|
|
||||||
|
|
||||||
|
Nick, NN3Y:
|
||||||
|
|
||||||
|
R I. P. Bill. He'll be missed. My sincere condolences to his family
|
||||||
|
and friends.
|
||||||
|
|
||||||
|
|
||||||
|
Jay, KA9CFD:
|
||||||
|
|
||||||
|
Shocking and very sorry news. RIP Bill.
|
||||||
|
|
||||||
|
Mirek, OK2AQ:
|
||||||
|
|
||||||
|
Very sad news for us WSJT-X users. R.I.P. Bill
|
||||||
|
|
||||||
|
OH6KTL, Lasse:
|
||||||
|
|
||||||
|
ge and sad to hear about Bill
|
||||||
|
|
|
@ -94,3 +94,7 @@ KA1ABC/VEX 37
|
||||||
<W3CCX/P> <K1JT> 590001 FN20QI
|
<W3CCX/P> <K1JT> 590001 FN20QI
|
||||||
<W3CCX/P> <K1JT/P> 590001 FN20QI
|
<W3CCX/P> <K1JT/P> 590001 FN20QI
|
||||||
<W3CCX/QRP> <K1JT/QRO> 590001 FN20QI
|
<W3CCX/QRP> <K1JT/QRO> 590001 FN20QI
|
||||||
|
CQ OE21FTDMC
|
||||||
|
K9AN K1JT R-
|
||||||
|
K9AN K1JT R+
|
||||||
|
K1AN K1JT WXY
|
||||||
|
|
|
@ -8,6 +8,7 @@ module packjt77
|
||||||
character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
|
character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
|
||||||
character (len=13) :: mycall13=''
|
character (len=13) :: mycall13=''
|
||||||
character (len=13) :: dxcall13=''
|
character (len=13) :: dxcall13=''
|
||||||
|
character (len=6) :: dxbase=''
|
||||||
integer, dimension(1:MAXHASH) :: ihash22=-1
|
integer, dimension(1:MAXHASH) :: ihash22=-1
|
||||||
integer :: nzhash=0
|
integer :: nzhash=0
|
||||||
integer n28a,n28b
|
integer n28a,n28b
|
||||||
|
@ -124,6 +125,11 @@ subroutine pack77(msg0,i3,n3,c77)
|
||||||
integer ntel(3)
|
integer ntel(3)
|
||||||
|
|
||||||
msg=msg0
|
msg=msg0
|
||||||
|
if(msg(1:3).eq.'$DX') then
|
||||||
|
i1=index(msg,' ')
|
||||||
|
msg=trim(dxbase)//' '//msg(i1+1:)
|
||||||
|
endif
|
||||||
|
|
||||||
i3_hint=i3
|
i3_hint=i3
|
||||||
n3_hint=n3
|
n3_hint=n3
|
||||||
i3=-1
|
i3=-1
|
||||||
|
@ -824,7 +830,9 @@ subroutine split77(msg,nwords,nw,w)
|
||||||
iz=j !Message length
|
iz=j !Message length
|
||||||
nwords=k !Number of words in msg
|
nwords=k !Number of words in msg
|
||||||
if(nwords.le.0) go to 900
|
if(nwords.le.0) go to 900
|
||||||
nw(k)=len(trim(w(k)))
|
do i=1,nwords
|
||||||
|
nw(i)=len(trim(w(i)))
|
||||||
|
enddo
|
||||||
msg(iz+1:)=' '
|
msg(iz+1:)=' '
|
||||||
if(nwords.lt.3) go to 900
|
if(nwords.lt.3) go to 900
|
||||||
call chkcall(w(3),bcall_1,ok1)
|
call chkcall(w(3),bcall_1,ok1)
|
||||||
|
@ -833,7 +841,7 @@ subroutine split77(msg,nwords,nw,w)
|
||||||
w(2:12)=w(3:13) !Move all remaining words down by one
|
w(2:12)=w(3:13) !Move all remaining words down by one
|
||||||
nwords=nwords-1
|
nwords=nwords-1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
900 return
|
900 return
|
||||||
end subroutine split77
|
end subroutine split77
|
||||||
|
|
||||||
|
@ -1118,7 +1126,7 @@ subroutine pack77_1(nwords,w,i3,n3,c77)
|
||||||
irpt=irpt+35
|
irpt=irpt+35
|
||||||
else if(c2.eq.'R+' .or. c2.eq.'R-') then
|
else if(c2.eq.'R+' .or. c2.eq.'R-') then
|
||||||
ir=1
|
ir=1
|
||||||
read(w(nwords)(2:),*) irpt
|
read(w(nwords)(2:),*,err=900) irpt
|
||||||
if(irpt.ge.-50 .and. irpt.le.-31) irpt=irpt+101
|
if(irpt.ge.-50 .and. irpt.le.-31) irpt=irpt+101
|
||||||
irpt=irpt+35
|
irpt=irpt+35
|
||||||
else if(trim(w(nwords)).eq.'RRR') then
|
else if(trim(w(nwords)).eq.'RRR') then
|
||||||
|
@ -1276,6 +1284,7 @@ subroutine pack77_4(nwords,w,i3,n3,c77)
|
||||||
if(call_2(1:1).eq.'<') call_2=w(2)(2:len(trim(w(2)))-1)
|
if(call_2(1:1).eq.'<') call_2=w(2)(2:len(trim(w(2)))-1)
|
||||||
call chkcall(call_1,bcall_1,ok1)
|
call chkcall(call_1,bcall_1,ok1)
|
||||||
call chkcall(call_2,bcall_2,ok2)
|
call chkcall(call_2,bcall_2,ok2)
|
||||||
|
if(call_1.eq.bcall_1 .and. call_2.eq.bcall_2 .and. ok1 .and. ok2) go to 900
|
||||||
icq=0
|
icq=0
|
||||||
if(trim(w(1)).eq.'CQ' .or. (ok1.and.ok2)) then
|
if(trim(w(1)).eq.'CQ' .or. (ok1.and.ok2)) then
|
||||||
if(trim(w(1)).eq.'CQ' .and. len(trim(w(2))).le.4) go to 900
|
if(trim(w(1)).eq.'CQ' .and. len(trim(w(2))).le.4) go to 900
|
||||||
|
|
|
@ -11,6 +11,7 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
|
||||||
real*8 uth8,techo8,freq8
|
real*8 uth8,techo8,freq8
|
||||||
real*8 xl,b
|
real*8 xl,b
|
||||||
common/librcom/xl(2),b(2)
|
common/librcom/xl(2),b(2)
|
||||||
|
common/echocom2/fspread_self,fspread_dx
|
||||||
data uth8z/0.d0/
|
data uth8z/0.d0/
|
||||||
save
|
save
|
||||||
|
|
||||||
|
@ -44,6 +45,9 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
|
||||||
width1=0.5*6741*fghz*rate1
|
width1=0.5*6741*fghz*rate1
|
||||||
rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2)
|
rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2)
|
||||||
width2=0.5*6741*fghz*rate2
|
width2=0.5*6741*fghz*rate2
|
||||||
|
if(hisgrid(1:4).eq.' ') width2=width1 !No hisgrid, use self width
|
||||||
|
fspread_self=width1 !Save for avecho()
|
||||||
|
fspread_dx=width2 !Save for avecho()
|
||||||
|
|
||||||
AzSun8=AzSun
|
AzSun8=AzSun
|
||||||
ElSun8=ElSun
|
ElSun8=ElSun
|
||||||
|
|
|
@ -4,6 +4,9 @@ module astro_module
|
||||||
private
|
private
|
||||||
public :: astrosub
|
public :: astrosub
|
||||||
|
|
||||||
|
logical :: initialized = .false.
|
||||||
|
integer :: azel_extra_lines = 0
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine astrosub(nyear,month,nday,uth8,freq8,mygrid_cp, &
|
subroutine astrosub(nyear,month,nday,uth8,freq8,mygrid_cp, &
|
||||||
|
@ -28,11 +31,18 @@ contains
|
||||||
character(len=6) :: mygrid, hisgrid
|
character(len=6) :: mygrid, hisgrid
|
||||||
character(len=:), allocatable :: AzElFileName
|
character(len=:), allocatable :: AzElFileName
|
||||||
character(len=1) :: c1
|
character(len=1) :: c1
|
||||||
integer :: ih, im, imin, is, isec, nfreq, nRx
|
character(len=32) :: envvar
|
||||||
|
integer :: ih, im, imin, is, isec, nfreq, env_status
|
||||||
real(dp) :: AzAux, ElAux, dbMoon8, dfdt, dfdt0, doppler, doppler00, HA8, sd8, xlst8
|
real(dp) :: AzAux, ElAux, dbMoon8, dfdt, dfdt0, doppler, doppler00, HA8, sd8, xlst8
|
||||||
character*256 jpleph_file_name
|
character*256 jpleph_file_name
|
||||||
common/jplcom/jpleph_file_name
|
common/jplcom/jpleph_file_name
|
||||||
|
|
||||||
|
if (.not.initialized) then
|
||||||
|
call get_environment_variable ('WSJT_AZEL_EXTRA_LINES', envvar, status=env_status)
|
||||||
|
if (env_status.eq.0) read (envvar, *, iostat=env_status) azel_extra_lines
|
||||||
|
initialized = .true.
|
||||||
|
end if
|
||||||
|
|
||||||
mygrid = mygrid_cp
|
mygrid = mygrid_cp
|
||||||
hisgrid = hisgrid_cp
|
hisgrid = hisgrid_cp
|
||||||
AzElFileName = C_string_value (AzElFileName_cp)
|
AzElFileName = C_string_value (AzElFileName_cp)
|
||||||
|
@ -44,6 +54,12 @@ contains
|
||||||
width1,width2,xlst8,techo8)
|
width1,width2,xlst8,techo8)
|
||||||
|
|
||||||
if (len_trim(AzElFileName) .eq. 0) go to 999
|
if (len_trim(AzElFileName) .eq. 0) go to 999
|
||||||
|
if(len(trim(hisgrid)).eq.0) then !If DX grid is blank, set these to zero:
|
||||||
|
AzMoonB8=0
|
||||||
|
ElMoonB8=0
|
||||||
|
ndop=0
|
||||||
|
width2=0
|
||||||
|
endif
|
||||||
imin=60*uth8
|
imin=60*uth8
|
||||||
isec=3600*uth8
|
isec=3600*uth8
|
||||||
ih=uth8
|
ih=uth8
|
||||||
|
@ -51,10 +67,8 @@ contains
|
||||||
is=mod(isec,60)
|
is=mod(isec,60)
|
||||||
open(15,file=AzElFileName,status='unknown',err=900)
|
open(15,file=AzElFileName,status='unknown',err=900)
|
||||||
c1='R'
|
c1='R'
|
||||||
nRx=1
|
|
||||||
if(bTx) then
|
if(bTx) then
|
||||||
c1='T'
|
c1='T'
|
||||||
nRx=0
|
|
||||||
endif
|
endif
|
||||||
AzAux=0.
|
AzAux=0.
|
||||||
ElAux=0.
|
ElAux=0.
|
||||||
|
@ -65,13 +79,13 @@ contains
|
||||||
ih,im,is,AzSun8,ElSun8, &
|
ih,im,is,AzSun8,ElSun8, &
|
||||||
ih,im,is,AzAux,ElAux, &
|
ih,im,is,AzAux,ElAux, &
|
||||||
nfreq,doppler,dfdt,doppler00,dfdt0,c1
|
nfreq,doppler,dfdt,doppler00,dfdt0,c1
|
||||||
! TXFirst,TRPeriod,poloffset,Dgrd,xnr,ave,rms,nRx
|
if (azel_extra_lines.ge.1) write(15, 1020, err=10) poloffset8,xnr8,Dgrd8
|
||||||
1010 format( &
|
1010 format( &
|
||||||
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Moon'/ &
|
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,',Sun'/ &
|
||||||
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ &
|
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ &
|
||||||
i5,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler, ',a1)
|
i5,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler, ',a1)
|
||||||
! i1,',',i3,',',f8.1,','f8.1,',',f8.1,',',f12.3,',',f12.3,',',i1,',RPol')
|
1020 format(f8.1,','f8.1,',',f8.1,',Pol')
|
||||||
10 close(15)
|
10 close(15)
|
||||||
go to 999
|
go to 999
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
|
||||||
|
dfreq,width)
|
||||||
|
|
||||||
integer TXLENGTH
|
integer TXLENGTH
|
||||||
parameter (TXLENGTH=27648) !27*1024
|
parameter (TXLENGTH=27648) !27*1024
|
||||||
|
@ -13,11 +14,23 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
||||||
real s(8192)
|
real s(8192)
|
||||||
real x(NFFT)
|
real x(NFFT)
|
||||||
integer ipkv(1)
|
integer ipkv(1)
|
||||||
|
logical ex
|
||||||
complex c(0:NH)
|
complex c(0:NH)
|
||||||
equivalence (x,c),(ipk,ipkv)
|
equivalence (x,c),(ipk,ipkv)
|
||||||
common/echocom/nclearave,nsum,blue(NZ),red(NZ)
|
common/echocom/nclearave,nsum,blue(NZ),red(NZ)
|
||||||
|
common/echocom2/fspread_self,fspread_dx
|
||||||
save dop0,sa,sb
|
save dop0,sa,sb
|
||||||
|
|
||||||
|
fspread=fspread_dx !### Use the predicted Doppler spread ###
|
||||||
|
if(nauto.eq.1) fspread=fspread_self
|
||||||
|
inquire(file='fspread.txt',exist=ex)
|
||||||
|
if(ex) then
|
||||||
|
open(39,file='fspread.txt',status='old')
|
||||||
|
read(39,*) fspread
|
||||||
|
close(39)
|
||||||
|
endif
|
||||||
|
fspread=min(max(0.1,fspread),700.0)
|
||||||
|
width=fspread
|
||||||
dop=ndop
|
dop=ndop
|
||||||
sq=0.
|
sq=0.
|
||||||
do i=1,TXLENGTH
|
do i=1,TXLENGTH
|
||||||
|
@ -48,69 +61,28 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
||||||
if(ia.gt.7590 .or. ib.gt.7590) go to 900
|
if(ia.gt.7590 .or. ib.gt.7590) go to 900
|
||||||
|
|
||||||
nsum=nsum+1
|
nsum=nsum+1
|
||||||
|
|
||||||
do i=1,NZ
|
do i=1,NZ
|
||||||
sa(i)=sa(i) + s(ia+i-2048) !Center at initial doppler freq
|
sa(i)=sa(i) + s(ia+i-2048) !Center at initial doppler freq
|
||||||
sb(i)=sb(i) + s(ib+i-2048) !Center at expected echo freq
|
sb(i)=sb(i) + s(ib+i-2048) !Center at expected echo freq
|
||||||
enddo
|
enddo
|
||||||
|
call echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,dfreq,snr_detect)
|
||||||
call pctile(sb,200,50,r0)
|
nqual=snr_detect-2
|
||||||
call pctile(sb(1800),200,50,r1)
|
if(nqual.lt.0) nqual=0
|
||||||
|
|
||||||
sum=0.
|
|
||||||
sq=0.
|
|
||||||
do i=1,NZ
|
|
||||||
y=r0 + (r1-r0)*(i-100.0)/1800.0
|
|
||||||
blue(i)=sa(i)/y
|
|
||||||
red(i)=sb(i)/y
|
|
||||||
if(i.le.500 .or. i.ge.3597) then
|
|
||||||
sum=sum+red(i)
|
|
||||||
sq=sq + (red(i)-1.0)**2
|
|
||||||
endif
|
|
||||||
enddo
|
|
||||||
ave=sum/1000.0
|
|
||||||
rms=sqrt(sq/1000.0)
|
|
||||||
|
|
||||||
redmax=maxval(red)
|
|
||||||
ipkv=maxloc(red)
|
|
||||||
fac=10.0/max(redmax,10.0)
|
|
||||||
dfreq=(ipk-2048)*df
|
|
||||||
snr=(redmax-ave)/rms
|
|
||||||
|
|
||||||
sigdb=-99.0
|
|
||||||
if(ave.gt.0.0) sigdb=10.0*log10(redmax/ave - 1.0) - 35.7
|
|
||||||
|
|
||||||
nqual=0
|
|
||||||
if(nsum.ge.2 .and. nsum.lt.4) nqual=(snr-4)/5
|
|
||||||
if(nsum.ge.4 .and. nsum.lt.8) nqual=(snr-3)/4
|
|
||||||
if(nsum.ge.8 .and. nsum.lt.12) nqual=(snr-3)/3
|
|
||||||
if(nsum.ge.12) nqual=(snr-2.5)/2.5
|
|
||||||
if(nqual.lt.0) nqual=0
|
|
||||||
if(nqual.gt.10) nqual=10
|
if(nqual.gt.10) nqual=10
|
||||||
|
|
||||||
! Scale for plotting
|
! Scale for plotting
|
||||||
|
redmax=maxval(red)
|
||||||
|
fac=10.0/max(redmax,10.0)
|
||||||
blue=fac*blue
|
blue=fac*blue
|
||||||
red=fac*red
|
red=fac*red
|
||||||
|
nsmo=max(0.0,0.25*width/df)
|
||||||
sum=0.
|
|
||||||
do i=ipk,ipk+300
|
|
||||||
if(i.gt.NZ) exit
|
|
||||||
if(red(i).lt.1.0) exit
|
|
||||||
sum=sum+(red(i)-1.0)
|
|
||||||
enddo
|
|
||||||
do i=ipk-1,ipk-300,-1
|
|
||||||
if(i.lt.1) exit
|
|
||||||
if(red(i).lt.1.0) exit
|
|
||||||
sum=sum+(red(i)-1.0)
|
|
||||||
enddo
|
|
||||||
bins=sum/(red(ipk)-1.0)
|
|
||||||
width=df*bins
|
|
||||||
nsmo=max(0.0,0.25*bins)
|
|
||||||
|
|
||||||
do i=1,nsmo
|
do i=1,nsmo
|
||||||
call smo121(red,NZ)
|
call smo121(red,NZ)
|
||||||
call smo121(blue,NZ)
|
call smo121(blue,NZ)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
! write(*,3001) snrdb,db_err,dfreq,snr_detect,redmax,nqual,nsmo,nclearave,nsum
|
||||||
|
!3001 format('A',5f10.1,4i4)
|
||||||
|
|
||||||
900 return
|
900 return
|
||||||
end subroutine avecho
|
end subroutine avecho
|
||||||
|
|
|
@ -7,7 +7,7 @@ subroutine averms(x,n,nskip,ave,rms)
|
||||||
sq=0.
|
sq=0.
|
||||||
ipk=maxloc(x)
|
ipk=maxloc(x)
|
||||||
do i=1,n
|
do i=1,n
|
||||||
if(abs(i-ipk(1)).gt.nskip) then
|
if((nskip.lt.0) .or. (abs(i-ipk(1)).gt.nskip)) then
|
||||||
s=s + x(i)
|
s=s + x(i)
|
||||||
sq=sq + x(i)**2
|
sq=sq + x(i)**2
|
||||||
ns=ns+1
|
ns=ns+1
|
||||||
|
|
|
@ -12,8 +12,8 @@ subroutine calibrate(data_dir,iz,a,b,rms,sigmaa,sigmab,irc)
|
||||||
real*8 fd(NZ),deltaf(NZ),r(NZ),rmsd(NZ)
|
real*8 fd(NZ),deltaf(NZ),r(NZ),rmsd(NZ)
|
||||||
integer nn(NZ)
|
integer nn(NZ)
|
||||||
|
|
||||||
infile=trim(data_dir)//'fmt.all'
|
infile=trim(data_dir)//'/'//'fmt.all'
|
||||||
outfile=trim(data_dir)//'fcal2.out'
|
outfile=trim(data_dir)//'/'//'fcal2.out'
|
||||||
|
|
||||||
open(10,file=trim(infile),status='old',err=996)
|
open(10,file=trim(infile),status='old',err=996)
|
||||||
open(12,file=trim(outfile),status='unknown',err=997)
|
open(12,file=trim(outfile),status='unknown',err=997)
|
||||||
|
|
|
@ -34,7 +34,9 @@ subroutine chkcall(w,bc,cok)
|
||||||
|
|
||||||
! One of first two characters (c1 or c2) must be a letter
|
! One of first two characters (c1 or c2) must be a letter
|
||||||
if((.not.isletter(bc(1:1))) .and. (.not.isletter(bc(2:2)))) go to 100
|
if((.not.isletter(bc(1:1))) .and. (.not.isletter(bc(2:2)))) go to 100
|
||||||
if(bc(1:1).eq.'Q') go to 100 !Calls don't start with Q
|
! Real calls don't start with Q, but we'll allow the placeholder
|
||||||
|
! callsign QU1RK to be considered a standard call:
|
||||||
|
if(bc(1:1).eq.'Q' .and. bc(1:5).ne.'QU1RK') go to 100
|
||||||
|
|
||||||
! Must have a digit in 2nd or 3rd position
|
! Must have a digit in 2nd or 3rd position
|
||||||
i1=0
|
i1=0
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
subroutine echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,fpeak,snr_detect)
|
||||||
|
|
||||||
|
parameter (NZ=4096)
|
||||||
|
real sa(NZ)
|
||||||
|
real sb(NZ)
|
||||||
|
real blue(NZ)
|
||||||
|
real red(NZ)
|
||||||
|
integer ipkv(1)
|
||||||
|
equivalence (ipk,ipkv)
|
||||||
|
|
||||||
|
df=12000.0/32768.0
|
||||||
|
wh=0.5*fspread+10.0
|
||||||
|
i1=nint((1500.0 - 2.0*wh)/df) - 2048
|
||||||
|
i2=nint((1500.0 - wh)/df) - 2048
|
||||||
|
i3=nint((1500.0 + wh)/df) - 2048
|
||||||
|
i4=nint((1500.0 + 2.0*wh)/df) - 2048
|
||||||
|
|
||||||
|
! call pctile(sb(i1),i2-i1,50,r0)
|
||||||
|
! call pctile(sb(i3+1),i4-i3,50,r1)
|
||||||
|
! ave=0.5*(r0+r1)
|
||||||
|
! blue=sa/ave
|
||||||
|
! red=sb/ave
|
||||||
|
|
||||||
|
baseline=(sum(sb(i1:i2-1)) + sum(sb(i3+1:i4)))/(i2+i4-i1-i3)
|
||||||
|
blue=sa/baseline
|
||||||
|
red=sb/baseline
|
||||||
|
psig=sum(red(i2:i3)-1.0)
|
||||||
|
pnoise_2500 = 2500.0/df
|
||||||
|
snrdb=db(psig/pnoise_2500)
|
||||||
|
|
||||||
|
smax=0.
|
||||||
|
mh=max(1,nint(0.2*fspread/df))
|
||||||
|
do i=i2,i3
|
||||||
|
ssum=sum(red(i-mh:i+mh))
|
||||||
|
if(ssum.gt.smax) then
|
||||||
|
smax=ssum
|
||||||
|
ipk=i
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
fpeak=ipk*df - 750.0
|
||||||
|
|
||||||
|
call averms(red(i1:i2-1),i2-i1,-1,ave1,rms1)
|
||||||
|
call averms(red(i3+1:i4),i4-i3,-1,ave2,rms2)
|
||||||
|
perr=0.707*(rms1+rms2)*sqrt(float(i2-i1+i4-i3))
|
||||||
|
snr_detect=psig/perr
|
||||||
|
db_err=99.0
|
||||||
|
if(psig.gt.perr) db_err=snrdb - db((psig-perr)/pnoise_2500)
|
||||||
|
if(db_err.lt.0.5) db_err=0.5
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine echo_snr
|
|
@ -21,7 +21,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
|
||||||
|
|
||||||
use fftw3
|
use fftw3
|
||||||
parameter (NPMAX=2100) !Max numberf of stored plans
|
parameter (NPMAX=2100) !Max numberf of stored plans
|
||||||
parameter (NSMALL=16384) !Max size of "small" FFTs
|
parameter (NSMALL=16385) !Max half complex size of "small" FFTs
|
||||||
complex a(nfft) !Array to be transformed
|
complex a(nfft) !Array to be transformed
|
||||||
complex aa(NSMALL) !Local copy of "small" a()
|
complex aa(NSMALL) !Local copy of "small" a()
|
||||||
integer nn(NPMAX),ns(NPMAX),nf(NPMAX) !Params of stored plans
|
integer nn(NPMAX),ns(NPMAX),nf(NPMAX) !Params of stored plans
|
||||||
|
@ -67,7 +67,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
|
||||||
|
|
||||||
if(nfft.le.NSMALL) then
|
if(nfft.le.NSMALL) then
|
||||||
jz=nfft
|
jz=nfft
|
||||||
if(iform.eq.0) jz=nfft/2
|
if(iform.le.0) jz=nfft/2+1
|
||||||
aa(1:jz)=a(1:jz)
|
aa(1:jz)=a(1:jz)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
|
||||||
|
|
||||||
if(nfft.le.NSMALL) then
|
if(nfft.le.NSMALL) then
|
||||||
jz=nfft
|
jz=nfft
|
||||||
if(iform.eq.0) jz=nfft/2
|
if(iform.le.0) jz=nfft/2+1
|
||||||
a(1:jz)=aa(1:jz)
|
a(1:jz)=aa(1:jz)
|
||||||
endif
|
endif
|
||||||
end if
|
end if
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
program chkdec
|
||||||
|
|
||||||
|
parameter(NMAX=100)
|
||||||
|
character*88 line
|
||||||
|
character*37 msg(NMAX),msg0,msg1
|
||||||
|
character*2 c2(NMAX)
|
||||||
|
character*1 c1(NMAX)
|
||||||
|
character*1 only
|
||||||
|
integer nsnr(NMAX,0:1),nf(NMAX,0:1)
|
||||||
|
real dt(NMAX,0:1)
|
||||||
|
logical found,eof
|
||||||
|
|
||||||
|
! These files are sorted by freq within each Rx sequence
|
||||||
|
open(10,file='all.wsjtx',status='old')
|
||||||
|
open(11,file='all.jtdx',status='old')
|
||||||
|
write(20,1030)
|
||||||
|
1030 format(' iseq B w j W W+ J E B w j W', &
|
||||||
|
' W+ J E'/80('-'))
|
||||||
|
|
||||||
|
nutc0=-1
|
||||||
|
nbt=0 !Both
|
||||||
|
nwt=0 !WSJT-X only
|
||||||
|
njt=0 !JTDX only
|
||||||
|
net=0 !Either
|
||||||
|
n7t=0 !a7
|
||||||
|
eof=.false.
|
||||||
|
|
||||||
|
do iseq=1,9999
|
||||||
|
j=0
|
||||||
|
msg=' '
|
||||||
|
nsnr=-99
|
||||||
|
nf=-99
|
||||||
|
dt=-99
|
||||||
|
c1=' '
|
||||||
|
c2=' '
|
||||||
|
do i=1,NMAX
|
||||||
|
read(10,'(a88)',end=8) line !Read from the WSJT-X file
|
||||||
|
if(line(25:30).ne.'Rx FT8') cycle !Ignore any line not an FT8 decode
|
||||||
|
read(line(8:13),*) nutc
|
||||||
|
if(nutc0.lt.0) nutc0=nutc !First time only
|
||||||
|
if(nutc.ne.nutc0) then
|
||||||
|
backspace(10)
|
||||||
|
go to 10 !Finished WSJT-X for this sequence
|
||||||
|
endif
|
||||||
|
j=j+1
|
||||||
|
if(j.eq.1) then
|
||||||
|
nf(j,0)=-1
|
||||||
|
j=j+1
|
||||||
|
endif
|
||||||
|
read(line,1001) nsnr(j,0),dt(j,0),nf(j,0),msg(j),c2(j)
|
||||||
|
1001 format(30x,i7,f5.1,i5,1x,a36,2x,a2)
|
||||||
|
! if(nutc.eq.180215 .and. c2(j).eq.'a7') print*,'aaa',j,nf(j,0),c2(j)
|
||||||
|
nutc0=nutc
|
||||||
|
enddo ! i
|
||||||
|
|
||||||
|
8 eof=.true.
|
||||||
|
10 jz=j
|
||||||
|
do i=1,NMAX
|
||||||
|
read(11,'(a88)',end=20) line !Read from the JTDX file
|
||||||
|
if(line(31:31).ne.'~') cycle !Ignore any line not an FT8 decode
|
||||||
|
read(line(10:15),*) nutc
|
||||||
|
if(nutc.ne.nutc0) then
|
||||||
|
backspace(11)
|
||||||
|
go to 20 !Finished JTDX for this sequence
|
||||||
|
endif
|
||||||
|
msg1=line(33:58)
|
||||||
|
read(line(25:29),*) nf1
|
||||||
|
found=.false.
|
||||||
|
do j=1,jz
|
||||||
|
if(msg(j).eq.msg1) then
|
||||||
|
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
|
||||||
|
1002 format(15x,i4,f5.1,i5,29x,a1)
|
||||||
|
found=.true.
|
||||||
|
exit
|
||||||
|
endif
|
||||||
|
i1=index(msg(j),'<')
|
||||||
|
if(i1.gt.0) then
|
||||||
|
i2=index(msg(j),'>')
|
||||||
|
msg0=msg(j)(1:i1-1)//msg(j)(i1+1:i2-1)//msg(j)(i2+1:)
|
||||||
|
if(msg0.eq.msg1) then
|
||||||
|
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
|
||||||
|
found=.true.
|
||||||
|
exit
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo ! j
|
||||||
|
|
||||||
|
if(.not.found) then !Insert this one as a new message
|
||||||
|
do j=1,jz
|
||||||
|
if(nf1.ge.nf(j,0) .and. nf1.lt.nf(j+1,0)) then
|
||||||
|
jj=j+1
|
||||||
|
exit
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
do j=jz+1,jj+1,-1
|
||||||
|
nsnr(j,0)=nsnr(j-1,0)
|
||||||
|
dt(j,0)=dt(j-1,0)
|
||||||
|
nf(j,0)=nf(j-1,0)
|
||||||
|
msg(j)=msg(j-1)
|
||||||
|
c1(j)=c1(j-1)
|
||||||
|
c2(j)=c2(j-1)
|
||||||
|
enddo ! j
|
||||||
|
read(line,1004) nsnr(jj,1),dt(jj,1),nf(jj,1),msg(jj),c1(jj)
|
||||||
|
1004 format(15x,i4,f5.1,i5,3x,a26,a1)
|
||||||
|
c2(jj)=' '
|
||||||
|
nsnr(jj,0)=-99
|
||||||
|
dt(jj,0)=-99.0
|
||||||
|
nf(jj,0)=-99
|
||||||
|
jz=jz+1
|
||||||
|
endif
|
||||||
|
enddo ! i
|
||||||
|
|
||||||
|
20 nb=0
|
||||||
|
nw=0
|
||||||
|
nj=0
|
||||||
|
ne=0
|
||||||
|
n7=0
|
||||||
|
do j=2,jz
|
||||||
|
write(line,1020) nutc0,j,nsnr(j,:),dt(j,:),nf(j,:),msg(j)(1:26), &
|
||||||
|
c2(j),c1(j)
|
||||||
|
1020 format(i6.6,i3,1x,2i4,1x,2f6.1,1x,2i5,1x,a26,1x,a2,1x,a1)
|
||||||
|
if(c2(j).eq.'a7') n7=n7+1
|
||||||
|
only=' '
|
||||||
|
if(line(12:14).eq.'-99') then
|
||||||
|
line(12:14)=' '
|
||||||
|
only='j'
|
||||||
|
nj=nj+1
|
||||||
|
! if(c2(j).eq.'a7') print*,'aaa ',trim(line)
|
||||||
|
endif
|
||||||
|
if(line(16:18).eq.'-99') then
|
||||||
|
line(16:18)=' '
|
||||||
|
only='w'
|
||||||
|
nw=nw+1
|
||||||
|
endif
|
||||||
|
if(line(12:14).ne.' ' .or. line(16:19).ne.' ') ne=ne+1
|
||||||
|
if(line(12:14).ne.' ' .and. line(16:19).ne.' ') nb=nb+1
|
||||||
|
if(line(21:25).eq.'-99.0') line(21:25)=' '
|
||||||
|
if(line(27:31).eq.'-99.0') line(27:31)=' '
|
||||||
|
if(line(35:37).eq.'-99') line(35:37)=' '
|
||||||
|
if(line(40:42).eq.'-99') line(40:42)=' '
|
||||||
|
! if(line(12:14).ne.' ') nw=nw+1
|
||||||
|
! if(line(16:18).ne.' ') nj=nj+1
|
||||||
|
write(*,'(a74,1x,a1)') line(1:74),only
|
||||||
|
enddo ! j
|
||||||
|
|
||||||
|
nbt=nbt+nb
|
||||||
|
nwt=nwt+nw
|
||||||
|
n7t=n7t+n7
|
||||||
|
njt=njt+nj
|
||||||
|
net=net+ne
|
||||||
|
nutc0=nutc
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
write(20,1031) iseq,nb,nw,nj,nb+nw-n7,nb+nw,nb+nj,ne,nbt,nwt,njt, &
|
||||||
|
nbt+nwt-n7t,nbt+nwt,nbt+njt,net
|
||||||
|
1031 format(i5,2x,7i4,2x,7i6)
|
||||||
|
if(eof) exit
|
||||||
|
! if(iseq.eq.2) exit
|
||||||
|
enddo ! iseq
|
||||||
|
|
||||||
|
end program chkdec
|
|
@ -0,0 +1,378 @@
|
||||||
|
module ft8_a7
|
||||||
|
|
||||||
|
parameter(MAXDEC=100)
|
||||||
|
|
||||||
|
! For the following three arrays
|
||||||
|
! First index i=decode number in this sequence
|
||||||
|
! Second index j=0 or 1 for even or odd sequence
|
||||||
|
! Third index k=0 or 1 for previous or current tally for this j
|
||||||
|
real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k)
|
||||||
|
real f0(MAXDEC,0:1,0:1) !f0(i,j,k)
|
||||||
|
character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k)
|
||||||
|
|
||||||
|
integer itone_a7(79)
|
||||||
|
integer jseq !even=0, odd=1
|
||||||
|
integer ndec(0:1,0:1) !ndec(j,k)
|
||||||
|
data ndec/4*0/,jseq/0/
|
||||||
|
|
||||||
|
contains
|
||||||
|
|
||||||
|
subroutine ft8_a7_save(nutc,dt,f,msg)
|
||||||
|
|
||||||
|
use packjt77
|
||||||
|
character*37 msg,msg1
|
||||||
|
character*13 w(19)
|
||||||
|
character*4 g4
|
||||||
|
integer nw(19)
|
||||||
|
logical isgrid4
|
||||||
|
|
||||||
|
! Statement function:
|
||||||
|
isgrid4(g4)=(len_trim(g4).eq.4 .and. &
|
||||||
|
ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. &
|
||||||
|
ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. &
|
||||||
|
ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. &
|
||||||
|
ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9'))
|
||||||
|
|
||||||
|
if(index(msg,'/').ge.1 .or. index(msg,'<').ge.1) go to 999
|
||||||
|
call split77(msg,nwords,nw,w) !Parse msg into words
|
||||||
|
if(nwords.lt.1) go to 999
|
||||||
|
if(w(1)(1:3).eq.'CQ_') go to 999
|
||||||
|
j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence
|
||||||
|
jseq=j
|
||||||
|
|
||||||
|
! Add this decode to current table for this sequence
|
||||||
|
ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence
|
||||||
|
i=ndec(j,1) !i is index of a new table entry
|
||||||
|
if(i.ge.MAXDEC-1) return !Prevent table overflow
|
||||||
|
|
||||||
|
dt0(i,j,1)=dt !Save dt in table
|
||||||
|
f0(i,j,1)=f !Save f in table
|
||||||
|
msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2"
|
||||||
|
if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then
|
||||||
|
msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2"
|
||||||
|
endif
|
||||||
|
msg1=msg0(i,j,1) !Message without grid
|
||||||
|
nn=len(trim(msg1)) !Message length without grid
|
||||||
|
! Include grid as part of message
|
||||||
|
if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords))
|
||||||
|
|
||||||
|
! If a transmission at this frequency with message fragment "call_1 call_2"
|
||||||
|
! was decoded in the previous sequence, flag it as "DO NOT USE" because
|
||||||
|
! we have already decoded and subtracted that station's next transmission.
|
||||||
|
|
||||||
|
call split77(msg0(i,j,1),nwords,nw,w) !Parse msg into words
|
||||||
|
do i=1,ndec(j,0)
|
||||||
|
if(f0(i,j,0).le.-98.0) cycle
|
||||||
|
i2=index(msg0(i,j,0),' '//trim(w(2)))
|
||||||
|
if(abs(f-f0(i,j,0)).le.3.0 .and. i2.ge.3) then
|
||||||
|
f0(i,j,0)=-98.0 !Flag as "do not use" for a potential a7 decode
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
999 return
|
||||||
|
end subroutine ft8_a7_save
|
||||||
|
|
||||||
|
subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors,dmin, &
|
||||||
|
msg37,xsnr)
|
||||||
|
|
||||||
|
! Examine the raw data in dd0() for possible "a7" decodes.
|
||||||
|
|
||||||
|
use crc
|
||||||
|
use timer_module, only: timer
|
||||||
|
use packjt77
|
||||||
|
include 'ft8_params.f90'
|
||||||
|
parameter(NP2=2812)
|
||||||
|
character*37 msg37,msg,msgsent,msgbest
|
||||||
|
character*12 call_1,call_2
|
||||||
|
character*4 grid4
|
||||||
|
real a(5)
|
||||||
|
real s8(0:7,NN)
|
||||||
|
real s2(0:511)
|
||||||
|
real dmm(206)
|
||||||
|
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
|
||||||
|
real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols
|
||||||
|
real dd0(15*12000)
|
||||||
|
real ss(9)
|
||||||
|
real rcw(174)
|
||||||
|
integer*1 cw(174)
|
||||||
|
integer*1 msgbits(77)
|
||||||
|
integer*1 nxor(174),hdec(174)
|
||||||
|
integer itone(NN)
|
||||||
|
integer icos7(0:6),ip(1)
|
||||||
|
logical one(0:511,0:8)
|
||||||
|
integer graymap(0:7)
|
||||||
|
integer iloc(1)
|
||||||
|
complex cd0(0:3199)
|
||||||
|
complex ctwk(32)
|
||||||
|
complex csymb(32)
|
||||||
|
complex cs(0:7,NN)
|
||||||
|
logical std_1,std_2
|
||||||
|
logical first,newdat
|
||||||
|
data icos7/3,1,4,0,6,5,2/ !Sync array
|
||||||
|
data first/.true./
|
||||||
|
data graymap/0,1,3,2,5,6,4,7/
|
||||||
|
save one
|
||||||
|
|
||||||
|
if(first) then
|
||||||
|
one=.false.
|
||||||
|
do i=0,511
|
||||||
|
do j=0,8
|
||||||
|
if(iand(i,2**j).ne.0) one(i,j)=.true.
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
first=.false.
|
||||||
|
endif
|
||||||
|
|
||||||
|
call stdcall(call_1,std_1)
|
||||||
|
if(call_1(1:3).eq.'CQ ') std_1=.true.
|
||||||
|
call stdcall(call_2,std_2)
|
||||||
|
|
||||||
|
fs2=12000.0/NDOWN
|
||||||
|
dt2=1.0/fs2
|
||||||
|
twopi=8.0*atan(1.0)
|
||||||
|
delfbest=0.
|
||||||
|
ibest=0
|
||||||
|
|
||||||
|
call timer('ft8_down',0)
|
||||||
|
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
|
||||||
|
call timer('ft8_down',1)
|
||||||
|
|
||||||
|
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
|
||||||
|
smax=0.0
|
||||||
|
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
|
||||||
|
call sync8d(cd0,idt,ctwk,0,sync) !NB: ctwk not used here
|
||||||
|
if(sync.gt.smax) then
|
||||||
|
smax=sync
|
||||||
|
ibest=idt
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
! Peak up in frequency
|
||||||
|
smax=0.0
|
||||||
|
do ifr=-5,5 !Search over +/- 2.5 Hz
|
||||||
|
delf=ifr*0.5
|
||||||
|
dphi=twopi*delf*dt2
|
||||||
|
phi=0.0
|
||||||
|
do i=1,32
|
||||||
|
ctwk(i)=cmplx(cos(phi),sin(phi))
|
||||||
|
phi=mod(phi+dphi,twopi)
|
||||||
|
enddo
|
||||||
|
call sync8d(cd0,ibest,ctwk,1,sync)
|
||||||
|
if( sync .gt. smax ) then
|
||||||
|
smax=sync
|
||||||
|
delfbest=delf
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
a=0.0
|
||||||
|
a(1)=-delfbest
|
||||||
|
call twkfreq1(cd0,NP2,fs2,a,cd0)
|
||||||
|
f1=f1+delfbest !Improved estimate of DF
|
||||||
|
|
||||||
|
call timer('ft8_down',0)
|
||||||
|
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
|
||||||
|
call timer('ft8_down',1)
|
||||||
|
|
||||||
|
smax=0.0
|
||||||
|
do idt=-4,4 !Search over +/- one quarter symbol
|
||||||
|
call sync8d(cd0,ibest+idt,ctwk,0,sync)
|
||||||
|
ss(idt+5)=sync
|
||||||
|
enddo
|
||||||
|
smax=maxval(ss)
|
||||||
|
iloc=maxloc(ss)
|
||||||
|
ibest=iloc(1)-5+ibest
|
||||||
|
xdt=(ibest-1)*dt2 - 0.5
|
||||||
|
sync=smax
|
||||||
|
|
||||||
|
do k=1,NN
|
||||||
|
i1=ibest+(k-1)*32
|
||||||
|
csymb=cmplx(0.0,0.0)
|
||||||
|
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
|
||||||
|
call four2a(csymb,32,1,-1,1)
|
||||||
|
cs(0:7,k)=csymb(1:8)/1e3
|
||||||
|
s8(0:7,k)=abs(csymb(1:8))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
! sync quality check
|
||||||
|
is1=0
|
||||||
|
is2=0
|
||||||
|
is3=0
|
||||||
|
do k=1,7
|
||||||
|
ip=maxloc(s8(:,k))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
|
||||||
|
ip=maxloc(s8(:,k+36))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
|
||||||
|
ip=maxloc(s8(:,k+72))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
|
||||||
|
enddo
|
||||||
|
! hard sync sum - max is 21
|
||||||
|
nsync=is1+is2+is3
|
||||||
|
! if(nsync .le. 6) return ! bail out
|
||||||
|
|
||||||
|
do nsym=1,3
|
||||||
|
nt=2**(3*nsym)
|
||||||
|
do ihalf=1,2
|
||||||
|
do k=1,29,nsym
|
||||||
|
if(ihalf.eq.1) ks=k+7
|
||||||
|
if(ihalf.eq.2) ks=k+43
|
||||||
|
amax=-1.0
|
||||||
|
do i=0,nt-1
|
||||||
|
i1=i/64
|
||||||
|
i2=iand(i,63)/8
|
||||||
|
i3=iand(i,7)
|
||||||
|
if(nsym.eq.1) then
|
||||||
|
s2(i)=abs(cs(graymap(i3),ks))
|
||||||
|
elseif(nsym.eq.2) then
|
||||||
|
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
|
||||||
|
elseif(nsym.eq.3) then
|
||||||
|
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
|
||||||
|
else
|
||||||
|
print*,"Error - nsym must be 1, 2, or 3."
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
i32=1+(k-1)*3+(ihalf-1)*87
|
||||||
|
if(nsym.eq.1) ibmax=2
|
||||||
|
if(nsym.eq.2) ibmax=5
|
||||||
|
if(nsym.eq.3) ibmax=8
|
||||||
|
do ib=0,ibmax
|
||||||
|
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
|
||||||
|
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
|
||||||
|
if(i32+ib .gt.174) cycle
|
||||||
|
if(nsym.eq.1) then
|
||||||
|
bmeta(i32+ib)=bm
|
||||||
|
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
|
||||||
|
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
|
||||||
|
if(den.gt.0.0) then
|
||||||
|
cm=bm/den
|
||||||
|
else ! erase it
|
||||||
|
cm=0.0
|
||||||
|
endif
|
||||||
|
bmetd(i32+ib)=cm
|
||||||
|
elseif(nsym.eq.2) then
|
||||||
|
bmetb(i32+ib)=bm
|
||||||
|
elseif(nsym.eq.3) then
|
||||||
|
bmetc(i32+ib)=bm
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
call normalizebmet(bmeta,174)
|
||||||
|
call normalizebmet(bmetb,174)
|
||||||
|
call normalizebmet(bmetc,174)
|
||||||
|
call normalizebmet(bmetd,174)
|
||||||
|
|
||||||
|
scalefac=2.83
|
||||||
|
llra=scalefac*bmeta
|
||||||
|
llrb=scalefac*bmetb
|
||||||
|
llrc=scalefac*bmetc
|
||||||
|
llrd=scalefac*bmetd
|
||||||
|
|
||||||
|
! apmag=maxval(abs(llra))*1.01
|
||||||
|
|
||||||
|
MAXMSG=206
|
||||||
|
pbest=0.
|
||||||
|
dmin=1.e30
|
||||||
|
nharderrors=-1
|
||||||
|
|
||||||
|
do imsg=1,MAXMSG
|
||||||
|
msg=trim(call_1)//' '//trim(call_2)
|
||||||
|
i=imsg
|
||||||
|
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QU1RK '//trim(call_2)
|
||||||
|
if(.not.std_1) then
|
||||||
|
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
else if(.not.std_2) then
|
||||||
|
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
endif
|
||||||
|
j0=len(trim(msg))+2
|
||||||
|
if(i.eq.2) msg(j0:j0+2)='RRR'
|
||||||
|
if(i.eq.3) msg(j0:j0+3)='RR73'
|
||||||
|
if(i.eq.4) msg(j0:j0+1)='73'
|
||||||
|
if(i.eq.5) then
|
||||||
|
if(std_2) then
|
||||||
|
msg='CQ '//trim(call_2)
|
||||||
|
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
|
||||||
|
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
|
||||||
|
endif
|
||||||
|
if(.not.std_2) msg='CQ '//trim(call_2)
|
||||||
|
endif
|
||||||
|
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
|
||||||
|
if(i.ge.7) then
|
||||||
|
isnr = -50 + (i-7)/2
|
||||||
|
if(iand(i,1).eq.1) then
|
||||||
|
write(msg(j0:j0+2),'(i3.2)') isnr
|
||||||
|
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
|
||||||
|
else
|
||||||
|
write(msg(j0:j0+3),'("R",i3.2)') isnr
|
||||||
|
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
i3=-1
|
||||||
|
n3=-1
|
||||||
|
call genft8(msg,i3,n3,msgsent,msgbits,itone) !Source-encode this message
|
||||||
|
call encode174_91(msgbits,cw) !Get codeword for this message
|
||||||
|
rcw=2*cw-1
|
||||||
|
pow=0.0
|
||||||
|
do i=1,79
|
||||||
|
pow=pow+s8(itone(i),i)**2
|
||||||
|
enddo
|
||||||
|
|
||||||
|
hdec=0
|
||||||
|
where(llra.ge.0.0) hdec=1
|
||||||
|
nxor=ieor(hdec,cw)
|
||||||
|
da=sum(nxor*abs(llra))
|
||||||
|
|
||||||
|
hdec=0
|
||||||
|
where(llrb.ge.0.0) hdec=1
|
||||||
|
nxor=ieor(hdec,cw)
|
||||||
|
dbb=sum(nxor*abs(llrb))
|
||||||
|
|
||||||
|
hdec=0
|
||||||
|
where(llrc.ge.0.0) hdec=1
|
||||||
|
nxor=ieor(hdec,cw)
|
||||||
|
dc=sum(nxor*abs(llrc))
|
||||||
|
|
||||||
|
hdec=0
|
||||||
|
where(llrd.ge.0.0) hdec=1
|
||||||
|
nxor=ieor(hdec,cw)
|
||||||
|
dd=sum(nxor*abs(llrd))
|
||||||
|
|
||||||
|
dm=min(da,dbb,dc,dd)
|
||||||
|
dmm(imsg)=dm
|
||||||
|
if(dm.lt.dmin) then
|
||||||
|
dmin=dm
|
||||||
|
msgbest=msgsent
|
||||||
|
pbest=pow
|
||||||
|
if(dm.eq.da) then
|
||||||
|
nharderrors=count((2*cw-1)*llra.lt.0.0)
|
||||||
|
else if(dm.eq.dbb) then
|
||||||
|
nharderrors=count((2*cw-1)*llrb.lt.0.0)
|
||||||
|
else if(dm.eq.dc) then
|
||||||
|
nharderrors=count((2*cw-1)*llrc.lt.0.0)
|
||||||
|
else if(dm.eq.dd) then
|
||||||
|
nharderrors=count((2*cw-1)*llrd.lt.0.0)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
enddo ! imsg
|
||||||
|
|
||||||
|
iloc=minloc(dmm)
|
||||||
|
dmm(iloc(1))=1.e30
|
||||||
|
iloc=minloc(dmm)
|
||||||
|
dmin2=dmm(iloc(1))
|
||||||
|
xsnr=-24.
|
||||||
|
arg=pbest/xbase/3.0e6-1.0
|
||||||
|
if(arg.gt.0.0) xsnr=max(-24.0,db(arg)-27.0)
|
||||||
|
! write(41,3041) nharderrors,dmin,dmin2,dmin2/dmin,xsnr,trim(msgbest)
|
||||||
|
!3041 format(i3,2f7.1,f7.2,f7.1,1x,a)
|
||||||
|
if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1
|
||||||
|
msg37=msgbest
|
||||||
|
if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1
|
||||||
|
if(msg37(1:6).eq.'QU1RK ') nharderrors=-1
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine ft8_a7d
|
||||||
|
|
||||||
|
end module ft8_a7
|
|
@ -6,20 +6,19 @@ subroutine ft8apset(mycall12,hiscall12,ncontest,apsym,aph10)
|
||||||
character*13 hc13
|
character*13 hc13
|
||||||
character*10 c10
|
character*10 c10
|
||||||
integer apsym(58),aph10(10)
|
integer apsym(58),aph10(10)
|
||||||
logical nohiscall,unpk77_success
|
logical nohiscall,unpk77_success,std
|
||||||
|
|
||||||
apsym=0
|
apsym=0
|
||||||
apsym(1)=99
|
apsym(1)=99
|
||||||
apsym(30)=99
|
apsym(30)=99
|
||||||
aph10=0
|
aph10=0
|
||||||
aph10(1)=99
|
aph10(1)=99
|
||||||
|
|
||||||
if(len(trim(mycall12)).lt.3) return
|
if(len(trim(mycall12)).lt.3) return
|
||||||
|
|
||||||
nohiscall=.false.
|
nohiscall=.false.
|
||||||
hiscall=hiscall12
|
hiscall=hiscall12
|
||||||
if(len(trim(hiscall)).lt.3) then
|
if(len(trim(hiscall)).lt.3) then
|
||||||
hiscall=mycall12 ! use mycall for dummy hiscall - mycall won't be hashed.
|
hiscall='KA1ABC' !Use a dummy hiscall
|
||||||
nohiscall=.true.
|
nohiscall=.true.
|
||||||
else
|
else
|
||||||
hc13=hiscall
|
hc13=hiscall
|
||||||
|
@ -34,7 +33,9 @@ subroutine ft8apset(mycall12,hiscall12,ncontest,apsym,aph10)
|
||||||
|
|
||||||
! Encode a dummy standard message: i3=1, 28 1 28 1 1 15
|
! Encode a dummy standard message: i3=1, 28 1 28 1 1 15
|
||||||
!
|
!
|
||||||
msg=trim(mycall12)//' '//trim(hiscall)//' RRR'
|
msg=trim(mycall12)//' '//trim(hiscall)//' RRR'
|
||||||
|
call stdcall(mycall12,std)
|
||||||
|
if(.not.std) msg='<'//trim(mycall12)//'> '//trim(hiscall)//' RRR'
|
||||||
i3=0
|
i3=0
|
||||||
n3=0
|
n3=0
|
||||||
call pack77(msg,i3,n3,c77)
|
call pack77(msg,i3,n3,c77)
|
||||||
|
|
|
@ -0,0 +1,261 @@
|
||||||
|
subroutine ft8c(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, &
|
||||||
|
msg37,xsnr)
|
||||||
|
|
||||||
|
use crc
|
||||||
|
use timer_module, only: timer
|
||||||
|
use packjt77
|
||||||
|
include 'ft8_params.f90'
|
||||||
|
parameter(NP2=2812)
|
||||||
|
character*37 msg37,msg,msgsent,msgbest
|
||||||
|
character*12 call_1,call_2
|
||||||
|
character*4 grid4
|
||||||
|
real a(5)
|
||||||
|
real s8(0:7,NN)
|
||||||
|
real s2(0:511)
|
||||||
|
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
|
||||||
|
real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols
|
||||||
|
real dd0(15*12000)
|
||||||
|
real ss(9)
|
||||||
|
real rcw(174)
|
||||||
|
integer*1 cw(174)
|
||||||
|
integer*1 msgbits(77)
|
||||||
|
integer*1 nxor(174),hdec(174)
|
||||||
|
integer itone(NN)
|
||||||
|
integer icos7(0:6),ip(1)
|
||||||
|
logical one(0:511,0:8)
|
||||||
|
integer graymap(0:7)
|
||||||
|
integer iloc(1)
|
||||||
|
complex cd0(0:3199)
|
||||||
|
complex ctwk(32)
|
||||||
|
complex csymb(32)
|
||||||
|
complex cs(0:7,NN)
|
||||||
|
logical std_1,std_2
|
||||||
|
logical first,newdat
|
||||||
|
data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array
|
||||||
|
data first/.true./
|
||||||
|
data graymap/0,1,3,2,5,6,4,7/
|
||||||
|
save one
|
||||||
|
|
||||||
|
if(first) then
|
||||||
|
one=.false.
|
||||||
|
do i=0,511
|
||||||
|
do j=0,8
|
||||||
|
if(iand(i,2**j).ne.0) one(i,j)=.true.
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
first=.false.
|
||||||
|
endif
|
||||||
|
|
||||||
|
call stdcall(call_1,std_1)
|
||||||
|
if(call_1(1:3).eq.'CQ ') std_1=.true.
|
||||||
|
call stdcall(call_2,std_2)
|
||||||
|
|
||||||
|
nharderrors=-1
|
||||||
|
fs2=12000.0/NDOWN
|
||||||
|
dt2=1.0/fs2
|
||||||
|
twopi=8.0*atan(1.0)
|
||||||
|
delfbest=0.
|
||||||
|
ibest=0
|
||||||
|
|
||||||
|
call timer('ft8_down',0)
|
||||||
|
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
|
||||||
|
call timer('ft8_down',1)
|
||||||
|
|
||||||
|
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
|
||||||
|
smax=0.0
|
||||||
|
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
|
||||||
|
call sync8d(cd0,idt,ctwk,0,sync)
|
||||||
|
if(sync.gt.smax) then
|
||||||
|
smax=sync
|
||||||
|
ibest=idt
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
! Now peak up in frequency
|
||||||
|
smax=0.0
|
||||||
|
do ifr=-5,5 !Search over +/- 2.5 Hz
|
||||||
|
delf=ifr*0.5
|
||||||
|
dphi=twopi*delf*dt2
|
||||||
|
phi=0.0
|
||||||
|
do i=1,32
|
||||||
|
ctwk(i)=cmplx(cos(phi),sin(phi))
|
||||||
|
phi=mod(phi+dphi,twopi)
|
||||||
|
enddo
|
||||||
|
call sync8d(cd0,ibest,ctwk,1,sync)
|
||||||
|
if( sync .gt. smax ) then
|
||||||
|
smax=sync
|
||||||
|
delfbest=delf
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
a=0.0
|
||||||
|
a(1)=-delfbest
|
||||||
|
call twkfreq1(cd0,NP2,fs2,a,cd0)
|
||||||
|
f1=f1+delfbest !Improved estimate of DF
|
||||||
|
|
||||||
|
call timer('ft8_down',0)
|
||||||
|
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
|
||||||
|
call timer('ft8_down',1)
|
||||||
|
|
||||||
|
smax=0.0
|
||||||
|
do idt=-4,4 !Search over +/- one quarter symbol
|
||||||
|
call sync8d(cd0,ibest+idt,ctwk,0,sync)
|
||||||
|
ss(idt+5)=sync
|
||||||
|
enddo
|
||||||
|
smax=maxval(ss)
|
||||||
|
iloc=maxloc(ss)
|
||||||
|
ibest=iloc(1)-5+ibest
|
||||||
|
xdt=(ibest-1)*dt2 - 0.5
|
||||||
|
sync=smax
|
||||||
|
|
||||||
|
do k=1,NN
|
||||||
|
i1=ibest+(k-1)*32
|
||||||
|
csymb=cmplx(0.0,0.0)
|
||||||
|
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
|
||||||
|
call four2a(csymb,32,1,-1,1)
|
||||||
|
cs(0:7,k)=csymb(1:8)/1e3
|
||||||
|
s8(0:7,k)=abs(csymb(1:8))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
! sync quality check
|
||||||
|
is1=0
|
||||||
|
is2=0
|
||||||
|
is3=0
|
||||||
|
do k=1,7
|
||||||
|
ip=maxloc(s8(:,k))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
|
||||||
|
ip=maxloc(s8(:,k+36))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
|
||||||
|
ip=maxloc(s8(:,k+72))
|
||||||
|
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
|
||||||
|
enddo
|
||||||
|
! hard sync sum - max is 21
|
||||||
|
nsync=is1+is2+is3
|
||||||
|
! if(nsync .le. 6) return ! bail out
|
||||||
|
|
||||||
|
do nsym=1,3
|
||||||
|
nt=2**(3*nsym)
|
||||||
|
do ihalf=1,2
|
||||||
|
do k=1,29,nsym
|
||||||
|
if(ihalf.eq.1) ks=k+7
|
||||||
|
if(ihalf.eq.2) ks=k+43
|
||||||
|
amax=-1.0
|
||||||
|
do i=0,nt-1
|
||||||
|
i1=i/64
|
||||||
|
i2=iand(i,63)/8
|
||||||
|
i3=iand(i,7)
|
||||||
|
if(nsym.eq.1) then
|
||||||
|
s2(i)=abs(cs(graymap(i3),ks))
|
||||||
|
elseif(nsym.eq.2) then
|
||||||
|
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
|
||||||
|
elseif(nsym.eq.3) then
|
||||||
|
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
|
||||||
|
else
|
||||||
|
print*,"Error - nsym must be 1, 2, or 3."
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
i32=1+(k-1)*3+(ihalf-1)*87
|
||||||
|
if(nsym.eq.1) ibmax=2
|
||||||
|
if(nsym.eq.2) ibmax=5
|
||||||
|
if(nsym.eq.3) ibmax=8
|
||||||
|
do ib=0,ibmax
|
||||||
|
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
|
||||||
|
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
|
||||||
|
if(i32+ib .gt.174) cycle
|
||||||
|
if(nsym.eq.1) then
|
||||||
|
bmeta(i32+ib)=bm
|
||||||
|
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
|
||||||
|
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
|
||||||
|
if(den.gt.0.0) then
|
||||||
|
cm=bm/den
|
||||||
|
else ! erase it
|
||||||
|
cm=0.0
|
||||||
|
endif
|
||||||
|
bmetd(i32+ib)=cm
|
||||||
|
elseif(nsym.eq.2) then
|
||||||
|
bmetb(i32+ib)=bm
|
||||||
|
elseif(nsym.eq.3) then
|
||||||
|
bmetc(i32+ib)=bm
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
call normalizebmet(bmeta,174)
|
||||||
|
call normalizebmet(bmetb,174)
|
||||||
|
call normalizebmet(bmetc,174)
|
||||||
|
call normalizebmet(bmetd,174)
|
||||||
|
|
||||||
|
scalefac=2.83
|
||||||
|
llra=scalefac*bmeta
|
||||||
|
llrb=scalefac*bmetb
|
||||||
|
llrc=scalefac*bmetc
|
||||||
|
llrd=scalefac*bmetd
|
||||||
|
|
||||||
|
! apmag=maxval(abs(llra))*1.01
|
||||||
|
|
||||||
|
MAXMSG=206
|
||||||
|
pbest=0.
|
||||||
|
do imsg=1,MAXMSG
|
||||||
|
msg=trim(call_1)//' '//trim(call_2)
|
||||||
|
i=imsg
|
||||||
|
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2)
|
||||||
|
if(.not.std_1) then
|
||||||
|
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
else if(.not.std_2) then
|
||||||
|
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
endif
|
||||||
|
j0=len(trim(msg))+2
|
||||||
|
if(i.eq.2) msg(j0:j0+2)='RRR'
|
||||||
|
if(i.eq.3) msg(j0:j0+3)='RR73'
|
||||||
|
if(i.eq.4) msg(j0:j0+1)='73'
|
||||||
|
if(i.eq.5) then
|
||||||
|
if(std_2) then
|
||||||
|
msg='CQ '//trim(call_2)
|
||||||
|
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
|
||||||
|
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
|
||||||
|
endif
|
||||||
|
if(.not.std_2) msg='CQ '//trim(call_2)
|
||||||
|
endif
|
||||||
|
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
|
||||||
|
if(i.ge.7) then
|
||||||
|
isnr = -50 + (i-7)/2
|
||||||
|
if(iand(i,1).eq.1) then
|
||||||
|
write(msg(j0:j0+2),'(i3.2)') isnr
|
||||||
|
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
|
||||||
|
else
|
||||||
|
write(msg(j0:j0+3),'("R",i3.2)') isnr
|
||||||
|
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Source-encode, then get codeword
|
||||||
|
i3=-1
|
||||||
|
n3=-1
|
||||||
|
call genft8(msg,i3,n3,msgsent,msgbits,itone)
|
||||||
|
call encode174_91(msgbits,cw)
|
||||||
|
rcw=2*cw-1
|
||||||
|
pa=sum(llra*rcw)
|
||||||
|
pb=sum(llrb*rcw)
|
||||||
|
pc=sum(llrc*rcw)
|
||||||
|
pd=sum(llrd*rcw)
|
||||||
|
|
||||||
|
if(pa.gt.pbest) then
|
||||||
|
pbest=pa
|
||||||
|
msgbest=msgsent
|
||||||
|
llrbest=llra
|
||||||
|
nharderrors=count((2*cw-1)*llra.lt.0.0)
|
||||||
|
hdec=0
|
||||||
|
where(llra.ge.0.0) hdec=1
|
||||||
|
nxor=ieor(hdec,cw)
|
||||||
|
dmin=sum(nxor*abs(llra))
|
||||||
|
endif
|
||||||
|
enddo ! imsg
|
||||||
|
|
||||||
|
! write(*,4001) pbest,nharderrors,dmin,trim(msgbest)
|
||||||
|
!4001 format('$$$',f7.1,i4,f7.1,2x,a)
|
||||||
|
msg37=msgbest
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine ft8c
|
|
@ -0,0 +1,109 @@
|
||||||
|
subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr)
|
||||||
|
|
||||||
|
! Get q3-style decodes for FT8.
|
||||||
|
|
||||||
|
use packjt77
|
||||||
|
parameter(NN=79,NSPS=32)
|
||||||
|
parameter(NWAVE=NN*NSPS) !2528
|
||||||
|
parameter(NZ=3200,NLAGS=NZ-NWAVE)
|
||||||
|
character*12 call_1,call_2
|
||||||
|
character*4 grid4
|
||||||
|
character*37 msg,msgbest,msgsent
|
||||||
|
character c77*77
|
||||||
|
complex cwave(0:NWAVE-1)
|
||||||
|
complex cd(0:NZ-1)
|
||||||
|
complex z
|
||||||
|
real xjunk(NWAVE)
|
||||||
|
real ccf(0:NLAGS-1)
|
||||||
|
real ccfmsg(206)
|
||||||
|
integer itone(NN)
|
||||||
|
integer*1 msgbits(77)
|
||||||
|
logical std_1,std_2
|
||||||
|
|
||||||
|
if(xdt.eq.-99.0) return !Silence compiler warning
|
||||||
|
call stdcall(call_1,std_1)
|
||||||
|
call stdcall(call_2,std_2)
|
||||||
|
|
||||||
|
fs=200.0 !Sample rate (Hz)
|
||||||
|
dt=1.0/fs !Sample interval (s)
|
||||||
|
bt=2.0
|
||||||
|
ccfbest=0.
|
||||||
|
lagbest=-1
|
||||||
|
|
||||||
|
do imsg=1,206
|
||||||
|
msg=trim(call_1)//' '//trim(call_2)
|
||||||
|
i=imsg
|
||||||
|
if(.not.std_1) then
|
||||||
|
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
else if(.not.std_2) then
|
||||||
|
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
|
||||||
|
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
|
||||||
|
endif
|
||||||
|
j0=len(trim(msg))+2
|
||||||
|
if(i.eq.2) msg(j0:j0+2)='RRR'
|
||||||
|
if(i.eq.3) msg(j0:j0+3)='RR73'
|
||||||
|
if(i.eq.4) msg(j0:j0+1)='73'
|
||||||
|
if(i.eq.5) then
|
||||||
|
if(std_2) msg='CQ '//trim(call_2)//' '//grid4
|
||||||
|
if(.not.std_2) msg='CQ '//trim(call_2)
|
||||||
|
endif
|
||||||
|
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
|
||||||
|
if(i.ge.7 .and. i.le.206) then
|
||||||
|
isnr = -50 + (i-7)/2
|
||||||
|
if(iand(i,1).eq.1) then
|
||||||
|
write(msg(j0:j0+2),'(i3.2)') isnr
|
||||||
|
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
|
||||||
|
else
|
||||||
|
write(msg(j0:j0+3),'("R",i3.2)') isnr
|
||||||
|
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Source-encode, then get itone()
|
||||||
|
i3=-1
|
||||||
|
n3=-1
|
||||||
|
call pack77(msg,i3,n3,c77)
|
||||||
|
call genft8(msg,i3,n3,msgsent,msgbits,itone)
|
||||||
|
! Generate complex cwave
|
||||||
|
call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE)
|
||||||
|
|
||||||
|
lagmax=-1
|
||||||
|
ccfmax=0.
|
||||||
|
nsum=32*2
|
||||||
|
do lag=0,nlags-1
|
||||||
|
z=0.
|
||||||
|
s=0.
|
||||||
|
do i=0,NWAVE-1
|
||||||
|
z=z + cd(i+lag)*conjg(cwave(i))
|
||||||
|
if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then
|
||||||
|
s=s + abs(z)
|
||||||
|
z=0.
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
ccf(lag)=s
|
||||||
|
if(ccf(lag).gt.ccfmax) then
|
||||||
|
ccfmax=ccf(lag)
|
||||||
|
lagmax=lag
|
||||||
|
endif
|
||||||
|
enddo ! lag
|
||||||
|
ccfmsg(imsg)=ccfmax
|
||||||
|
if(ccfmax.gt.ccfbest) then
|
||||||
|
ccfbest=ccfmax
|
||||||
|
lagbest=lagmax
|
||||||
|
msgbest=msg
|
||||||
|
endif
|
||||||
|
enddo ! imsg
|
||||||
|
|
||||||
|
call pctile(ccfmsg,207,50,base)
|
||||||
|
call pctile(ccfmsg,207,67,sigma)
|
||||||
|
sigma=sigma-base
|
||||||
|
ccfmsg=(ccfmsg-base)/sigma
|
||||||
|
! do imsg=1,207
|
||||||
|
! write(44,3044) imsg,ccfmsg(imsg)
|
||||||
|
!3044 format(i5,f10.3)
|
||||||
|
! enddo
|
||||||
|
snr=maxval(ccfmsg)
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine ft8q3
|
|
@ -9,11 +9,12 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
|
||||||
real pulse(23040)
|
real pulse(23040)
|
||||||
real dphi(0:(nsym+2)*nsps-1)
|
real dphi(0:(nsym+2)*nsps-1)
|
||||||
integer itone(nsym)
|
integer itone(nsym)
|
||||||
data ibt0/0/
|
data fchk0/0.0/
|
||||||
save pulse,twopi,dt,hmod,ibt0,ctab
|
save pulse,twopi,dt,hmod,fchk0,ctab
|
||||||
|
|
||||||
ibt=nint(10*bt)
|
ibt=nint(10*bt)
|
||||||
if(ibt0.ne.ibt) then
|
fchk=nsym+nsps+bt+fsample
|
||||||
|
if(fchk.ne.fchk0) then
|
||||||
twopi=8.0*atan(1.0)
|
twopi=8.0*atan(1.0)
|
||||||
dt=1.0/fsample
|
dt=1.0/fsample
|
||||||
hmod=1.0
|
hmod=1.0
|
||||||
|
@ -22,11 +23,11 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
|
||||||
tt=(i-1.5*nsps)/real(nsps)
|
tt=(i-1.5*nsps)/real(nsps)
|
||||||
pulse(i)=gfsk_pulse(bt,tt)
|
pulse(i)=gfsk_pulse(bt,tt)
|
||||||
enddo
|
enddo
|
||||||
ibt0=nint(10*bt)
|
|
||||||
do i=0,NTAB-1
|
do i=0,NTAB-1
|
||||||
phi=i*twopi/NTAB
|
phi=i*twopi/NTAB
|
||||||
ctab(i)=cmplx(cos(phi),sin(phi))
|
ctab(i)=cmplx(cos(phi),sin(phi))
|
||||||
enddo
|
enddo
|
||||||
|
fchk0=fchk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! Compute the smoothed frequency waveform.
|
! Compute the smoothed frequency waveform.
|
||||||
|
|
|
@ -58,6 +58,8 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt)
|
||||||
sq0=sqf(0) !Do the subtraction with idt=0
|
sq0=sqf(0) !Do the subtraction with idt=0
|
||||||
endif
|
endif
|
||||||
dd0=dd !Return dd0 with this signal subtracted
|
dd0=dd !Return dd0 with this signal subtracted
|
||||||
|
! write(44,3044) nint(f0),dt-0.5,1.e-8*sum(dd*dd)
|
||||||
|
!3044 format(i4,f7.2,f10.6)
|
||||||
return
|
return
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
program test_ft8q3
|
||||||
|
|
||||||
|
! Test q3-style decodes for FT8.
|
||||||
|
|
||||||
|
use packjt77
|
||||||
|
parameter(NN=79,NSPS=32)
|
||||||
|
parameter(NWAVE=NN*NSPS) !2528
|
||||||
|
parameter(NZ=3200,NLAGS=NZ-NWAVE)
|
||||||
|
character arg*12
|
||||||
|
character*37 msg
|
||||||
|
character*12 call_1,call_2
|
||||||
|
character*4 grid4
|
||||||
|
complex cd(0:NZ-1)
|
||||||
|
|
||||||
|
! Get command-line argument(s)
|
||||||
|
nargs=iargc()
|
||||||
|
if(nargs.ne.4 .and. nargs.ne.5) then
|
||||||
|
print*,'Usage: ft8q3 DT f0 call_1 call_2 [grid4]'
|
||||||
|
go to 999
|
||||||
|
endif
|
||||||
|
call getarg(1,arg)
|
||||||
|
read(arg,*) xdt !Time offset from nominal (s)
|
||||||
|
call getarg(2,arg)
|
||||||
|
read(arg,*) f0 !Frequency (Hz)
|
||||||
|
call getarg(3,call_1) !First callsign
|
||||||
|
call getarg(4,call_2) !Second callsign
|
||||||
|
grid4=' '
|
||||||
|
if(nargs.eq.5) call getarg(5,grid4) !Locator for call_2
|
||||||
|
|
||||||
|
do i=0,NZ-1
|
||||||
|
read(40,3040) cd(i)
|
||||||
|
3040 format(17x,2f10.3)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
call sec0(0,t)
|
||||||
|
call ft8q3(cd,xdt,f0,call_1,call_2,grid4,msg,snr)
|
||||||
|
call sec0(1,t)
|
||||||
|
write(*,1100) t,snr,trim(msg)
|
||||||
|
1100 format('Time:',f6.2,' S/N:',f6.1,' msg: ',a)
|
||||||
|
|
||||||
|
999 end program test_ft8q3
|
|
@ -38,6 +38,7 @@ contains
|
||||||
use iso_c_binding, only: c_bool, c_int
|
use iso_c_binding, only: c_bool, c_int
|
||||||
use timer_module, only: timer
|
use timer_module, only: timer
|
||||||
use shmem, only: shmem_lock, shmem_unlock
|
use shmem, only: shmem_lock, shmem_unlock
|
||||||
|
use ft8_a7
|
||||||
|
|
||||||
include 'ft8/ft8_params.f90'
|
include 'ft8/ft8_params.f90'
|
||||||
|
|
||||||
|
@ -53,7 +54,8 @@ contains
|
||||||
logical newdat,lsubtract,ldupe,lrefinedt
|
logical newdat,lsubtract,ldupe,lrefinedt
|
||||||
logical*1 ldiskdat
|
logical*1 ldiskdat
|
||||||
logical lsubtracted(MAX_EARLY)
|
logical lsubtracted(MAX_EARLY)
|
||||||
character*12 mycall12,hiscall12
|
character*12 mycall12,hiscall12,call_1,call_2
|
||||||
|
character*4 grid4
|
||||||
integer*2 iwave(15*12000)
|
integer*2 iwave(15*12000)
|
||||||
integer apsym2(58),aph10(10)
|
integer apsym2(58),aph10(10)
|
||||||
character datetime*13,msg37*37
|
character datetime*13,msg37*37
|
||||||
|
@ -64,13 +66,33 @@ contains
|
||||||
integer itone_save(NN,MAX_EARLY)
|
integer itone_save(NN,MAX_EARLY)
|
||||||
real f1_save(MAX_EARLY)
|
real f1_save(MAX_EARLY)
|
||||||
real xdt_save(MAX_EARLY)
|
real xdt_save(MAX_EARLY)
|
||||||
|
data nutc0/-1/
|
||||||
|
|
||||||
save s,dd,dd1,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,allmessages
|
save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,&
|
||||||
|
allmessages
|
||||||
|
|
||||||
this%callback => callback
|
this%callback => callback
|
||||||
write(datetime,1001) nutc !### TEMPORARY ###
|
write(datetime,1001) nutc !### TEMPORARY ###
|
||||||
1001 format("000000_",i6.6)
|
1001 format("000000_",i6.6)
|
||||||
|
|
||||||
|
if(nutc0.eq.-1) then
|
||||||
|
msg0=' '
|
||||||
|
dt0=0.
|
||||||
|
f0=0.
|
||||||
|
endif
|
||||||
|
if(nutc.ne.nutc0) then
|
||||||
|
! New UTC. Move previously saved 'a7' data from k=1 to k=0
|
||||||
|
iz=ndec(jseq,1)
|
||||||
|
dt0(1:iz,jseq,0) = dt0(1:iz,jseq,1)
|
||||||
|
f0(1:iz,jseq,0) = f0(1:iz,jseq,1)
|
||||||
|
msg0(1:iz,jseq,0) = msg0(1:iz,jseq,1)
|
||||||
|
ndec(jseq,0)=iz
|
||||||
|
ndec(jseq,1)=0
|
||||||
|
nutc0=nutc
|
||||||
|
dt0(:,jseq,1)=0.
|
||||||
|
f0(:,jseq,1)=0.
|
||||||
|
endif
|
||||||
|
|
||||||
if(ndepth.eq.1 .and. nzhsym.lt.50) then
|
if(ndepth.eq.1 .and. nzhsym.lt.50) then
|
||||||
ndec_early=0
|
ndec_early=0
|
||||||
return
|
return
|
||||||
|
@ -178,7 +200,7 @@ contains
|
||||||
hiscall12,f1,xdt,xbase,apsym2,aph10,nharderrors,dmin, &
|
hiscall12,f1,xdt,xbase,apsym2,aph10,nharderrors,dmin, &
|
||||||
nbadcrc,iappass,msg37,xsnr,itone)
|
nbadcrc,iappass,msg37,xsnr,itone)
|
||||||
call timer('ft8b ',1)
|
call timer('ft8b ',1)
|
||||||
nsnr=nint(xsnr)
|
nsnr=nint(xsnr)
|
||||||
xdt=xdt-0.5
|
xdt=xdt-0.5
|
||||||
hd=nharderrors+dmin
|
hd=nharderrors+dmin
|
||||||
if(nbadcrc.eq.0) then
|
if(nbadcrc.eq.0) then
|
||||||
|
@ -198,6 +220,11 @@ contains
|
||||||
qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
|
qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
|
||||||
if(emedelay.ne.0) xdt=xdt+2.0
|
if(emedelay.ne.0) xdt=xdt+2.0
|
||||||
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
|
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
|
||||||
|
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
|
||||||
|
! ii=ndec(jseq,1)
|
||||||
|
! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),&
|
||||||
|
! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22)
|
||||||
|
!3041 format(3i5,2x,a22,i5,2x,a22)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
call timestamp(tsec,tseq,ctime)
|
call timestamp(tsec,tseq,ctime)
|
||||||
|
@ -209,7 +236,43 @@ contains
|
||||||
800 ndec_early=0
|
800 ndec_early=0
|
||||||
if(nzhsym.lt.50) ndec_early=ndecodes
|
if(nzhsym.lt.50) ndec_early=ndecodes
|
||||||
|
|
||||||
900 return
|
900 continue
|
||||||
|
if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then
|
||||||
|
newdat=.true.
|
||||||
|
do i=1,ndec(jseq,0)
|
||||||
|
if(f0(i,jseq,0).eq.-99.0) exit
|
||||||
|
if(f0(i,jseq,0).eq.-98.0) cycle
|
||||||
|
if(index(msg0(i,jseq,0),'<').ge.1) cycle !### Temporary ###
|
||||||
|
msg37=msg0(i,jseq,0)
|
||||||
|
i1=index(msg37,' ')
|
||||||
|
i2=index(msg37(i1+1:),' ') + i1
|
||||||
|
call_1=msg37(1:i1-1)
|
||||||
|
call_2=msg37(i1+1:i2-1)
|
||||||
|
grid4=msg37(i2+1:i2+4)
|
||||||
|
if(grid4.eq.'RR73' .or. index(grid4,'+').gt.0 .or. &
|
||||||
|
index(grid4,'-').gt.0) grid4=' '
|
||||||
|
xdt=dt0(i,jseq,0)
|
||||||
|
f1=f0(i,jseq,0)
|
||||||
|
xbase=10.0**(0.1*(sbase(max(1,nint(f1/3.125)))-40.0))
|
||||||
|
msg37=' '
|
||||||
|
call timer('ft8_a7d ',0)
|
||||||
|
call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors, &
|
||||||
|
dmin,msg37,xsnr)
|
||||||
|
call timer('ft8_a7d ',1)
|
||||||
|
|
||||||
|
if(nharderrors.ge.0) then
|
||||||
|
if(associated(this%callback)) then
|
||||||
|
nsnr=xsnr
|
||||||
|
iaptype=7
|
||||||
|
qual=1.0
|
||||||
|
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
|
||||||
|
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
|
||||||
|
return
|
||||||
end subroutine decode
|
end subroutine decode
|
||||||
|
|
||||||
subroutine timestamp(tsec,tseq,ctime)
|
subroutine timestamp(tsec,tseq,ctime)
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
|
||||||
|
|
||||||
! Encodes a JT65 message to yieild itone(1:126)
|
! Encodes a JT65 message to yieild itone(1:126)
|
||||||
! Temporarily, does not implement EME shorthands
|
! Temporarily, does not implement EME shorthands
|
||||||
|
|
||||||
use packjt
|
use packjt
|
||||||
|
character*1 msg00(23),msgsent0(23)
|
||||||
character*22 msg0
|
character*22 msg0
|
||||||
character*22 message !Message to be generated
|
character*22 message !Message to be generated
|
||||||
character*22 msgsent !Message as it will be received
|
character*22 msgsent !Message as it will be received
|
||||||
|
@ -21,6 +22,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||||
1,1,1,1,1,1/
|
1,1,1,1,1,1/
|
||||||
save
|
save
|
||||||
|
|
||||||
|
do i=1,22
|
||||||
|
msg0(i:i)=msg00(i)
|
||||||
|
enddo
|
||||||
|
|
||||||
if(msg0(1:1).eq.'@') then
|
if(msg0(1:1).eq.'@') then
|
||||||
read(msg0(2:5),*,end=1,err=1) nfreq
|
read(msg0(2:5),*,end=1,err=1) nfreq
|
||||||
go to 2
|
go to 2
|
||||||
|
@ -48,7 +53,7 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||||
call unpackmsg(dgen,msgsent) !Unpack to get message sent
|
call unpackmsg(dgen,msgsent) !Unpack to get message sent
|
||||||
msgsent(20:22)=cok
|
msgsent(20:22)=cok
|
||||||
call fmtmsg(msgsent,iz)
|
call fmtmsg(msgsent,iz)
|
||||||
if(ichk.ne.0) go to 999 !Return if checking only
|
if(ichk.ne.0) go to 900 !Return if checking only
|
||||||
|
|
||||||
call rs_encode(dgen,sent) !Apply Reed-Solomon code
|
call rs_encode(dgen,sent) !Apply Reed-Solomon code
|
||||||
call interleave63(sent,1) !Apply interleaving
|
call interleave63(sent,1) !Apply interleaving
|
||||||
|
@ -79,5 +84,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
999 return
|
900 do i=1,22
|
||||||
|
msgsent0(i)=msgsent(i:i)
|
||||||
|
enddo
|
||||||
|
msgsent0(23)=char(0)
|
||||||
|
|
||||||
|
return
|
||||||
end subroutine gen65
|
end subroutine gen65
|
||||||
|
|
|
@ -3,7 +3,8 @@ subroutine grid2deg(grid0,dlong,dlat)
|
||||||
! Converts Maidenhead grid locator to degrees of West longitude
|
! Converts Maidenhead grid locator to degrees of West longitude
|
||||||
! and North latitude.
|
! and North latitude.
|
||||||
|
|
||||||
character*6 grid0,grid
|
character*(*) grid0
|
||||||
|
character*6 grid
|
||||||
character*1 g1,g2,g3,g4,g5,g6
|
character*1 g1,g2,g3,g4,g5,g6
|
||||||
|
|
||||||
grid=grid0
|
grid=grid0
|
||||||
|
|
|
@ -20,7 +20,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144, &
|
||||||
|
|
||||||
parameter (JZ=703)
|
parameter (JZ=703)
|
||||||
character*80 line1
|
character*80 line1
|
||||||
character*512 datadir
|
character*(*) datadir
|
||||||
character*12 mycall,hiscall
|
character*12 mycall,hiscall
|
||||||
integer*2 id2(0:120*12000-1)
|
integer*2 id2(0:120*12000-1)
|
||||||
logical*1 bmsk144,bshmsg,btrain,bswl
|
logical*1 bmsk144,bshmsg,btrain,bswl
|
||||||
|
|
|
@ -162,6 +162,7 @@ contains
|
||||||
ib=min(NSZ,nint((nfb+100)/df))
|
ib=min(NSZ,nint((nfb+100)/df))
|
||||||
nz=ib-ia+1
|
nz=ib-ia+1
|
||||||
if(nz.lt.50) go to 900
|
if(nz.lt.50) go to 900
|
||||||
|
if(isnan(sum(savg(ia:ia+nz-1)))) go to 900
|
||||||
call lorentzian(savg(ia),nz,a)
|
call lorentzian(savg(ia),nz,a)
|
||||||
baseline=a(1)
|
baseline=a(1)
|
||||||
amp=a(2)
|
amp=a(2)
|
||||||
|
|
|
@ -55,7 +55,8 @@ subroutine jt9a()
|
||||||
if(.not.ok) call abort
|
if(.not.ok) call abort
|
||||||
call flush(6)
|
call flush(6)
|
||||||
call timer('decoder ',0)
|
call timer('decoder ',0)
|
||||||
if(local_params%nmode.eq.8 .and. local_params%ndiskdat) then
|
if(local_params%nmode.eq.8 .and. local_params%ndiskdat .and. &
|
||||||
|
.not. local_params%nagain) then
|
||||||
! Early decoding pass, FT8 only, when wsjtx reads from disk
|
! Early decoding pass, FT8 only, when wsjtx reads from disk
|
||||||
nearly=41
|
nearly=41
|
||||||
local_params%nzhsym=nearly
|
local_params%nzhsym=nearly
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
subroutine makepings(pings,npts,width,sig)
|
subroutine makepings(pings,nTRperiod,npts,width,sig)
|
||||||
|
|
||||||
real pings(npts)
|
real pings(npts)
|
||||||
real*8 t
|
real*8 t
|
||||||
real t0(14)
|
real t0(29)
|
||||||
|
|
||||||
iping0=-999
|
|
||||||
dt=1.0/12000.0
|
dt=1.0/12000.0
|
||||||
do i=1,14
|
do i=1,nTRperiod-1
|
||||||
t0(i)=i !Make pings at t=1, 2, ... 14 s.
|
t0(i)=i !Make pings at t=1, 2, ... 14 s.
|
||||||
enddo
|
enddo
|
||||||
amp=sig
|
amp=sig
|
||||||
|
|
||||||
do i=1,npts
|
do i=1,npts
|
||||||
iping=min(max(1,i/12000),14)
|
iping=min(max(1,i/12000),nTRperiod-1)
|
||||||
t=(i*dt-t0(iping))/width
|
t=(i*dt-t0(iping))/width
|
||||||
if(t.lt.0.d0 .and. t.lt.10.0) then !????
|
if(t.lt.0.d0 .or. t.gt.10.0) then
|
||||||
fac=0.
|
fac=0.
|
||||||
else
|
else
|
||||||
fac=2.718*t*dexp(-t)
|
fac=2.718*t*dexp(-t)
|
||||||
|
|
|
@ -9,7 +9,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
|
||||||
character*8 date
|
character*8 date
|
||||||
character*10 time
|
character*10 time
|
||||||
character*5 zone
|
character*5 zone
|
||||||
character*512 datadir
|
character*(*) datadir
|
||||||
|
|
||||||
complex cframe(864)
|
complex cframe(864)
|
||||||
complex cross(864)
|
complex cross(864)
|
||||||
|
@ -191,9 +191,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
|
||||||
write(pcoeff_filename,'(i2.2,i2.2,i2.2,"_",i2.2,i2.2,i2.2)') &
|
write(pcoeff_filename,'(i2.2,i2.2,i2.2,"_",i2.2,i2.2,i2.2)') &
|
||||||
values(1)-2000,values(2),values(3),values(5),values(6),values(7)
|
values(1)-2000,values(2),values(3),values(5),values(6),values(7)
|
||||||
pcoeff_filename=trim(trained_dxcall)//"_"//trim(pcoeff_filename)//".pcoeff"
|
pcoeff_filename=trim(trained_dxcall)//"_"//trim(pcoeff_filename)//".pcoeff"
|
||||||
l1=index(datadir,char(0))-1
|
pcoeff_filename=datadir//'/'//trim(pcoeff_filename)
|
||||||
datadir(l1+1:l1+1)="/"
|
|
||||||
pcoeff_filename=datadir(1:l1+1)//trim(pcoeff_filename)
|
|
||||||
!write(*,*) 'trained - writing coefficients to: ',pcoeff_filename
|
!write(*,*) 'trained - writing coefficients to: ',pcoeff_filename
|
||||||
open(17,file=pcoeff_filename,status='new')
|
open(17,file=pcoeff_filename,status='new')
|
||||||
write(17,'(i4,2f10.2,3i5,5e25.16)') navg,sqrt(chisqr),rmsdiff,NFREQLOW,NFREQHIGH,nterms,a
|
write(17,'(i4,2f10.2,3i5,5e25.16)') navg,sqrt(chisqr),rmsdiff,NFREQLOW,NFREQHIGH,nterms,a
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
program msk144sim
|
program msk144sim
|
||||||
|
|
||||||
use wavhdr
|
use wavhdr
|
||||||
parameter (NMAX=15*12000)
|
parameter (NMAX=30*12000)
|
||||||
real pings(0:NMAX-1)
|
real pings(0:NMAX-1)
|
||||||
real waveform(0:NMAX-1)
|
real waveform(0:NMAX-1)
|
||||||
character arg*8,msg*37,msgsent*37,fname*40
|
character arg*8,msg*37,msgsent*37,fname*40
|
||||||
|
@ -12,25 +12,28 @@ program msk144sim
|
||||||
integer itone(144) !Message bits
|
integer itone(144) !Message bits
|
||||||
|
|
||||||
nargs=iargc()
|
nargs=iargc()
|
||||||
if(nargs.ne.5) then
|
if(nargs.ne.6) then
|
||||||
print*,'Usage: msk144sim message freq width snr nfiles'
|
print*,'Usage: msk144sim message TRp freq width snr nfiles'
|
||||||
print*,'Example: msk144sim "K1ABC W9XYZ EN37" 1500 0.12 2 1'
|
print*,'Example: msk144sim "K1ABC W9XYZ EN37" 15 1500 0.12 2 1'
|
||||||
print*,' msk144sim "K1ABC W9XYZ EN37" 1500 2.5 15 1'
|
print*,' msk144sim "K1ABC W9XYZ EN37" 30 1500 2.5 15 1'
|
||||||
go to 999
|
go to 999
|
||||||
endif
|
endif
|
||||||
call getarg(1,msg)
|
call getarg(1,msg)
|
||||||
call getarg(2,arg)
|
call getarg(2,arg)
|
||||||
read(arg,*) freq
|
read(arg,*) nTRperiod
|
||||||
call getarg(3,arg)
|
call getarg(3,arg)
|
||||||
read(arg,*) width
|
read(arg,*) freq
|
||||||
call getarg(4,arg)
|
call getarg(4,arg)
|
||||||
read(arg,*) snrdb
|
read(arg,*) width
|
||||||
call getarg(5,arg)
|
call getarg(5,arg)
|
||||||
|
read(arg,*) snrdb
|
||||||
|
call getarg(6,arg)
|
||||||
read(arg,*) nfiles
|
read(arg,*) nfiles
|
||||||
|
|
||||||
!sig is the peak amplitude of the ping.
|
!sig is the peak amplitude of the ping.
|
||||||
sig=sqrt(2.0)*10.0**(0.05*snrdb)
|
sig=sqrt(2.0)*10.0**(0.05*snrdb)
|
||||||
h=default_header(12000,NMAX)
|
npts=nTRperiod*12000
|
||||||
|
h=default_header(12000,npts)
|
||||||
i1=len(trim(msg))-5
|
i1=len(trim(msg))-5
|
||||||
ichk=0
|
ichk=0
|
||||||
itype=1
|
itype=1
|
||||||
|
@ -55,7 +58,7 @@ program msk144sim
|
||||||
dphi1=twopi*(freq+0.25d0*baud)/12000.d0
|
dphi1=twopi*(freq+0.25d0*baud)/12000.d0
|
||||||
phi=0.0
|
phi=0.0
|
||||||
k=0
|
k=0
|
||||||
nreps=NMAX/(nsym*nsps)
|
nreps=npts/(nsym*nsps)
|
||||||
|
|
||||||
do jrep=1,nreps
|
do jrep=1,nreps
|
||||||
do i=1,nsym
|
do i=1,nsym
|
||||||
|
@ -77,7 +80,7 @@ program msk144sim
|
||||||
go to 999
|
go to 999
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call makepings(pings,NMAX,width,sig)
|
call makepings(pings,nTRperiod,npts,width,sig)
|
||||||
|
|
||||||
! call sgran()
|
! call sgran()
|
||||||
do ifile=1,nfiles !Loop over requested number of files
|
do ifile=1,nfiles !Loop over requested number of files
|
||||||
|
@ -88,13 +91,14 @@ program msk144sim
|
||||||
wave=0.0
|
wave=0.0
|
||||||
iwave=0
|
iwave=0
|
||||||
fac=sqrt(6000.0/2500.0)
|
fac=sqrt(6000.0/2500.0)
|
||||||
do i=0,NMAX-1
|
do i=0,npts-1
|
||||||
xx=gran()
|
xx=gran()
|
||||||
wave(i)=pings(i)*waveform(i) + fac*xx
|
wave(i)=pings(i)*waveform(i) + fac*xx
|
||||||
iwave(i)=30.0*wave(i)
|
iwave(i)=30.0*wave(i)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
write(10) h,iwave !Save the .wav file
|
write(10) h,iwave(0:npts-1) !Save the .wav file
|
||||||
|
endfile(10)
|
||||||
close(10)
|
close(10)
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
|