This should put official version to state of Alpha 2.6.0(119)

root/CHANGELOG is not up to date
src/changelog.html needs editing

I guess it is not so easy as it looks,
perhaps you have to do something else than those two files check.

Squashed commit of the following:

commit 4be7793b893b0ffbd68925ddd280cd4982644ae1
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Oct 4 10:38:36 2023 +0300

    Version_2.6.0(119)

commit 5b57f61a9fdaf5fc9ebd9e0ff417a6a89a6e14d0
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 3 19:39:04 2023 +0300

    eQSL download: Fix stuck up caused by download file change

commit 7cccea752ae5bd15d9857ef78f31c786f8dd7c10
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 22 10:43:43 2023 +0300

    Contest: Inform remote mode 'on' when saving manual entered qso

commit 91aadb4891926ee3163cfde348980f54c7b44f75
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 19 09:58:28 2023 +0300

    Makefile: Clean fix (by Bill, WK2X)

commit 52305ef62a2bfcda79d7855376b03da3013e9d82
Merge: 590cf60 c2b376a
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 19 09:51:29 2023 +0300

    Merge branch 'Efpophis-wk2x_devel' into loc_testing

commit c2b376a37cf26e3253917ac803552d9440f4cf9b
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 18 20:34:29 2023 +0300

    Contest filter: If Contest window is open contest name is copied to filter

commit 590cf60cbf3d332cd6a4ad74c3c618d45f8841f1
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 18 20:34:29 2023 +0300

    Contest filter: If Contest window is open contest name is copied to filter

commit 44a8d093624adb1ede03558c1cf5864f08005b1b
Author: WK2X <efpophis@efpophis.net>
Date:   Mon Sep 18 11:25:25 2023 -0400

    added clean of /tmp files to make clean target

commit f59555dcba28d17302ef721ffe3286b3d4794bf2
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 1 18:43:14 2023 +0300

    Version 2.6.0(118)

commit 4cfe56ec65444339e0c296a4045d331a47eff2ef
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 1 18:16:41 2023 +0300

    CW Messages: Fix to open/close when Contest window open and S&P not checked

commit e2d5fc35c33ef8337e2472dad0b7718afa3bba73
Merge: 7fbfa34 cb90c59
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 1 12:21:01 2023 +0300

    Add second set of CW messages used in Contest Run mode

commit cb90c592b1f427e44f236b4e7f58d437377f4869
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 1 12:18:24 2023 +0300

    CW memory set swithing and Help file fixes

commit c11d42f2e6338ac4d07b624d09fc8400643b0271
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 30 18:30:00 2023 +0300

    CW memories: Run and S&P tabs

commit 7fbfa342fe7b1bdc99d3aa89f9c187464738357a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Aug 28 19:13:18 2023 +0300

    RigControl: Update Hamlib error codes list

commit 7c207856af9c1f0a9d4b95b76fe791b0410f66c1
Merge: 3be59da 8830789
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 24 16:20:45 2023 +0300

    Merge branch 'kwirk-n1mm_udp_log_alpha' into loc_testing

commit 8830789d2bcb3b640c985a9c30a8559ae05fb204
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 24 16:19:57 2023 +0300

    Version date

commit e14d9beb0b75793d1fc31025917f00614663b4cb
Merge: 0a9b58f 3be59da
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 24 15:54:38 2023 +0300

    Merge branch 'loc_testing' into n1mm_udp_log_alpha

commit 0a9b58f94ad92c5f0c48718adebaa342b84a26fa
Author: Steven Hiscocks <steven@hiscocks.me.uk>
Date:   Wed Aug 23 19:00:11 2023 +0100

    Move CHANGELOG message for UDP Log Upload

commit 60bbc8c801ce7b21493aa7d6dc1614c4eb7ed647
Author: Steven Hiscocks <steven@hiscocks.me.uk>
Date:   Wed Aug 23 18:56:38 2023 +0100

    Add exchange strings to UDP Log Upload messages

commit d60d4e6c6549e6fc09f73bad4ea0d5dba22ce89a
Author: Steven Hiscocks <steven@hiscocks.me.uk>
Date:   Wed Aug 23 18:49:43 2023 +0100

    Fix toggling enabled status of UDP Log fields in preferences

commit 3be59daa96e84aa8ee41aca4e52c66ba4e26498c
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 23 11:47:36 2023 +0300

    Preferences:CWinterface: Layout fixes. Hammlib:CW and Voice keying: Changes for latest Hamlib w34/2023

commit cb8a4810c84ae78f76430cfbd95598ba445e1766
Author: Steven Hiscocks <steven@hiscocks.me.uk>
Date:   Fri Aug 18 15:25:08 2023 +0100

    Add UDP Log Uploader, based on N1MM+ XML format

    This enables sending of contactinfo and contactdelete N1MM+ XML
    messages, via UDP, similar to N1MM+ and other loggers.

    In order to implement the delete properly, the forign key constraint on
    the log_changes table has been removed, such that the contact ID can
    still be generated.

    The contact ID is currently based on the cqrlog_main table primary key,
    and logbook callsign.

commit cbf0cd927ac1438098f03aeb8b58641581a46555
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 9 20:15:14 2023 +0300

    DBConnection:Utils:Configuration:Export: Force file extension to be '.ini' as Configuration:Import lists only '.ini' files

commit 4caa8e0b3f04429f415345d94cf4a30045cd07a9
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 3 11:02:52 2023 +0300

    NewQSO: Details has new Tab 'Call statistic' After call entered shows wkd/L/E status on band grid

commit c5987c9f3ff75be99f4adbecda3566b96ceb42ef
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 2 12:22:59 2023 +0300

    RigControl: rigctld parameter '-C auto_power=1' is added only if user checks 'Rig pwr ON cmd'

commit 3fb18ca470b4d81a7ce6697c85a25eab381448ed
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 1 12:52:02 2023 +0300

    NewQSO: Details Tab selected remembered even when satellite mode enabled

commit 391eff25a3643c8311d7ec2dfa60396313360f70
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 1 12:02:29 2023 +0300

    RigControl: Fix to set_powerstat at init

commit 20effefd8c83ad94c1af47d11ec3dfa536cf64ef
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jul 25 11:13:20 2023 +0300

    Fixed date format checking routine. Group edit: QSL sent and received date can be cleared

commit cc68255fbe9a1618b289e382ba097c3bf568690f
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jul 25 09:50:52 2023 +0300

    HRDUpload: Fix to error codes

commit f9abd782974c7b20a3c70f44ee7ef4aa416f1faa
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 24 15:30:44 2023 +0300

    NewQSO+Contest: Use rigctld:\send_voice_mem instead of voice_keyer script if rig supports it

commit 22fbecfd52514381e6c73e3bf7db7688d38902d1
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 24 12:20:34 2023 +0300

    eQSL Import: Checkbox to change Rcvd date to current date -1 after successfull download

commit d2a45b2698fb853f55a3848ae5d19d2bff99881e
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 24 11:06:34 2023 +0300

    Added HamQTH & Clublog error hanling code by phl0

commit c8d7b7d057c837314c9b5f34d44ac769654fb68b
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 24 10:45:48 2023 +0300

    Group edit warning color change

commit 77fbc59c5c4404943b0844a7bd57092f5fe88ad8
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 22 10:02:07 2023 +0300

    Fixed preferences/CW keyer layout

commit 440be2b6d72fd212662537a9cb84e27d754690db
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 22 09:52:19 2023 +0300

    Fixes to Cabrillo export and Hamlib Cw

commit 3dad436beb0392b026eddd4f4a9a41ed4cb2a774
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 17 13:23:26 2023 +0300

    Version 2.6.0(117)

commit 4245858014e6fe93caea1be2982a3b027c454850
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 17 10:28:33 2023 +0300

    Preferences:TRXControl: Added checkbox 'compound poll'

commit d426360601839ebd347550dfcfb7e5eb0992ce51
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 15 16:03:28 2023 +0300

    HamlibCW: Fixed StopSending procedure. Has now '+\stop_morse currVFO' that should work rig also others than ts480 and icoms and is implemented in rigctld at least from Jan2023

commit aaa6a0c8da193d841fb5d3465062503d7fb9c703
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 15 15:00:51 2023 +0300

    Help+Preferences: Fixed callbook section

commit 5d019941e27a01036b42db6089d23bf73609e0c4
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 15 12:04:08 2023 +0300

    Callbook: CQRZCQ XML fixd and tested. Should be mostly ok now.

commit 418b4a40c1582a1f05acb830ed692160738212af
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 14 19:47:13 2023 +0300

    Callbook: Added support to QRZCQ, not tested at all yet because of lack of premium account needed for use

commit 8a94dff797c3665ee53586c913e0925d0edc975a
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jul 13 08:53:21 2023 +0300

    Preferences:TRXControl:#1 Dummy rig: Starting rigctld can be changed (was disabled)

commit ba40ed61f98024f6795a99644f568ba4a5b978b3
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jul 12 12:03:42 2023 +0300

    Added checkbox to use Hamlib (past Jul-2023) 1k CW buffer.(Sends memory as string despite length)

commit 63eaff5fda52eb269bef15da85990cef34bf768b
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 10 10:18:58 2023 +0300

    QsoList:Fix:Return cursor to last worked qso when saving edited Qso should not happen

commit 056f90e79fc4ffa99fbfaf8ba34091dd3aa6852f
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 8 12:20:34 2023 +0300

    CWkeying:Hamlib: Quick fix for sending because new Hamlib is not backward compatible

commit 95d6dd663d49b2bb45c16a55ce467472d773c41f
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 8 10:11:03 2023 +0300

    Grayline+CWkeying:Fix: Some debug print fixes

commit 171da428792a07012e308da9873ef18c5a589c3f
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 7 13:28:52 2023 +0300

    NewQso+QsoList:Statistics:Big squares+County:Add: Filter(F12) is now effective if used

commit a71bb23155b76c35ebfe45134060367f27ef408f
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jul 6 16:33:46 2023 +0300

    NewQso+QsoList:Statistics:Big squares+County:Fix: Totals printing

commit 2378ebfacff7d9eca455d7fef646179c7220565f
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jul 6 14:09:21 2023 +0300

    NewQso+QsoList:Statistics:Big squares+County: Added 'ALL band'. Fixed layouts

commit 4e854803f89f9c285f9f0815127cc01e8eb3c0f3
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jul 5 08:59:10 2023 +0300

    Fixed broken Group edit

commit baee131efaa39d1b372b63e3e063b74ea5566bcc
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jul 4 20:20:23 2023 +0300

    Small fix to previous

commit 41fe2677da80053f09e4b8aea1f3428f04045a2a
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jul 4 20:15:55 2023 +0300

    NewQso/QsoList:Statistics: Added County statistic. Fixed Help. Grayline: Removed some unconditional debug prints

commit 21ba5e04f286c9b2a26067540fae7df89afa6082
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 3 14:54:51 2023 +0300

    Wsjtx:Map:fix: dB view at Map init now read

commit 48c2aea6e34a73aa2d437bd08bad436709b881c2
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 1 19:50:28 2023 +0300

    NewQSO:Contest:Fix: Fixed keep propagation also when contest window used

commit bcc1aaaa782b50b2ce7bb8caf36665dc2ae6aca8
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 1 10:58:14 2023 +0300

    NewQSO:Fix:Keep propagation mode when 2xESC even when no qsos saved yet

commit 65fff0ff48e93a129368de58cccfe1b40c2fc4bd
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jun 25 17:12:49 2023 +0300

    Update README.md

commit 18cefceb6f799bd5bfbd664cbeb84c829c9ce80c
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jun 22 16:38:58 2023 +0300

    Grayline,add:Beam path if rotor used. RotControl,fix:Remeber user rotor (1|2). Preferences,NewQSO,Add: Operator (if not station call)

commit dd42639d7689315bf5585a5bee2546bcf9eea77f
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 12 13:05:39 2023 +0300

    WSJTremote, Map mode: '*' appear fixed when line ends ' 73'

commit db2efad470c230234637514f5ec1d6133a24eaef
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jun 3 15:37:01 2023 +0300

    Preferences/TRXControl added checkbox 'Set UTC to Rig'; Help fixed

commit 83808f1c1b3957abea0dd0acf74f57213b5454bd
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jun 2 11:14:42 2023 +0300

    WSJTX,Map: fixed * false appearing from locator ending 73

commit adb548fdc7653621b7b57d174c2549d611b86bac
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jun 1 20:04:04 2023 +0300

    Small changes to contest window

commit 0216261824bd4f088825599b6c252dad6300a394
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 23 19:34:12 2023 +0300

    Fix 8M&5M frequency add when 1st start of Cqrlog

commit 8bd5367862053a1effc7202a5c3cae3a48523f7e
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 23 10:54:18 2023 +0300

    Contest: Pressing'CQ start' moves focus to Call column

commit 7b9662087f64d6202ceacdf141d71b761a27c636
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 23 10:08:27 2023 +0300

    Added hint texts to first start DB selection window

commit 79195c1f49e5fc3d34986658ba4904290c5a664d
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon May 15 19:43:00 2023 +0300

    Cabrillo export: Changed to use 'time_off' instead of 'time_on'. Now equals with other program's exports.

commit 7d8bb1f079a2bfe896b268c2e2080e69ee26a0d2
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat May 13 09:19:45 2023 +0300

    Version 2.6.0(116)

commit 005b59fc5c165abac5aeba486e22c88de1ae7079
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat May 13 09:13:56 2023 +0300

    Version 2.6.0(116)

commit 17f9e62be8b2f90548cf03789532649d11822a87
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon May 8 09:34:04 2023 +0300

    Preferences/wsjtx fixed hidden checkbox

commit dc9ee89b6e76036641b525a0351cd3dff6e3d2c5
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat May 6 10:51:31 2023 +0300

    DXCluster: Added user defined F1-F10 command keys

commit 40e8f96bde62f1f5c960e017565afcc6b1095ae3
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 2 21:19:57 2023 +0300

    Fixed typos in changelog

commit 5bf66730ca7d67476343d040e1f56c798113dd43
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 2 21:11:17 2023 +0300

    Fixed WSJT-X contest logging

commit 47adc81ea74d5e07c738a5e32e965a7bb6788562
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Apr 24 20:49:57 2023 +0300

    Contest: counter HH:MM since last logged qso, QSO rate /10min and /1hour(these need testing)

commit f0318ef8c8d0d9d34e2c2b34b48b8812861a069b
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Apr 23 11:27:30 2023 +0300

    Contest: Shift+ESC removes callsign (same as 3xESC)

commit 6b674edf65f5f3cd61439077b979d5278588e014
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Apr 23 11:11:23 2023 +0300

    Update README.md

commit cbba15916e8fdd6ac89078127d156d2f17197530
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Apr 20 11:40:37 2023 +0300

    LoTW inport: changed date to be (today-1day) to be sure

commit 395a80f9fb4cf58f699774fc4e1a60c9cf84c07e
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Apr 19 11:35:54 2023 +0300

    LoTW Import: Checkbox to change Rcvd date to current date after successfull download (tu: 4X6GP)

commit ce8ac269dc208b389e25c5095a538fa71e5d2fd4
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Apr 16 20:02:38 2023 +0300

    When creating a new log it is now possible to copy configuration automated from existing log

commit e7eaeda588d10e2ba9085f00e92aa2ff7c73fa9b
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Apr 13 21:44:28 2023 +0300

    Fixed Show hint on lastCQFreq

commit cded891105bc346033624b90681712ea74a00238
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Apr 13 19:21:07 2023 +0300

    Version 2.6.0(115)

commit c3a832cf39df122e46d3e5cc88fe7e34a3708cda
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Apr 13 19:19:08 2023 +0300

    Version 2.6.0(115)

commit b463793a8c0c6a6f571899a5fb6f1305af73b7de
Author: Saku <oh1kh.sral.fi>
Date:   Tue Apr 11 09:21:23 2023 +0300

    fixed newupdate script (help install)

commit b04dc84caeb196e1b13aae814d8df800bc61676b
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Apr 8 10:03:52 2023 +0300

    Moved also propagation text Url to user editable in preferences

commit d6797895e5f0034b99f24e5836b2a175d3a647ef
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Apr 7 10:24:16 2023 +0300

    Fixed solar data (propagation window) addresses 'http' to 'https'

commit 2c99f6f39c3881243e23080a0182882d4850b851
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Apr 6 20:55:14 2023 +0300

    Contest: Store/restore last used CQ frequency

commit c20a1503786f5e0422571dfb747c604ef0ef28c4
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Apr 1 19:23:52 2023 +0300

    Added checbox 'DATA' to 'show only spots' at /preferences/DXCluster. Help files fixed

commit faa2d359824a01a125839b1eafd17a5f7f908167
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Apr 1 14:14:46 2023 +0300

    DXCluster: fixed response missing for 'sh/he e6' (all prefixes E1..E9)

commit f274c7d677510eb5cfa4e23924017cd15308201d
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Mar 28 09:42:08 2023 +0300

    README Note about database

commit 264021f1d49205685bb6f8083328354f3b3e36f6
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Mar 26 15:12:50 2023 +0300

    Small view fix in RBN monitor header

commit 0c042682f59a86d3dc1b27492d70f9a9e4eacb98
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Mar 24 16:45:12 2023 +0200

    Small view fix for adif errorfile import

commit fd20da58d176c8cb5ff90ef33c1303ca5a4dc4c6
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Mar 23 20:06:25 2023 +0200

    Version 2.6.0(114)

commit 747cefacf7b0d57d0f5596cac3144eff48e584e6
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Mar 23 12:14:47 2023 +0200

    fixed band constants

commit c33a9ca857131aa4053bb4e240a6e697be82d89d
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Mar 21 20:10:14 2023 +0200

    Added 8M and 5M bands. This needs still testing!

commit c6920775a4f1180a160ea27ddeac0b281a652cfb
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Mar 21 10:32:59 2023 +0200

    Fixed radio memory save/load. Added radio memory search. Fixed several SQL record count fetchs. Help fixed

commit cdf591c031224071964ca9cbb26976b08e8acc0f
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Mar 10 13:58:41 2023 +0200

    Fixed all file open dialogs: file exists check. QT5 dilaog allows user typed filenames and check is needed. Several crashes if file does not exist

commit 395b3ccf1363b2e80d352a705f9b45a9316bbce9
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Mar 2 10:18:13 2023 +0200

    Fixed DXCluster spot: Any of QSL,LoTW,eQSL received prints with confirmed color

commit 5fdeeedede0be9756510b46bbb71c5628425380c
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Mar 1 19:02:39 2023 +0200

    Fixed DXCluster font style saving/loading

commit f86c3f9eead11764f3d421d47625004dbc72e3b4
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Mar 1 16:57:31 2023 +0200

    Version 2.6.0(113)

commit b399ad840a5c867a948410fc72263d3c89019d65
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 28 18:38:03 2023 +0200

    Fixed wsjtx std messages clean when remote was set active

commit e6781b1e35e067dbd2c140e09dc2cb272149cdde
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Feb 27 10:32:08 2023 +0200

    Added lotw/eqsl to show in Cq-monitor

commit 5775bd23abb85f220382f90fab630bcf856bc687
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 21 15:56:49 2023 +0200

    Version 2.6.0(112)

commit 41731b7f3579582f913087af50b46fb59a9c5b5e
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 21 12:56:02 2023 +0200

    More fixes to DXCluster

commit 2bc40ddbd7a3c1f91fe98327d90f53508852cecd
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Feb 20 20:27:01 2023 +0200

    Rewritten DXCluster spot splitter because of faulty call grep

commit e016cdaf8654d565b73c4c08eb9e0095bfaea6f8
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Feb 20 13:16:00 2023 +0200

    wsjtx-remote: wsjtx clean when band changes. Call info lookup during RX period

commit 821db308c061c642fdb73cc40e815384570e6412
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Feb 20 12:42:20 2023 +0200

    wsjtx-remote: wsjtx clean when band changes. Call info lookup during RX period

commit 851fa98d2c6410dd10b06299ea27bcfac893c502
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 14 09:59:24 2023 +0200

    fixes to contest

commit d89cee2cf9ed6ebb893313305b11210f917d7fd8
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 14 09:43:59 2023 +0200

    fixes to contest

commit 8af9269115c3e0dbc1bbd205a4fc0789a0a761e8
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Feb 12 09:02:39 2023 +0200

    Fixed warning splash and help that you can not spot with WebCLuster

commit 1c949173f5e660fb8353995414d44a3f4309a16e
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Feb 11 11:13:18 2023 +0200

    Added missing 'OR' to QSO list/Qsl selection

commit d2b4b61741f17a97cd1160af24084beb29057287
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Feb 8 08:59:18 2023 +0200

    Fixed update QSO list view when Preferences/Visible columns change

commit d4d7e4142754f606e266fe73c8a3c3c4fc54024b
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Feb 8 08:38:03 2023 +0200

    Fixed bug in Qsolist/View/Show Details checbox visibility

commit 4c13c8349689ad6db47b9132ecb1814d83e32748
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 7 10:26:05 2023 +0200

    Version 2.6.0(111)

commit ae08bee389af4c7d105114645db60656720fb7da
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Feb 7 09:59:56 2023 +0200

    Version 2.6.0(111)

commit 85a97a0d4be40bf9f6000840898d1e7c42c2b0e8
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Feb 1 17:44:04 2023 +0200

    Added End-key to work in contest/all column

commit 4ce159d1378fbd81f37ec841fdf7bf1c2fc6d013
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Feb 1 10:35:29 2023 +0200

    Added numeric divide key to work in contest/all column

commit 1af6eb6db0f66012758941b3d367e12a354dc3f1
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 30 19:39:22 2023 +0200

    Added Home-key to work in contest/call column

commit ff21fc287571c6679c7ddfbb97f2c66deb7a8216
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 30 12:35:19 2023 +0200

    Change CQMonitor/Mapmode worked locator coloring

commit 44dc033c41b7bd5c04a2acfbf2772c2e25814d8a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 30 11:12:58 2023 +0200

    Removed one debug print

commit 092eac329affce05663cab70c44f472d12cd3062
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jan 27 11:46:39 2023 +0200

    upd README

commit 50558217f06cdf1bc93ec260bac0da0c1937d7c2
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jan 27 11:43:10 2023 +0200

    Update newupdate

commit 630c2bbdc4a0b73b01712fb2bf2e707f53df52fe
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jan 27 11:41:45 2023 +0200

    Update newupdate

commit 88881682c5391b8233bd5249eac277507dff79ed
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jan 27 11:33:49 2023 +0200

    Version 2.6.0(109)

commit 63949f95db52e7f74309d7d7bb7486b774c77a69
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 26 12:51:53 2023 +0200

    Fixed GTK2 numkeypad in contest window

commit eb523a5fe54510e1d26a6844c7e8aec871de015e
Merge: 4bafbbf 35e0fa6
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 26 08:53:36 2023 +0200

    Merge branch 'fix_RBNmonitor_filter' into loc_testing

commit 35e0fa64bf
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 26 08:37:41 2023 +0200

    Fix rbnmonitor filter

        	Sometimes, some bands, it happens (here up in north Latitudes)
        	that source filtering EU is too wide area. What middle and south
        	EU can hear is not heard here.

        	- That's why added source callsign filter criteria.

        	You can define skimmers by countries using prefix, by callsign
        	area using prefix and number or by specific skimmer callsign
        	to get more narrower view what can be heard.

        	- Fixed filter criteria window object anchoring
        	- Fixed help (image)

commit 4bafbbf1843333fc2a6bb02cd464ebaa2fe8e4a6
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jan 25 08:39:55 2023 +0200

    upd newupdate.zip

commit 21b0179828e13939c581d4d45324f31fbb3cb206
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jan 24 09:26:20 2023 +0200

    Changelog fix

commit 5f79b580d6a34f81fe01ed5b087b7feaa314df01
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jan 24 09:14:09 2023 +0200

    Changelog fix

commit 71d2dae2ad834188ff6a8a078dc197dd77e29e43
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 22 11:48:37 2023 +0200

    Version 2.6.0(109)

commit 8d398825ce3b61ec39c21e077df72743afac9992
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 22 11:35:55 2023 +0200

    Remove trigger fix and add warnrngs for use with more than on online log

commit dc80447356739eaec29aaf22b41c610b41c8fe4d
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 22 10:00:28 2023 +0200

    fixed some toolbar icons

commit 9ff407992dd8f64fcf00f8b93e27ee735671ab33
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jan 21 16:27:48 2023 +0200

    Version 2.6.0(108)

commit 2f50100a202b845695f69c1ffe58592d4d092b02
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jan 21 15:57:41 2023 +0200

    Small change to 'remove all upload triggers'

commit 992e1e9bd803733d8d20bd96836484ff4f5d8893
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 19 12:04:58 2023 +0200

    Changelog edit

commit 23d6035c4bfda964e127c0c31fcdb29d4e3c605a
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 19 11:25:48 2023 +0200

    Fix rig pwr on at start with rig model #2

commit 4488a424aa5efa9f7b159688f9e0dbd487dd66b2
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 16 10:34:36 2023 +0200

    Upd changelog

commit 5e415abc02ed70af8ee5bdec97eff4ae43778d5d
Merge: 203c07d b259c16
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 16 10:32:39 2023 +0200

    Merge branch 'fix_cabrillo_rst' into loc_testing

commit b259c16d56
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 16 10:29:06 2023 +0200

    Fix cabrillo_rst

    	Because of weird format of NrauBaltic log example setting of RST
    	fields needed to be changed to adjustable ones.

commit 203c07dd47ae3d032e92382e2f9553c46836597e
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jan 12 21:24:09 2023 +0200

    Fixed TAB key function in Contest window

commit b40bd811416f5f5ae9267186aba275f1c08601e6
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jan 11 20:50:30 2023 +0200

    Added contest status/msg multipliers count+list by contest bands

commit 015f67a69a1f3fd23902a85c965896fcf8a9e75f
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jan 10 11:00:47 2023 +0200

    Version 2.6.0(107)

commit 2de1c9b8a30d991f56ec834aeb528401a6ceb4e5
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 9 11:22:17 2023 +0200

    changelog typo upd

commit 7987e162eb56056462025b467151defffca0580b
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 9 11:18:01 2023 +0200

    Version date and changelog upd

commit a19f650609c48a76c0e8cb682e5dd9479cad078b
Merge: d7949db d6bf88a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 9 11:13:33 2023 +0200

    Merge branch 'fix_rictld_connect' into loc_testing

commit d6bf88aa8110d935fd08950143541535f7ea3e03
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 9 10:59:52 2023 +0200

    Speeding up preferences save by setting cache on during preferences close. Speed increase over %50

commit d7949db3135d408919074b6451728bcefb23c2b1
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 9 09:12:09 2023 +0200

    removed 'secure' from 'clublog' url

commit 530ab975b5782b5767590401dfd7e02f89a6df47
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 8 12:54:40 2023 +0200

    changelog upd

commit 5a74bc6a44487dea2b9dc5e28628211f454afc8f
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 8 12:52:59 2023 +0200

    version date upd

commit 7a001216d72bac3f4dd4f80d275bd475b8c9a3b6
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Jan 8 12:50:45 2023 +0200

    merge fix_rictld_connect

commit 1d3234bb53bbf9f9c5e323199b2a05c55e16a671
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jan 7 17:19:50 2023 +0200

    accepted just RPRT receied for misc commands (like user defined strings)

commit 3315dda5db5d3e14ebcc230433494df88a7043ea
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jan 7 12:49:44 2023 +0200

    Fixing rig communication appeared to be harder than expected

commit 07eb91299475963433dc7e55b9b29c49712bd71c
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jan 4 13:34:24 2023 +0200

    added powerON prperty

commit b0e902695f570e197de4a28c7604be3fda391f60
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jan 4 13:32:03 2023 +0200

    Added retry counter for rigtcld connecting

commit a6cc955bd6e7d7ddb73599e1b15db6383ce2abd2
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jan 4 13:02:56 2023 +0200

    Fix for rigctld communication

    	Rigctld has a "property", at least with Icom ic7300, that if
    	Rig is powered OFF when rigctld is started it takes around
    	7 seconds before rigctld opens it's telnet server for connect requests.

    	If rig is powered rigtcld responses immediately.

    	This waiting time was not taken account in uRigControl.pas
    	Added a reconnect loop of 10 times with one second waiting periods.

    	Now Cqrlog can catch rigctld's telnet server and connect to it
    	despite rig is powered or not.

commit ed45bc23f8551a62483f89ae4478d5bcee9898c9
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 2 18:09:23 2023 +0200

    Updated sat_names.tab

commit 72f00c7a5b118ba9e7527aa4323f7de9ec5057a1
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 2 14:28:46 2023 +0200

    Made online log Urls defineable+Fix1

commit 855aee7d3b90d65d9ecb57309eaf6563a9b2e662
Merge: 5bef518 68de955
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 2 14:22:05 2023 +0200

    Made online log Urls defineable

commit 68de955383
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jan 2 14:08:14 2023 +0200

    Fix for Online Logs Url

    	Problem arised with hadcoded Online logs Url address change.
    	Made Urls changeable via preferences/online log upload.

commit 5bef5181c52d907055563d436fa9b206aa16aac0
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 31 13:38:36 2022 +0200

    update of changelog

commit 735c3e1b25ffba8ceb524387040b382601767847
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 31 13:37:13 2022 +0200

    update of changelog

commit ac2c9854b729b36680f202a632b30bc88990e70f
Merge: 8d7eb9d 0124044
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 31 13:13:56 2022 +0200

    Merge branch 'fix_dxcc_edit_save' into loc_testing

commit 0124044a45
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 31 13:05:43 2022 +0200

    Fix for DXCC Ref edit/save

    	Once again user request appeared to modify and save DXCC ref.
    	Decided to look at it.

    	To my surprise I found that saving user edited DXCC Ref value
    	was nearly done!
    	There was just one line missing and it made me think it could be
    	just a bug from earlier times.
    	When DXCRef was selected from list opened from btnDXCCref it was set
    	to NewQSO, but variable adif's value was forgotten to set.
    	That's why selected new DXXCRef was never saved.

    	During testing I found out that edtDXCCRef.ReadOnly that was set
    	in fNewQSO.lfm was reseted mysteriosly.
    	Reason was ClearAll procedure that set all readonly values to
    	false forgetting to set edtDXCCRef back to true.

    	Readonly prevents "user defined" DXCCs to be entered. All must come
    	from the DXCC list (that, I think, is a good thing).

    	That lead to removing of line that should have been set ChangeDXCC
    	boolean true if old and new calls were same but old ann new adifs
    	were different.
    	That is not needed now when typing is disabled, and on the other hand
    	it never worked as EDITQSO did not set proper adif and old_adif
    	values at start.
    	Including that manually entered prefix was never checked to set
    	corresponding adif integer.

    	Yet one bug more was found when EDITQSO was saved. Then there were
    	not ClearAll procedure called leaving some edited qso data to NewQSO
    	columns.
    	ClearAll was refused to run "normal" way when callsign column was
    	cleared and EDITQSO true.
    	That is because during EDITQSO it can be cleared by user and so would
    	clear all data during edit.
    	If EDITQSO is true ClearAll must be called separately at btnSaveClick
    	procedure.

commit 8d7eb9d187f7d466cb8c1dcfe9f758aaa388f30e
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Dec 30 14:10:35 2022 +0200

    Fixed unwated chars filtering in contest/call input that caused sql error

commit a9cc8581b2203e3470f079ee05c95b15a3a0ca47
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Dec 13 20:56:56 2022 +0200

    Update of changelog

commit 8c7ac81765c744f330fa2dea2ab284da9b3b8a16
Merge: e8bbed7 7147efd
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Dec 13 20:49:00 2022 +0200

    Merge branch 'fix4rigs' into loc_testing

commit e8bbed706f659f40b37bc5dfa85643e5590a0447
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Dec 13 20:43:56 2022 +0200

    fixed contest help

commit 7147efd327
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Dec 12 20:25:01 2022 +0200

    Fixed bug in Fix ( in start initialize)

commit 23be28db32
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 10 08:13:41 2022 +0200

    Defaults for trx and rot port+poll

commit 848cdc1953ac97f876e55cdba2dda779534460f6
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 10 08:07:24 2022 +0200

     default values check

commit 1e8f11674d554f32428b8d457fcbd902150887fa
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Dec 9 14:54:36 2022 +0200

    Update newupdate.zip

commit 8aa56d20a3dd2a9495fac917013880e173116b3e
Merge: 12fa618 22b8674
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Dec 9 14:24:51 2022 +0200

    Merge branch 'fix4rigs' into loc_testing

commit 22b86742b3
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Dec 9 14:05:52 2022 +0200

    Fixed some config parameters reading.

    	cqrini.ReadInteger and  cqrini.ReadString both can be used for same numeric value reading.
      	Works same way as database ReadAsString or ReadAsInteger; Source is same but resulting read is
      	either String or Integer how programmer wants.
      	cqrini.Write does not make difference in config file if variable is saved as String or Integer
      	both results look same in .cfg file.

commit 12fa61834b1063fdc4dea3825a887e1c3d04c179
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Dec 7 12:46:48 2022 +0200

    Version 2.6.0(105)

commit 9e1b03089b8f840cfdaee6279d527d3a88ec187c
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Dec 7 12:44:02 2022 +0200

    Version 2.6.0(105)

commit 573adb7b69eec6681dc91b852b34440591f97c88
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Dec 7 11:01:42 2022 +0200

    Fixed bug where rig was not initialized at startup if TRXConrol window stayed closed.
    Problem was variable "riginuse" that was undefined at opendatabase called initializerig procedure.

commit b3903c7c06b309fca0801de9cb90892c934b7b06
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Dec 7 12:20:18 2022 +0200

    Set Version date

commit 03e196a032
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Dec 7 11:01:42 2022 +0200

    Fixed bug where rig was not initialized at startup if TRXConrol window stayed closed.
    Problem was variable "riginuse" that was undefined at opendatabase called initializerig procedure.

commit ca4f9dbfc3d18aeca67adaac1195d5f7c2570142
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Dec 6 10:54:34 2022 +0200

    Update README.md

commit b895694769d9ba3ef9181fee90105506a421804d
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Dec 6 10:54:07 2022 +0200

    Update README.md

commit e42007f92baafd5b56cb9a77dfaa9aa7ed3b890b
Merge: f3ebadc 258e90e
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 3 11:07:14 2022 +0200

    Merge branch 'macro_xmr' into loc_testing

commit 258e90e138
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Dec 3 10:45:27 2022 +0200

    Added CW macros

    	Added CW macros:
    	%xnr - contest exchange serial number received
    	%xnrs- contest exchenge serial number received sends 9->N and 0->T
    	%xmr - contest exchange message received

    	Affects to an unimaginable number of places ...

    	Fixed macro usage in SendSpot/Usr message.

commit 4f59d7e6c4
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Nov 28 09:08:38 2022 +0200

    Set Version date

commit f3ebadc63b54b2e6bd454cad4ce403fba1ba2925
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Nov 28 08:59:49 2022 +0200

    Version 2.6.0(104)

commit 24e8b1d89a02bc8d03f9b39808dc4f405015d386
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Nov 26 16:09:47 2022 +0200

    Version 2.6.0(104)

commit 71bc55da77cad483cf2a480d36d57735c81a6c53
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Nov 21 16:22:07 2022 +0200

    Version 2.6.0(104)

commit 727509d17b1fbcb140b60472ba271ad674610c72
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Nov 20 14:19:02 2022 +0200

    prepare version

commit de67495566064e510d25194d851a7b609f5d4ff6
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Nov 18 17:18:17 2022 +0200

    vesion prepare

commit 888f75ff0f986986ae36577875fe98ea8576ff32
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Nov 18 17:13:54 2022 +0200

    fixed layout and tab

commit 5dc59f86d8e47ba0f6230648134acf06cc462dee
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Nov 18 16:46:19 2022 +0200

    version prepare

commit 508131fb2926f1cb8e0701ed9b501a79413ae84d
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Nov 18 16:33:59 2022 +0200

    fixed changelog

commit edb069b95b80575951eacc78f3331302c5ff640d
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Nov 18 16:31:11 2022 +0200

    fixed contest window

commit 04cc3e378d568d1e22e1fba60c370603830e8557
Merge: 22411ec 33df9b8
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Nov 12 14:15:57 2022 +0200

    Merge branch 'changelog_move' into loc_testing

commit 33df9b8cf4
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Nov 12 12:50:07 2022 +0200

    Help fix

    	Added changelog.html to top of help's left frame. Then it can be easily
    	opened again also after first start where it appears automated.

    	Fixed index-right.html "dependencies" to talk about MariaDB instead
    	of MySQL

commit 22411ec3fe1682a3f5fc05564621051e41d73c5b
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Nov 12 12:29:34 2022 +0200

    (104) release prepare

commit 36ab747f77e08b0a5a20f2df64715e98ccf52836
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Nov 10 11:10:15 2022 +0200

     fixed changelog

commit 52faff744f60ec2e88b934075c5614cfbe0cc9d2
Merge: 118ca66 2a04c27
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Nov 10 07:13:19 2022 +0200

    Merge branch 'winkey_cmd' into loc_testing

commit 2a04c27459
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Nov 10 06:56:46 2022 +0200

    Added serial CW keyer commanding menu item

            Suddenly noticed that my winkeyer and IC7300 have different
            order of CW paddle plug's pin order.
            It was ok with IC7300, reverse with winkey.
            Fastest way to fix this is to set/reset winkeyer moderegister bit4
            This could not be done with Cqrlog as it sends only text to winkeyer.

            Added menuitem: NewQSO/File/Send hex bytes to keyer (W or K)

            Item is visible with winkeyer or K3NG keyer and allows non text
    	hex bytes to be sent to serial line.
            Tested with Winkeyer.
    	I do not have K3NG to test but assume it possible can be useful
    	also with it in some cases.
    	The serial sending protocol is same with both keyers.

    	Help files fixed.

commit 118ca66fff144658d611ca5810b4f73b80c72f08
Merge: 0782319 76c15c6
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Nov 2 19:34:05 2022 +0200

    Merge branch 'fix_split' into loc_testing

commit 76c15c6065
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Nov 2 19:25:15 2022 +0200

    Fix for quick split settings

    	Fixed all edtboxes value limits to 0..9999
    	Fixed tabulation orders

commit 0782319fae20dd4037ee139cee99dfc9e3cc5d22
Merge: 5f130dd 46d4240
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 25 19:50:42 2022 +0300

    Merge branch 'fix4rigs' into loc_testing

commit 46d4240d82
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 25 19:50:16 2022 +0300

    Fixed TRXControl USR buttons text loading. Fixed CWkeyer: do not reset keyer checbox

commit 5f130dd743b6ef26b7b54cbcdd7d9d2e6b467515
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 24 18:53:06 2022 +0300

    Update README.md

commit ebe2da459e957ed68dc4fc2a16378bd0a7d272c9
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 24 18:43:29 2022 +0300

    Fix fix4rig merge errors #3

commit 050a96e187ff47fc0768cfe6085deba7f92eefda
Merge: 0e2e5a8 e63e8e1
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Oct 21 16:19:54 2022 +0300

    Merge branch 'fix4rigs' into loc_testing

commit e63e8e1109
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Oct 21 16:13:40 2022 +0300

    Fixed 'use Potentiometer CW speed' with Winkeyer (and tested) in NewQSO, Contest, CWtype and CW keys

commit 25a8ec3f39
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Oct 20 14:22:18 2022 +0300

    Fixed winkey poti speed select

commit 0e2e5a80d1293be875dc6926092bd9242c4daf37
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Oct 20 13:44:36 2022 +0300

    merge post fix #2

commit 17135335a0038225fe95b8f993b24a3389ac1113
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Oct 19 20:27:00 2022 +0300

    Some fixes after merge #1

commit 206acac0102867a6ddf6ca7f501b7346665302aa
Merge: 8b79bee 8def318
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Oct 19 20:16:55 2022 +0300

    Merge branch 'fix4rigs' into loc_testing

commit 8b79bee2bee9d97d1d4cb22d88bd4867fbf8c8b4
Merge: 10a171c 7fa57e3
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 18 19:30:47 2022 +0300

    Merge branch 'fix_contestname' into loc_testing

commit 7fa57e3d26e5821f888ba1514965e31f18932a5b
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 18 19:23:03 2022 +0300

    Fixed double usage of query qBands. Preferences/bands/Frequencies list it's grid contents if Wsjt-x remote was on and CQ-monitor selected. dmUtils.FreqFromBand uses same qBand query! (Could this happen also elswhere?)

commit 8def318afa
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 18 10:52:52 2022 +0300

    Fixed some RTTY text to DATA

commit 10a171c9eeb7b01058c80b0626cd9e62e2dad975
Merge: 53574a2 2b69915
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 17 11:33:16 2022 +0300

    Merge branch 'fix_contestname' into loc_testing

commit 2b69915de2ff7edaa69911d0499632d16f98a92c
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 17 11:27:29 2022 +0300

    Fix for contest name

    	Fix for contest name in contests that have all modes in use.
    	CW/SSB/FM/MGM like NAC has.
    	Then MGM qsos coming from WSJT-X will get name from contest
    	name in contest window if it is open during remote.
    	This overwrites WSJT-X predefined 4 contest names making all
    	qsos in contest to have same contest name defined in contest window.

commit 53574a2876ba5494f2b5a896373637bb7e00226c
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Oct 14 14:35:37 2022 +0300

    Fixed a help picture

commit 66963dc2f3bb6cf91548fde66c2712d75295500c
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Oct 14 13:20:47 2022 +0300

    Merged mwc_multip by copying

commit 511875d44689d89d04cd83b41e4c31680f61f108
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Oct 12 10:58:54 2022 +0300

    Fixed one hint text

commit cee767569b5c3e19a03f96c1e7b64079a67397ab
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 11 14:18:13 2022 +0300

    Fixed hint texts and added checkbox to turn them off (default ON)

commit 64f15aac093224c4e5230a65f8a3d0556c2f4580
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Oct 11 10:37:46 2022 +0300

    Removed s&p and mark dupe checkboxes from tabulation list. Set sorting(asc) for country, locator and message multiplier lists

commit bf3fcedffbc46652df3dd9100c9a4e9c71da91a6
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 10 15:41:03 2022 +0300

    Some help changes

commit 3d1adfd4384cf893101a144b1d72b7a0fcb6c92a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 10 15:30:03 2022 +0300

    Fixed SemiAuto memory sending. Fixed default report by mode creating

commit a2489b386a84f5251d50328c53644945b394af4a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 10 11:06:06 2022 +0300

    Fixed memory keys to work on all CW,SSB,FM,AM modes. Fixed corresponding help.

commit 8d8af10ecf72a8a07f96e7058b8957fae7e8aff3
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 10 10:49:09 2022 +0300

    Fixed call mode F2 and F3 sending. Fixed TRXControl 70cm frequency if defults are not set. Fixed save qso: Cursor must be away from edtCall

commit cb8ff91d56182f041def38d465d9e7d9ec598067
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Oct 10 09:18:06 2022 +0300

    Status view clear when no contestname

commit 14a7fead6863046b5262d0af6b548122192b6bf9
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Oct 8 15:21:03 2022 +0300

    Manually merged mwc_multip

commit 06d3d9a41a1e966e7be3f9996827bec9473d183d
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Oct 1 17:08:12 2022 +0300

    Merged mwc_multip

commit 92063bcad447df14e5ea27c6f2fc34e4173e64ca
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 27 13:14:26 2022 +0300

    changed dupe check to writing of call. Added hint texts. Added score group box, but this needs lot of work to run

commit 122fec07b4c8ca4c46ef4fe4a3323edcf25e70d7
Merge: 2f984a6 f01f021
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 26 19:26:51 2022 +0300

    Merge branch 'mwc_multip' into loc_testing

commit f01f0212a9bfe66acaa8f3dfabd8948ee274c7f9
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 26 19:25:25 2022 +0300

    Added S&P checkbox (default off, Shift+Tab toggles) When OFF and CW has semi-automatic macro sending: exit edtcall and call>2 send F2, if then dupe found send F3, when saving qso send F4. When S&P checkd works as before (user must press F to send)

commit 657bba3b39377937ccaf9acc757113966e0f0b93
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 23 11:04:48 2022 +0300

    Small bugfix with number multipliers. Changed contest filter combo box to appear in order from A to Z (was Z to A)

commit 2f984a6b3aeb5742041bc6ebf3f81e66d1894863
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 23 10:58:51 2022 +0300

    Small bugfix with number multipliers. Changed contest filter combo box to appear in order from A to Z (was Z to A)

commit 5776ef997c80be287f9704200c0427d4c7b008d2
Merge: ef88464 35b9ccb
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 22 20:59:44 2022 +0300

    Merge branch 'mwc_multip' into loc_testing

commit 35b9ccb8b3c87389c697e1c87a54366f233ff529
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 22 20:56:52 2022 +0300

    bugfixes: Made own query/transaction 'CQ/trCQ'. Moved suffix work to mysql. Fixed statusbar layout.

commit ef8846438bb52a00f307e341e2dd531d7fe964b2
Merge: eff642e fc9d8c2
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Sep 17 14:25:38 2022 +0300

    Merge branch 'save_when_load' into loc_testing

commit fc9d8c2d02cf1b7bb9e5dc1b40944721be8ae016
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Sep 17 14:25:01 2022 +0300

    Fix for LoadForm: removed saving assume copied from SaveForm source

commit eff642eed375ebcdc28fa5bac693a33fbc111e55
Merge: 6bbc18a b289669
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Sep 17 14:16:07 2022 +0300

    Merge branch 'squash-newqso_tab_offline' into loc_testing

commit 6bbc18a729a7f48c091ccbb5e163640f3fcf63d8
Merge: 2a59496 2c640d1
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Sep 17 14:13:26 2022 +0300

    Merge branch 'mwc_multip' into loc_testing

commit 2c640d1bef8ab3e179b87ed72446ee89598b5fd2
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 16 15:48:34 2022 +0300

    Added total score and made rest of view band based

commit 06f394a5e7c5f3ed2270a684ecaad5989a70b68d
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 16 13:58:17 2022 +0300

    Additon to contest
    	OK1WC memorial score counting.
    	This does not work for multiband yet.

commit df0dff35d9
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 15 13:22:16 2022 +0300

    fixes when rig is 'None'

commit e2f5ca64a9
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 15 10:25:13 2022 +0300

    Small fix to help

commit aa86ada4d5
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 15 10:15:35 2022 +0300

    Fixed preferences.lfm cleanup

commit b7a6b918ee
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 15 09:52:16 2022 +0300

    cleaned preferences.lfm

commit d27f7727cc
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 14 18:31:39 2022 +0300

    Fixed some help files

commit 9ef0a20b84
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 13 12:13:13 2022 +0300

    Changed 'modes/data mode' edit to mode selector. exit from user digital modes will update selector.

commit a29e38cbdc
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 12 19:11:25 2022 +0300

    prefereneces fix. Help image refresh. ToDO: help text fix

commit 35b878af51
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 12 15:53:48 2022 +0300

    Fixed localconf bug, fixed Cw init, fixed winkeyer use pot speed, fixed WPN display now 0WPM when no key, -1WPM if winkey poti used

commit b756151a6b
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Sep 12 13:11:49 2022 +0300

    TRX cmb works  now. Todo : set selected modes and keyer visible on init

commit f9f4a4369d
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 9 16:29:53 2022 +0300

    Now preferences nearly works. Just TRX cmb loses its text (why)

commit 934694ea63
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 9 13:33:02 2022 +0300

    added cw setup in pref. Whole setup is still broken...AHhhhhhh

commit 1553f48abb
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 8 12:49:22 2022 +0300

    CWkeyer selection fixed. Not tested at all yet

commit 7631a8eed1
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Sep 8 11:37:03 2022 +0300

    CW interface layout fix

commit 3d0ea64f5d
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 7 13:04:48 2022 +0300

    fixed powerbuttons, initial powerON checkbox usage, preferences loading

commit 5fbd310db3
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 7 11:51:30 2022 +0300

    fixed errors in preferences/trxcontrol&modes

commit 9cec135549
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 6 20:26:51 2022 +0300

    fixed local storage. TODO rig naming in selector does not work

commit 63dac701a5
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Sep 6 12:55:56 2022 +0300

    added adjustable rig count 1-6. Needs testing still

commit 5d599f358f
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Sep 4 21:22:21 2022 +0300

    fixed rig selections, not tested yet!

commit 058b183166
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Sep 3 12:23:47 2022 +0300

    fixed rig selection a bit, still needs work

commit c079448a1b
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Sep 2 17:01:00 2022 +0300

    rtty/datamode change done. Still completely untested. Compiles ok.

commit d5e27773bb
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 31 15:41:25 2022 +0300

    done some modes usage. todo:Test dxspt click and mode set. Part of rtty/datamode change done. Todo:finish it

commit 89a8eee812
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 30 16:22:44 2022 +0300

    Added preferences/TRXControl/Rig Power ON checkbox. If rig supports power cat commands and checked will send PowerON cmd to rig at initialize phase.

commit 374624a03b
Author: OH1KH <oh1kh@sral.fi>
Date:   Sun Aug 28 17:05:57 2022 +0300

    added 3-6 to config storage TRX and BAND. NOT tested yet

commit d4b5189aa7
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Aug 26 21:25:09 2022 +0300

    fixed spinedt width.Todo: modes usage in other units, add Data mode code

commit 64146a66c1
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Aug 26 12:03:50 2022 +0300

    fixed modes preferences.Todo: fix spinedt width, modes to other units, add data mode code

commit 1814733715
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 25 13:11:13 2022 +0300

    Empty rig model will erase whole TRXnr section

commit a1662e2484
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Aug 25 10:54:40 2022 +0300

    TRXcontrol rig change works

commit b289669d3b
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Aug 24 12:46:02 2022 +0300

    Fix to QSO offline input

            When Offline checkbox is checked and first qso typed in and saved
            focus will return to QsoDate column instead of Callsign column.
            Then when date, start time and end time are set and then TAB
    	pressed focus will move to callsign column.
            This happens only if callsign cloumn is empty (not when in edit qso)

            This makes qso manual feed from paper log easier as things start
            from date and tabulation continues in chronological order:
            date,start,end,call,freq, mode .. etc and when qso is saved
            focus returns again to date column.

    	When typing in Date and times in Offline Cqrlog will add punctuation
    	marks ('-' or ':') automatic. This way only number keys need to be typed.

    	When not valid locator is entered (usually odd number of characters)
    	NewQSO/GRID label will turn bold red as warning sign when exit from
    	grid column.

    	Tested ok with GTK2 and QT5 using Lazarus Ver 2.2.2

    Squashed commit of the following:

    commit 8157d01e220b63bf9bf42d0e2d8576fb40b00b56
    Author: OH1KH <oh1kh@sral.fi>
    Date:   Wed Aug 24 12:43:00 2022 +0300

        Added auto '-' and ':' when typing in date and times in Offline mode. Grid label changes to bold red if gird is not valid (odd number of chars)

    commit 51e1c90bb51ab5b4626dd6c54b37cc22d8468420
    Author: OH1KH <oh1kh@sral.fi>
    Date:   Mon Aug 22 10:25:11 2022 +0300

        Fix remote situation

    commit 896479695797e88de0abd9dc4436c960b96451b4
    Author: OH1KH <oh1kh@sral.fi>
    Date:   Sun Aug 21 15:56:41 2022 +0300

        Fix to QSO offline input

commit a25ddbe0f4
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 23 20:12:47 2022 +0300

    Tabulation orders

commit 011fa17faf
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 23 19:45:17 2022 +0300

    Load and save works

commit 8c53ab313a
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 23 19:05:40 2022 +0300

    added TRX(nr) Load and Save

commit baaeb01174
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Aug 23 15:50:04 2022 +0300

    Remove rig tabs and insert rig number combo box, continue from fromShow/loadrig

commit 2a5949622ebe80e974b0edc30bdfac5066fa3edd
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 25 18:50:29 2022 +0300

    Version 2.6.0(103)

commit f1a6f2e8118089b078bc20aaccc90eeaf7da00d6
Merge: 4bdea65 98a8ba5
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jul 25 11:25:52 2022 +0300

    Merge branch 'master' into loc_testing

commit 4bdea65de86a59382eed9a2b7ecec720e3ddb60c
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 15 12:57:32 2022 +0300

    Version 2.6.0(102)

commit a50cd7982e104a49eecb087e5e3ab37abf7c235b
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 15 11:06:18 2022 +0300

    verson prepare

commit bbdfa7afd2bbc5bc5b9a0caa370379e654b4813e
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 15 08:46:23 2022 +0300

    version prepare

commit 8a4c3a02b4e5b40369fd38bec31224588aa9b1f5
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 9 19:03:53 2022 +0300

    possible RBN monitor bug

commit 1887cc172256f5ee7300a0822a13d430c217b377
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue Jul 5 11:58:11 2022 +0300

    Fix for preferences/modes

    	Changed max value of all passbands to be 100kHz that suits
    	better to modern rigs than previous 3000/6000 and makes
    	no harm having it "high enough".

commit bff3a95f7092463be96a36569577c44ee3dca6b0
Author: OH1KH <oh1kh@sral.fi>
Date:   Sat Jul 2 13:04:54 2022 +0300

    another way, maybe better

commit 64686ca5fb71c4f23c5cab8588bfa5cdd788ab0b
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 1 12:00:07 2022 +0300

    Update README.md

commit e22f335671202eaaa23092db046d1e99e1066d39
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 1 11:55:03 2022 +0300

    Version 2.6.0(101) [only alpha binaries]

commit fd2425d2af22c107461713d087dba7ff5550b354
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 1 11:25:51 2022 +0300

    added filename fix PR by SM0KBD

commit 8307cd7cbec85558f75224a474e6334fbb3467db
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 1 10:37:43 2022 +0300

    added zip

commit 0610b18a922e8a210d0577699b59559766bb3355
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri Jul 1 10:30:02 2022 +0300

    layout fix

commit 8a564270790d19fad97879d2e51f8d47a58b9ef1
Merge: 09028cf 0fb4345
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 10:22:01 2022 +0300

    Merge branch 'new_rig_comm_2' into loc_testing

commit 0fb4345a3a584f91c8e89aa0c9be94dc83ab5f58
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 10:21:07 2022 +0300

    Fixed passband '-1' setting

commit 09028cfa198f7b042bf6d4be2806c454e766e964
Merge: c71ba11 1ea3a5c
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 09:44:20 2022 +0300

    Merge branch 'new_rig_comm_2' into loc_testing

commit 1ea3a5c193ad3db60a728f3c3e8c3d6ab93187e3
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 09:41:14 2022 +0300

    If rig can get vfo coloer TRXC vfo buttons,else not

commit a99edac732d15a354a0e3a10ef399107e53171dd
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 09:04:10 2022 +0300

    restored queue send

commit c71ba117d4e7925d28c7df7083b1c4ad57b37bfd
Merge: a583c47 cd1ba32
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 09:02:42 2022 +0300

    Merge branch 'new_rig_comm_2' into loc_testing

commit cd1ba324376556d64cd7d38667a4609f514c736c
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 27 08:28:52 2022 +0300

    connect indication

commit 1f1653ed7b634eda81586409fab3564273888513
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jun 23 17:56:05 2022 +0300

    looks good, but connection status must be fixed

commit d54143de69950a6e80c578cf4049a418e909972c
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jun 23 14:07:06 2022 +0300

    power on / off btns work now

commit 1332722a3a9483699735404af9ccc0ff322c44e9
Author: OH1KH <oh1kh@sral.fi>
Date:   Thu Jun 23 13:06:14 2022 +0300

    Third try to fix this uRigControl

commit a583c47efef9ac0195db6efdb90f24758753cdc5
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 10:02:58 2022 +0300

    fix branch loc_testing

commit 95ecc1004b23878105681ad5dc3e977b346d2f7d
Merge: 54367ef bf3a3b4
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 09:56:51 2022 +0300

    Merge branch 'fix_states' into loc_testing

commit 54367ef669e8c6823b4a509329b71cbe6ba49dec
Merge: 7e49c52 72f215a
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 09:56:41 2022 +0300

    Merge branch 'fix_rtty_data' into loc_testing

commit bf3a3b4e6b99e5dfd789e3d03c6dc9fafffb13e0
Merge: 5d50b82 f4d5d1e
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 08:14:06 2022 +0300

    Merge branch 'master' into fix_states

commit 72f215a7388302c7b92b40974716c732a46b30db
Merge: 42c3977 f4d5d1e
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 08:13:45 2022 +0300

    Merge branch 'master' into fix_rtty_data

commit 7e49c52e8d309a97101bc3d951ab5d28885445b4
Merge: 69e2379 f4d5d1e
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon Jun 13 08:12:17 2022 +0300

    Merge branch 'master' into fix_disable_triggers

commit 5d50b8230793a28e9a681b2d32902bde34f9a3a5
Merge: c2d4de6 6a1c6b4
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jun 8 08:48:06 2022 +0300

    Merge branch 'master' into fix_states

commit 42c3977c8b30fd3471d56122bf2301108f9e6fac
Merge: 86dcbe5 6a1c6b4
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jun 8 08:47:49 2022 +0300

    Merge branch 'master' into fix_rtty_data

commit 69e23797ff4f79e66d062b6dacfc3c88a5cc5131
Merge: 3c67031 6a1c6b4
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Jun 8 08:47:33 2022 +0300

    Merge branch 'master' into fix_disable_triggers

commit c2d4de63c72fef1034be249d1cc1c1464ca906c1
Merge: f21e041 823332c
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 31 09:50:22 2022 +0300

    Merge branch 'master' into fix_states

commit 86dcbe5dab759091192e29bbe3d816cf208ffc1c
Merge: 49fd593 823332c
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 31 09:50:02 2022 +0300

    Merge branch 'master' into fix_rtty_data

commit 3c6703147292377c076ad182336b22540195e515
Merge: 981229d 823332c
Author: OH1KH <oh1kh@sral.fi>
Date:   Tue May 31 09:48:36 2022 +0300

    Merge branch 'master' into fix_disable_triggers

commit 49fd59324facd209fb7b61fb653075b77ef99307
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri May 20 11:42:55 2022 +0300

    lfm fix

commit 4e01768d44957cf1aa4ac23695bc052b6fff5f3d
Author: OH1KH <oh1kh@sral.fi>
Date:   Fri May 20 11:39:27 2022 +0300

    This nearly works

commit 981229dc549f0b54e15a4346ebac4104b356c22a
Merge: 17a8505 498fada
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon May 16 15:54:23 2022 +0300

    Fixes to triggers

    	Disable triggers  moved to 2022-05-12 source

    Merge branch 'disable_triggers' into new_disable_triggers

commit f21e0414eaa12efbf6599ac41ded57aa321a1c55
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon May 16 15:08:58 2022 +0300

    US states to CQ-monitor/wsjt-map

    	This addition inserts US states display to Cq-monitor/Wsjtx-map
    	Then information are downloaded from fcc and converted to StringList
    	ctyfiles/fcc_states.tab
    	Received USA callsigns are compared against StringList call=state and state
    	from there added.
    	Because list covers all US callsigns found callsign=state pairs are
    	added to runtime stringlist that is first seeked when callsign is received.
    	That makes search faster as same callsigns appear again on next period(s)
    	and "ready found list" used is then shorter.
    	Runtime list is cleared when wsjtx remote is closed.

    	If there is no fcc_states.tab, or it is over 90 days old, it is asked should
    	Cqrlog load new info from fcc.
    	If permission is given the download address is shown in case fcc changes it
    	and so user can change right address.
    	After download the raw file Cqrlog asks should new fcc_states.tab should be created
    	from raw data. if permission is given the process starts with  process indocator.
    	Handling may get some time with slow computers like RPi.

    	This system gives up-to-date info and is fast enough to use with every received
    	period (internet lookup from QRZ/hamQTH is too slow for that purpose).

    	Addition has been in use long time with my test version and proved to work.
    	Now it is transferred to source 2022-5-12 and hopefully has no erros added.
    	(the move needed lot of manual work)

commit a4e4b4d9db7ca035721ad6d42939a3b31281a3c9
Author: OH1KH <oh1kh@sral.fi>
Date:   Mon May 16 12:31:26 2022 +0300

    Works, perhaps. Should be tested

commit 498fada9f0
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 9 17:52:12 2020 +0300

    Added Ignore QSL feature to Labelprint and Automark QSL

commit 7958437f17
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 9 17:28:17 2020 +0300

    Added Ignore QSL and Ignore Edit (in preferences)

    - user can select the effect of QSL and Edit just like LoTW adn eQSL has.

commit a3db065f99
Author: OH1KH <oh1kh@sral.fi>
Date:   Wed Sep 9 11:35:33 2020 +0300

    Added QSO list/Online Log/Remove all upload triggers

     - sometimes user wants to change QSL markings without uploading change (1-10000pcs) to online logs.
This commit is contained in:
OH1KH 2023-10-04 11:16:22 +03:00
parent 98a8ba5d0d
commit fc3dc79d32
150 changed files with 16519 additions and 9825 deletions

View File

@ -18,6 +18,7 @@ clean:
rm -rf src/backup
rm -f -v src/richmemo/*.o src/richmemo/*.ppu src/richmemo/gtk2/*.ppu src/richmemo/gtk2/*.o
rm -f -v tools/adif_hash_generator tools/adif_hash_generator.lpi tools/adif_hash_generator.lps
rm -rf /tmp/.lazarus
install:
install -d -v $(bindir)

View File

@ -1,3 +1,13 @@
About this "Alpha" version by OH1KH
---------------
This is a clone of Cqrlog source with some additons of my own.
From folder "compiled" you find ready compiled binary files against official Cqrlog and for this "local_testing" source.
There is also "newupdate.zip" that includes "newupdate.sh", a script that does Cqrlog backup and update for you with selected binary file.
Same folder has also README.md that holds further informations.
What is CQRLOG?
---------------

228
compiled/README.md Executable file
View File

@ -0,0 +1,228 @@
#### NOTE: Upgrading to 2.6.0.(115) ,or higer, will change database table "cqrlog_common" to version 6.
If you return back to previous cqrlog version you need to restore the database.
( if you used newupdate.sh it is to copy backup foder ~/.config/cqrlog-YYYYMMDD-HHMMSS to name ~/.config/cqrlog )
#### NOTE: For now on alpha test binaries beginning from 2.6.0.(107) are compiled using system that has GLIBC version 2.35.
If you can not start Cqrlog after update check your GLIBC version with command console: ***ldd --version***
Update GLIBC if it is below 2.3.5.
If you do not want to do that you can compile this source (see 1 folder up) with your current OS version and get it running.
Note that the source version is usually one step higher than ready compiled versions.
#### NOTE: At the moment there is no new official version source release. That is why Alpha (119) is ***VERY far ahead*** from official.
From [Changelog](https://htmlpreview.github.io/?https://github.com/OH1KH/cqrlog/blob/loc_testing/src/changelog.html)
you can see all changes. It appears also at first start of (119), and can be accessed via "Help" when Cqrlog is running.
Latest cqrlog alpha test binaries can be found from this folder.
This folder holds ready compiled binary files of source "loc_testing" that is the version of cqrlog that I am using myself daily.
They contain all accepted pull requests from official source (that may not be released offically yet) plus some test code that is not pull requested yet (and may not be pull requested ever)
## ABOUT THESE BINARIES:
These binaries (cqr0,cqr1,cqr4 zips) include latest official source having updates up to commit:
Commits on Jul 24, 2022 Merge pull request #529 from OH1KH/direct_load_filter
Binaries (cqr2,cqr3,cqr5,cqr6 zips) include latest official source ***WITH alpha additions and Pull Requests that have not yet applied***.
To see what are the latest official updates look at <https://github.com/ok2cqr/cqrlog/commits/master>
To see updates in this alpha version look at <https://github.com/OH1KH/cqrlog/commits/loc_testing>
To read about UTF8 special charcters in logs read file UTF8_logs.md
BINARIES:
---------
- **cqr0.zip holds binary for 64bit systems compiled for GTK2 widgets (official release )**
- **cqr1.zip holds binary for 32bit systems compiled for GTK2 widgets (official release )**
- **cqr2.zip holds binary for 64bit systems compiled for GTK2 widgets (official release of cqrlog with alpha additions)**
- **cqr3.zip holds binary for 32bit systems compiled for GTK2 widgets (official release of cqrlog with alpha additions)**
- **cqr4.zip holds binary for 64bit Arm (Rpi4) compiled for GTK2 widgets (official release )**
- **cqr5.zip holds binary for 64bit systems compiled for QT5 widgets (official release of cqrlog with alpha additions,you may need to install libqt5pas to run this)**
- **cqr6.zip holds binary for 64bit Arm (Rpi4) compiled for GTK2 widgets (official release of cqrlog with alpha additions)**
- **help.tgz holds latest help files**
- **newupdate.zip holds the newupdate.sh script for easy update**
**All binaries must be copied over complete, working, official installation. These do not work alone.**
========================================================================================================
------------------WARNINGS-----------------
===========================================
**This is NOT official release !**
***ALWAYS !! FIRST DO BACKUP OF YOUR LOGS AND SETTINGS !!***
If you use script-install (see below) it makes backups for you.
Otherwise see "manual-install (below).
In some cases it has happen that alpha binary compiled using Fedora linux may not run flawlessly with Ubuntu derivates.
if you start to get mysterious errors it might be the reason.
I have now added version that has no special additions from me. It is compiled with Mint20 from up to date official source.
You could try that or otherwise consider to compile cqrlog either from official or from my alpha source.
I have written few messages to Cqrlog forum how to make the compile.
-----------YOU HAVE BEEN WARNED!------------
============================================
### -------------------SCRIPT-INSTALL--------------------
**There is now new script for update. You need to download only the script and start it.**
**It will do rest of downloads for you and then install updates.**
Use it this way:
Download newupdate.zip from GitHub page.
- click blue link of newupdate.zip file. New page opens. You see that there is a button "Download" click it.
Your browser downloads the zip. If it asks where to save, select folder from where you can find the zip.
Open command console. Go to your download directory.
cd [your download directory path]
Unzip newupdate.zip to find the newupdate.sh script:
unzip newupdate.zip
Then start newupdate.sh script with command:
./newupdate.sh
If you can not start script then check that you can execute newupdate.sh by giving a command:
chmod a+x newupdate.sh
Then try again to start script.
There has been one case where starting newupdate.sh it complains error at line 5 (arch bracket).
In that case solution was to start newupdate.sh as:
bash newupdate.sh
That (Ubuntu 20) linux obviously did not had bash as default shell.
Script checks frist that you have cqrlog installed and that you have some other needed programs.
If they are not found it will stop and tell what you should do before new try.
I have tested this script many times while writing it. How ever it may fail with your setup.
So you USE IT ON YOUR OWN RISK !
Here is a video showing update in use https://www.youtube.com/watch?v=H_QLQhQyFVg&t
Other way to update is to do it manually as follows:
## -------------------MANUAL-INSTALL--------------------
Simplest way to backup everything is to copy whole folder with console command
cp -a ~/.config/cqrlog ~/.config/cqrlog_save
After doing this, if you ever need to restore old settings and logs, just give console commands
rm -rf ~/.config/cqrlog
cp -a ~/.config/cqrlog_save ~/.config/cqrlog
(you need to become root (sudo) using sudo to do following):
#### -------------INSTALL NEW HELP FILES----------------
Your /usr/share should usually contain folder cqrlog, if so, do install help files.
cd /usr/share/cqrlog
sudo tar vxf /your/download/folder/help.tgz
#### ------------THEN INSTALL THE CQRLOG ITSELF---------
cd /tmp
unzip /your/download/folder/cqr5.zip (cqr3.zip or cqr2.zip)
Then just copy '/tmp/cqrlog' over your existing 'cqrlog' (usually in /usr/bin folder)
when first saving the old one to cqrlog_old that you can copy back if new one does not work.
Then check execution rights.
sudo cp /usr/bin/cqrlog /usr/bin/cqrlog_old
sudo cp /tmp/cqrlog /usr/bin/
sudo chmod a+x /usr/bin/cqrlog
## -------------------MANUAL-COMPILE--------------------
Once you have a running Cqrlog installed you can do update also by making the compile from source code.
For getting source code there are two ways:
clone my whole Git reporsitory using command terminal:
git clone https://github.com/OH1KH/cqrlog.git
This will make folder "cqrlog" to your home directory if cloning is issued on that directory.
After that, to get into Alpha branch, give command:
git checkout loc_testing
Now you have the Alpha source in hand.
Good side with "git clone" is that on next time you like to upgrade you just open command console and change directory to "cqrlog" ("cd cqrlog") and issue command "git pull" and new updates are applied and you are ready to compile and install again.
Other way is to download just the current version's source with web browser from https://github.com/OH1KH/cqrlog/tree/loc_testing At that page you see green button "Code". By pressing that you find "Download.zip" that allows to download the source code as zip file.
Once downloaded and extracted you are at same point as after "git checkout loc_testing" above.
How ever you can not do new uptates later with "git pull". You have to download the zip file again.
Once you have source you need tools to compile. Using command termnal install them.
sudo apt install lazarus
That will install FreePascal compiler and Lazarus GUI. Issuing that line results a long list of dependencies to install, just say Y (yes) to install them all.
If your Lazarus is very old from package you find latest version from https://www.lazarus-ide.org It is always recommended to use latest version as package versions can be very old, as seen with Cqrlog packages. At the moment lazarus-ide version is 2.2.6
When lazarus-ide is installed you need to change to source directory, either git cloned or extracted from zip. ("cd cqrlog")
After that start the compile process, issue:
make
When compile has finished install the new Cqrlog with command
sudo make install
That is all!
With some OS "make" result errors. Then usually using the lazarus-ide works.
Start lazarus-ide typing that to command terminal, or start from startup menu icon "lazarus".
At first start it goes through some settings. If all Tabs show OK you are ready to continue.
Lazarus starts first to empty form. Use top menu "Project/Open Project" and navigate to your "cqrlog" source folder. There you see subfolder "src". Navigate to that folder and you see "cqrlog.lpi". Open that.
Once opened select top menu "View/Messages" to see compiler messages. Then select top menu "Run/Compile".
Wait and finally you should see a green line on Messages window. It means that compile is over.
You find new cqrlog from folder "src" as file "cqrlog"
You can now try command terminal:
cd cqrlog (this is the source root folder, as before)
sudo make install
If succeeded you have new version with new help installed. If not, you can just copy file "cqrlog" from folder "src" to "/usr/bin"
There already exists a file named "cqrlog" (that is the old version) you can first copy it somewhere, if you like, before
coping over the new one.
You need "sudo" for this copy.
sudo cp src/cqrlog /usr/bin
### A list what is not included into official cqrlog GitHub source and exist only in Alpha test versions can be found from [Changelog](https://htmlpreview.github.io/?https://github.com/OH1KH/cqrlog/blob/loc_testing/src/changelog.html)
### Some Cqrlog related videos can be found from <https://www.youtube.com/channel/UC3yPCVYmfeBzDSwTosOe2fQ>
All kind of reports are welcome. You can find my address from callbooks.

31
compiled/UTF8_logs.md Executable file
View File

@ -0,0 +1,31 @@
# READ AND UNDERSTAND THIS!
From version 2.5.2(102) on *and also official version compiled from source after 2021-02-15*
Database opening has fixed so that special charcters like ÜéÄ etc. work properly with latest Freepascal version.
This means that your earlier made loggings that have special charcters in qth, name, remarks etc.
will show up as garbage. While your new loggings will show special charcters fine.
If you like them all show out ok you have to do full adif export/import from your log(s)
*before you upgrade cqrlog*. Do it this way:
1) Open cqrlog that is not updated yet.
2) When in "Database Connection" window select your log to be exported.
(if your cqrlog opens directly to NewQSO select File/Open or create new log
to get "Database Connection" window. There uncheck "Open recent log after
program start" and close cqrlog. Open cqrlog again and you are in "Database Connection" window )
3) press "Utils" select "configuration/export" and give filename for example. "log"
4) When done that open log and then open QSO list and /File/Export/Adif give filename
and then check all checkboxes to make full ADIF export.
5) Close cqrlog and make cqrlog update to new version
6) Open new cqrlog and your log and confirm that special charcters are garbage.
7) Close cqrlog. Open it again to get "Database Connection" window
8) Press button "new log" Give log number and name. See that new log gets selected. Not open it yet.
9) Press "utils" select "configuration/import" and find your newly created file example "log.ini"
10) press on and after succesfull import open that log.
11) Open QSO list File/import/ADIF and find and load your newly created full adif export file.
12) Once loaded confirm that you can again see special characters properly and also new qso entries
will have them properly.
## Do not try to be smart and try invent a shortcut for this 12 line guide
Update scirpt will do backups from old /usr/bin/cqrlog programs, so
do not worry if you missed this and regret. Look at /usr/bin to find old cqrlog backups.
copy one of them to name /usr/bin/cqrlog (you need sudo) and you can start guide above.

BIN
compiled/cqr0.zip Executable file

Binary file not shown.

BIN
compiled/cqr1.zip Executable file

Binary file not shown.

BIN
compiled/cqr2.zip Normal file

Binary file not shown.

BIN
compiled/cqr3.zip Executable file

Binary file not shown.

BIN
compiled/cqr4.zip Executable file

Binary file not shown.

BIN
compiled/cqr5.zip Normal file

Binary file not shown.

BIN
compiled/cqr6.zip Normal file

Binary file not shown.

BIN
compiled/help.tgz Normal file

Binary file not shown.

BIN
compiled/newupdate.zip Executable file

Binary file not shown.

Binary file not shown.

View File

@ -20,12 +20,14 @@ ARISS|ARISS
Arsene|OSCAR 24
BO-102|BIT Progress-OSCAR 102 (CAS-7B)
BY70-1|Bayi Kepu Weixing 1
CAS-2T|CAS-2T
CAS-3H|LilacSat-2
CAS-4A|CAMSAT 4A (CAS-4A)
CAS-4B|CAMSAT 4B (CAS-4B)
DO-64|Delfi OSCAR-64
EO-79|FUNcube-3
EO-88|Emirates-OSCAR 88 (Nayif-1)
FO-118|CAS-5A
FO-12|Fuji-OSCAR 12
FO-20|Fuji-OSCAR 20
FO-29|Fuji-OSCAR 29
@ -34,6 +36,7 @@ FS-3|FalconSAT 3
HO-107|HuskySat OSCAR 107
HO-113|HO-113
HO-68|Hope-Oscar 68
IO-117|GreenCube
IO-86|Indonesia-OSCAR 86 (LAPAN-ORARI)
JO-97|Jordan-OSCAR 97(JY1Sat)
KEDR|ARISSat-1
@ -44,6 +47,7 @@ LO-90|LilacSat-OSCAR 90 (LilacSat-1)
MAYA-3|Cubesat
MAYA-4|Cubesat
MIREX|MIR Packet Digipeater
MO-112|Mirsat-1
NO-103|Navy-OSCAR 103 (BRICSAT 2)
NO-104|Navy-OSCAR 104 (PSAT 2)
NO-44|Navy-OSCAR 44

View File

@ -30,66 +30,103 @@
<div style="text-align: left;"><strong>CQRLOG for LINUX by OK2CQR &amp; OK1RR</strong></div>
<p align=center><img src=img/line.png></p>
<a name=co1><h2><strong>Contest support</strong></h2></a>
<p>You will find contest selection from <b>NewQSO/Window</b> dropdown menu.
<br><br>When contest window is open <b>NewQSO</b> has contest exchange fields visible. You may have to stretch <b>NewQSO </b> window horizontally to see them.
<br>You <b>do not</b> normally need <b>NewQSO</b> window during contest. Only need for <b>NewQSO</b> is in case you have to edit an already worked qso.
<br> Select qso normally via <b>QSO list</b> and press <b>edit QSO button</b> and you are able to edit qso, also the contest message part of it.
<br><br><b>NewQSO</b> is not meant to be used during contest qso feeds. <b>All new qsos are entered via contest window.</b></p>
<p>You will find contest selection from <b>NewQSO/Window</b> dropdown menu. Contest support of Cqrlog is very limited, but will serve you well if you just
like to take a part to contest without winning in mind.
<br>Contest window is just a "child form" for <b>NewQSO</b> to make qso logging faster when working in contests.
With <b>Tru</b> and <b>Msg is Loc</b> setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso
logging. Perhaps also in some other operations like WWFF activations.
<br><br><b>Note:</b> This is <b>NOT</b> a contest logging add-on!!! It is a contest-notepad.
It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders!
<br><br>When contest window is open NewQSO</b> has contest exchange fields visible. You may have to stretch <b>NewQSO </b> window horizontally to see them.
You <b>do not normally need NewQSO</b> window during contest.
<br><b>Only need for <i>NewQSO</i> is in case you have to edit an already worked qso.</b>
Select qso normally via <b>QSO list</b> and press <b>edit QSO button</b> and you are able to edit qso, also the contest message part of it.
<br><br><b>Repeat: <i> NewQSO</i></b> is not meant to be used during contest qso feeds. <b>All new qsos are entered via contest window.</b></p>
<p align="center">
<img src="img/contest.png">
</p>
<p>
<b>RECOMMENDATION:</b> Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed.
<b>Note:</b> This is <b>NOT</b> a contest logging add-on!!! It is a contest-notepad.
It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders!
<b>RECOMMENDATION:</b><br> Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed.
<br> It might be a good idea to have two logs the "contest" that is used during a contest and then cleared for new contest and the other as
"contest archive" where contents of "contest" are moved with adif export after Cabrillo log is sent.
<br>Benefit of having "contest" log with one contest is also that you get <b>DXCC statistic</b> right after cursor leaves callsign column. You can place contest window just above NewQSO/DXCC statistic.(see pic above).
</p><p>
Contest window is just a "child form" for <b>NewQSO</b> to make qso logging faster when working in contests.
With <b>Tru</b> and <b>Msg is Loc</b> setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso
logging. Perhaps also in some other operations like WWFF activations.
<br><br>
Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "Dupe" in "Comment to qso" field.
<br>To get this working properly you must <b>either</b> create a new log for every contest <b>or</b> set dupe start date (I.E. contest starting day) with button <b>"from YYYY-MM-DD"</b>
Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "<b>/D</b>" in "<b>RST sent</b>" field.
When doing Cabrillo export it is operator's duty to decide what to do with "/D" reports
<br>To get duplication check working properly you must <b>either</b> create a new log for every contest <b>or</b> set dupe start date (I.E. contest starting day) with button <b>"from YYYY-MM-DD"</b>
</p>
<p>
<b>HOTKEYS</b> work like with <a href="h20.html">New QSO window</a>.
<h4>Hotkeys:</h4>
Hotkeys work same way as with <a href="h20.html">New QSO window</a>.
<ul><li> <b>2x ESC</b> clears all fileds</li>
<li>Note: <b>1x ESC</b> returns cursor back to Call-field (if cursor is in some of the other fields like RSTr) and places cursor at the end of callsign for possible repairs.<br>
It also halts CW memory output if it is just running.</li>
<li> <b> F1..F10 </b>send CW macros etc.</li>
<li> <b> F1..F10 </b>send CW or VOICE messages depending on used mode.</li>
<li> <b>TAB-key</b> moves cursor between fields. (may also be SPACE key, if set) </li>
<li> <b>Ctrl+Tab</b> will set <b>S&P</b> mode</li>
<li> <b>Shift+Tab</b> will reset <b>S&P</b> mode</li>
</ul>
</p>
<p>
Contest window has following fields and checkboxes:<br>
<h4>Contest window has following fields and checkboxes:</h4>
<ul>
<li><b>Tab in order</b> when checked overrides all other Tab settings (below) and Tab Order is Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll</li>
<li><b>Call</b> when you leave this field callsign is moved to NewQSO. Callsign turns BOLD RED if it is duplicate.</li>
<li><b>SPACE is TAB</b> when checked space bar acts like TAB-key moving to next field. <b>Note:</b>This prevents typing space (perhaps needed in MSG fields).</li>
<li><b>Dupe check</b> Default checked.
<li><b>from YY-MM-DD</b> Button to set duplicate check start date (I.E. contest start date). Must be set if you have all qsos in same log.
<br>If every contest has it's own log can be as default (1900-01-01). Button is not visible if <b>Ignore dupes</b> is set.
<li><b>NoMode4Dupe</b> Means that same callsign can be worked again on same band if mode is different.
<li><b>Contest name</b> Selection box has a list of predefined contest names. When selecting one and leaving <b>Contest name</b> combo box name will be cut from "|"(including it) that separates contest name and explanation.
You can also type contest name here if it is not in list. Be sure you do not use "|" character(s) in name because program will cut name from the first one found.
<br><b>RECOMMENDATION:</b><br>
Add date to contest name if you keep many contests in same log. That way <b>QSO list/Filter/Contest filter</b> can separate contests by name.</li>
<li><b>Tab in order</b> when checked overrides all other Tab settings (see below) and Tab Order is: Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll</li>
<li><b>Show hint</b> when checked shows help text of object that mouse cursor currently points</li>
<li><b>CQ panel</b> is visible when <b>S&P</b> is not checked (CQ calling mode)</li>
<ul><li><b>CQ period</b> timer period in millisecons to send one CQ+listen (5000 - 50000, 5-50sec)
<br> To adjust: Set repeats=1, press CQ start, adjust period value so that F1 has time to run + listening time</li>
<li><b>CQ repeats</b> repeat period how many times CQ period is repeated (1 - 20)s</li>
<li><b>CQ start</b> start/stop repeated CQ calling. <b>Shorcut key: Shift+F1</b>.
<br>Pressing <b>ESC</b> stops timer and CW send. It can not stop voice keyer script.
<br>Also writing anyting to <b>Call</b> will stop running timer and CW sending.</li>
</li>
<li><b>Ignore dupes</b> Do not check duplicate qsos at all.</li>
<li><b>Last Cq Freq</b> will show last used CQ frequency and mode. CQ frequency and mode is stored when F1 memory is launched either from keybord or from Memory keys F1 button.
Click on frequency or mode reading or Ctrl+L will restore rig to that frequency and mode. This value is not stored and clears when contest window is closed.</li></ul>
<li><b>Call</b> when you leave this field callsign is moved to NewQSO. Callsign <b>turns BOLD RED</b> while typing if it is duplicate (and duplicate check is active).</li>
<li><b>SPACE is TAB</b> when checked space bar acts like TAB-key moving to next field. <b>Note:</b>This prevents typing space (perhaps needed in MSG fields).</li>
<li><b>Dupe check</b> Default checked. If you use same log for several contests, and/or other working, set the contest start date with <b>from YY-MM-DD</b> button.
<br> if <b>NoMode4Dupe</b> is selected duplicate check allows qso with same station in same band if mode differs.
<br> if <b>Ignore dupes</b> is selected it will ignore duplication check completely.
<br> When dupe check is active and callsign is found as duplicate, but still saved, program will add <b>/D</b> to <b>RST sent</b>.
It is then operator's duty to clean or leave <b>/D</b> to exported Cabrillo log.</li>
<br>
<li><b>RST s</b> copied from NewQSO, so should correspond used mode. Can be changed.
<br><b> Note:</b> defaults to 599 (as NewQSO) If mode is not CW it will change after cursor leaves callsign column. So do not worry when working non-cw contest!</li>
<li><b>RST s</b> RST sent. Can be changed.
<br><b> Note:</b> defaults to 599 (CW) 59(phone). If rig mode is changed you get corresponding RST with 2xESC.
<br>It also changes when cursol leaves <b>call</b> column. So do not worry when working mixed mode contest!</li>
<li><b>Tru</b> means you like to exchange true reports. Makes Tab order to stop at RST (s & r) fields. Useful in some high band contests, Es and tropo openings.</li>
<br>
<li><b>NR s</b> serial number to send.
<br><b> Note:</b> you can type only numbers to NR s field.</li>
<li> <b>Inc</b> if checked it will auto increment serial number. You may change this number at any time. Increment goes on from typed number.</li>
<br>
<li><b>MSG s</b> sometimes you may need an additional message with number, or just a message with no number. On high band contests you may type your locator here.</li>
<li><b>Qsp</b> if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit. For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message. </li>
<li><b>MSG s</b> sometimes you may need an additional message with number, or just a message with no number.
On high band contests you may type your locator here.</li>
<li><b>Qsp</b> if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit.
For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message. </li>
<li><b>S&P</b> When Search & Pounce is checked operator launces all CW/Voice messages manually.
<br>When S&P is not checked (in RUN mode) program launches message F2 when cursor enters one of RSTr, NRr, or MSGr columns. This way also if true reports are selected F2 is sent after your message is ready.
<br>In case duplicate checking is enabled and callsign is duplicate, message F3 is launched instead of F2 and it happens always when cursor leaves callsign column.
<br>When <i>Enter</i> or <i>Save qso</i> button is pressed program will send message F4.
<br>Message F1 can be used for CQ that is manually launched.
<br>When phone modes are used messages are lauched same way but you need very special voice script if you want to include worked station's callsign into F2 and F3 messages, but launcing F4 at QSO save may be useful.
<br><b>NOTE:</b> When S&P checkbox changes state then also CW memory sets are switched between "S&P" and "Run".
<br>See more about <a href="/h26.html">CW messages</a> how to define messages with macros and save/load different setups of CW messages.</li>
<br>
<li><b>RST r</b> copied from NewQSO, so should correspond used mode. Can be changed.</li>
<li><b>RST r</b> RST received. Default to 599 (CW) 59 (phone). Can be changed.
<br>Default rst for CW and phone is created from rig's current mode. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons.
</li>
<br>
<li><b>NR r</b> serial number you receive.
<br><b> Note:</b> you can type only numbers to NR r field. </li>
<li><b>No </b> if no serial number then setting this changes tab order so that it jumps directly to MSG r. </li>
<li><b>No </b> if thre is no serial number in contest this setting changes tab order so that it jumps over, directly to MSG r. </li>
<br>
<li><b>MSG r</b> message you receive</li>
<li> <b>MSG is Grid</b> If '<b>MSG is ...</b>' is checked then message will be logged in <i> SRX_String </i><b>AND ALSO</b> to <i>selected NewQSO column</i>.
@ -98,13 +135,16 @@ Contest window has following fields and checkboxes:<br>
<br>If <b>MSG is Grid</b> but the entered locator is <b>not valid</b> it will <b>NOT</b> be copied to <i>NewQSO/Grid column</i> and stays only in <i>Srx_String</i>.
<br>
<br>In case of <b>MSG is State</b> and callsign is detected by prefix to be a Germany callsign srx_string is copied to <b>DarcDOC</b> column, orherwise to <b>State</b> column.
<br>In case of <b>MSG is Comment</b> and dupe checking is allowed, and dupe found, Comment to QSO contains first "Dupe " and then the copied message.</li>
<br>
<br>In other cases MSG is copied to correspondig NewQSO column.
<br><b>NOTE: </b>After selecting '<b>MSG is ...</b>' remember also to check the checkbox to get it activated!</b></li>
</ul>
<h4>Buttons you really do not need (you should <b>NOT use mouse</b> when working contest!):</h4>
<ul>
<li><b>Save QSO</b> Save QSO button at NewQSO, increments NR and clears all fields.
<br><b> Note:</b> pressing <b>ENTER at any time</b> after Call field is filled does the same.</li>
<li><b>Clear QSO</b> Clear all QSO information.
<br><b> Note:</b> pressing <b>ENTER at any time after cursor is out from Call column</b> does the same.</li>
<br><li><b>Clear QSO</b> Clear all QSO information.
<br><b> Note:</b> Pressing 2x ESC key does the same.</li>
<br><li><b>Clear all</b> Clear all fields. Usefull when starting a new contest to remove saved settings.</li>
<br><li><b>Clear all</b> Clear all fields. Usefull when starting a new contest to remove all saved settings.</li>
</ul>
<br>
All settings, including contest name, are saved when closing contest form. When opening cqrlog and contest form again after rest period you can directly continue contest working.
@ -113,18 +153,72 @@ All settings, including contest name, are saved when closing contest form. When
<p>
<b>Typical contest qso goes like this:</b><br>
Type callsign-&gt;press TAB-&gt;type contest rxnumber-&gt;press TAB-&gt;type contest message-&gt;press ENTER.
Or hit ENTER after rxnumber if no additional message is exchanged.
Or hit ENTER after rxnumber if no additional message is exchanged. When S&P is checked you maybe need to launch some Cw messages manually.
</p>
<p>Remember that pressing <b>ENTER</b> key at any field saves qso with existing values. How ever there must be
callsign of least three characters long. Sent/Received number and message are not needed.
<p>Remember that pressing <b>ENTER</b> key at any column saves qso with existing values. How ever there must be
callsign of least three characters long. Sent/Received number and message(s) are not needed.
<br><b>There is no need to use the mouse.</b> Keep your hands on keyboard (and possible on CW key / PTT (if not foot pedal in use)). It is faster.</p>
<p>
Contest numbers and messages are saved in log into their own columns. Use <b>preferences/Visible columns</b> to show them in <b>Qso list</b>.
Contest numbers and messages are saved in log in their own columns. Use <b>preferences/Visible columns</b> to show them in <b>Qso list</b>.
<br><br>
<b>CW macros</b> can be used for sending contest meessages. Look them from help section <a href="h26.html">CW Operation</a>
<b>CW messages</b> can be used for sending contest messages. Look at help section <a href="h26.html">CW Operation</a>
how to use macros in messages.
<br><b>NOTE:</b> If you use macro that sends whole contest message (%xrs = RST, STX, STXString) message will skip empty ones. This way %xrs works for all contests.
</p>
<h4>Status view support</h4>
<b>NOTE:</b> If you have one log called <b>contest</b> that you clear always before contest, to have just qsos of that contest, and after contest you move all qsos
with adif export to another log called <b>archive</b> you can view contest status afterwards from that log if you have used <b>unique contest names</b> I.E. added contest start date to name.
<br> Find contest with <b>Filter/Contest filter</b> and copy name from selection list box and paste it to Contest window. You do not have to activate contest filter to see the status of that contest.
<p><b>OK1WC memorial contest</b> status is supported.
<p align="center">
<img src="img/contest_mwc.png">
</p>
<p>
ADIF exports fields to right tags.<br><br>
If contest name has "<b>mwc</b>" or "<b>ok1wc</b>" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>TRXControl must show that rig is on 80m or 40m band. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons.
<br>Only bands 80M and 40M and mode CW are counted (See rules of contest).
<br><br>
</p>
<br>
<p><b>Nordic Activity Contest (NAC)</b> status is supported.
<p align="center">
<img src="img/contest_nac.png">
</p>
<p>
If contest name has "<b>nac</b>" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>
<br><br>
</p>
<p><b>Common</b> status is supported.
<p align="center">
<img src="img/contest_cmn.png">
</p>
<p>
If contest name has <b>any name that does not fit rules of two above</b> status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>There are several items shown in Status display. You can control them by left click below text <b>Status</b> (but above status display itself).
<br>The DX and own continent counts (EU in picture) are defined against your callsign in preferences/station/call.
<br><br> To see Status section you may need to stretch the bottom part of Contest window.
<br><b>NOTE:</b><i> Status counting may have errors! It is just for showing progress of contest, not to show final score.</i>
</p>
<p>
<H4>After contest</h4>
Most contests expect <b>Cabrillo</b> log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester.
<br>In case you want to use external Cabrillo program you have to make ADIF export of qsos</b>
and then use another program.</p><p>
</br>
I found nice <b>adif2cabrillo</b> program for Linux from <a href="http://users.telenet.be/on4qz/a2c/index.html" target="_blank">http://users.telenet.be/on4qz/</a> that supports ADIF importing.
</p></p>Starting is bit complicated:
</br>You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile
it.</br>
Then there are no templates for different contests. You have to create them, but after that it serves you well!
It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected.
</p>
<p>
<h5>ADIF exports fields to right tags.</h5>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;001<br>
&lt;RST_RCVD:3&gt;599&lt;SRX:3&gt;002<br>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;003&lt;STX_STRING:2&gt;SA<br>
@ -138,19 +232,7 @@ ADIF exports fields to right tags.<br><br>
HTML export will look like this:<br>
<img src="img/contest_html_export.png">
</p>
<p>
</br>
Most contests expect <b>Cabrillo</b> log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester.
<br>In case you want to use external Cabrillo program you have to make ADIF export of qsos</b>
and then use another program.</p><p>
</br>
I found nice <b>adif2cabrillo</b> program for Linux from <a href="http://users.telenet.be/on4qz/a2c/index.html" target="_blank">http://users.telenet.be/on4qz/</a> that supports ADIF importing.
</p></p>Starting is bit complicated:
</br>You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile
it.</br>
Then there are no templates for different contests. You have to create them, but after that it serves you well!
It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected.
</p>
<p align=center><img src=img/line.png></p>
<br>
<table width="100%" border="0" cellpadding="2" cellspacing="2">

View File

@ -34,9 +34,9 @@
<br>There are some additional startup parameters that you can use with command terminal, or add them to your startup menu parameters of cqrlog.
Those parameters can be listed in command terminal starting cqrlog as: cqrlog -h , or: cqrlog --help
<br><br><img src=img/h0.png border=0>
<br><br>Starting with <b>--remote</b> or <b>-r</b> takes one letter argument <b>J</b>,<b> M</b> or <b>K</b> that is not case sensitive. Letters correspond quick control keys in NewQSO/File to start three remote modes.
<br><br>Starting with <strong>--remote</strong> or <strong>-r</strong> takes one letter argument <strong>J</strong>,<strong> M</strong> or <strong>K</strong> that is not case sensitive. Letters correspond quick control keys in NewQSO/File to start three remote modes.
<br>When one of these are assigned cqrlog will jump to selected remote mode 10 seconds after startup is complete.
<br><br>Starting with <b>--debug</b> takes one number (NR) usually<b> 1</b> to see full debug. Thtere are also some negative numbers in use to limit debug prints to certain functions. Mainly for developer usage.
<br><br>Starting with <strong>--debug</strong> takes one number (NR) usually<strong> 1</strong> to see full debug. Thtere are also some negative numbers in use to limit debug prints to certain functions. Mainly for developer usage.
</p>
<a name=ah1><h2><strong>Preferences</strong></h2>
@ -101,9 +101,11 @@
<strong>Grayline offset</strong> - sometimes the gray line position is not accurate.
You can set your own correction.
<br><br>
<strong>Great circle </strong> Short and Long path line plotting may be adjusted here. Plotting step is decimal degrees &gt; 0.0 and &lt; 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value &gt; 0 and &lt; 40.
<strong>Great circle </strong> Short and Long path line plotting on Grayline map may be adjusted here. Plotting step is decimal degrees &gt; 0.0 and &lt; 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value &gt; 0 and &lt; 40.
<br>You may test different values if you like. If Columns are left empty the default values 0.1 and 10 are replaced.
<br>Color for Short- and Longpath lines can be selected, as well as the line plot width (1 -5 pixels)
<br>If rotor control is used also beam heading path may be plotted on Grayline map. Color, plot line width and length may be adjusted.
<br><b>Note:</b>At N and S polar areas beam length may be cutted to avoid false plotting. Then reduce the lenght of beam line (fixes to calculation routine are welcome)
<br><br>
<strong>Check for newer version of DXCC tables after program startup</strong></a> - if checked,
CQRLOG will check if any update of the country files is available. If a new version is found,
@ -171,7 +173,7 @@
QSO appears in this list immediately after logging, however the refresh procedure is
quite slow. To save time, keep this box unchecked. </br>
The <strong>'Skip over mode and frequency when radio is connected'</strong> is very important if the radio control is active.</br>
The <strong>'Enable auto search on HamQTH.com/QRZ.COM'</strong> switches on the automated search
The <strong>'Enable auto search on HamQTH.com/QRZ.COM/QRZCQ.com'</strong> switches on the automated search
for HamQTH/QRZ callbook data for any worked station. This option does the same as F6 on the
logging screen, however it can be rather slow depending on the HamQTH.com/QRZ.COM server
availability.</br>
@ -208,48 +210,92 @@
Checked bands are visible in both statistics appearing at the bottom of logging screen
(bands/modes of the actual logged station) and main DXCC, WAZ and ITU zones statistics.
It also affects the Challenge points at the bottom of the DXCC statistics.<br>
Pressing button <b>frequencies</b> band, and mode limits within bands, can be set.
Pressing button <strong>frequencies</strong> band, and mode limits within bands, can be set.
</div><br>
<img src=img/h9b.png border=0><br><br>
<p align=center><img src=img/line.png></p>
<a name=ah7><h2><strong>TRX Control</strong></h2></a>
<img src=img/h10.png border=0><br><br>
<div align=justify>
<br><br><b> Note: </b>Running same time CQRLOG and other software that uses rig's CAT control can not be done by just setting rig same parameters to both programs.
<br>That causes problems. See this document for more information: <a href="https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf">https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf</a>
<br><br><b>Note: </b>CQRLOG supports operating with two TRX radios but only one can be active at a time.
<br>Running same time CQRLOG and other software that uses same rig's CAT control can not be done by just setting rig same parameters to both programs.
That causes problems. See this document for more information: <a href="https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf">https://github.com/OH1KH/cqrlog/blob/loc_testing/compiled/setting_rigctld_for_all_programs.pdf</a>
<ul><li><strong>Note: </strong>CQRLOG supports operating with six Rigs but only one can be active at a time.
</li></ul>
<strong>Path to rigctld binary</strong> This tells Cqrlog from where to find rigctld that is a part of Hamlib. That is important for two
reasons.
<br>1st The rig model list is loaded from rigctld when preferences open. That makes model list to be always up to date and Cqrlog
supports always all rigs that current rigctld can support.
<br>2nd rigctld is started when Cqrlog starts (most of cases). Writing whole path makes rigctld to be found also the when it is not found
from default path.
<ul><li><strong> Note: </strong>Usuallly rigctld is found from /usr/bin, but if you have compiled it by yourself from source it may default to /usr/local/bin
</li></ul>
<strong>Nr of radios:</strong> With this you can select how many radios Cqrlog will support (Max 6, now).
<br><br>
<strong>Radio one, desc:</strong> is a description you'll see in TRX control window. It is only
descriptive text, you can write whatever you want.<br><br>
<strong>Host:</strong> computer where rigctld is running, localhost is fine for most cases. <br><br>
<strong>Name:</strong>This is the radio name that you will see in combo box selector lists: TRXControl, Prefrences/TRXControl, Modes, CW interface.
If rig is not defined, means rig Model is empty, you will see "None" here. If you want to remove existing rig definition select it from selector, then clear
rig Model manually using delete key and change selector to another rig, or close prfereces with "OK" button.
<br>This will remove also rig's Modes and CW interface definition from configuration file. Next time you select deleted rig Cqrlog will load all defaults to settings.
<ul><li><strong>Note: </strong>If you have 3 rigs and you delete rig #2 Cqrlog does not reorder selection list. Your rig #3 stays as 3rd in
selector list and #2 becomes "None"
</ul></li>
<strong>Host:</strong> computer where rigctld is running, localhost is fine for most cases but can be IP address of another computer where
rigctld is running (I.E. even over local network or internet) <br><br>
<strong>RIG model:</strong> choose your radio model from the list.
<br> Rig models below 10 (Dummy, NET rigctld, FLRig, TRXManager) are using TCP communication and so the <strong>Device</strong> as well
as <strong>Radio serial parameters</strong> do not need settings.<br><br>
as <strong>Radio serial parameters</strong> do not need settings.
<br><br>
<strong>Device:</strong> device which the radio is connected to. /dev/ttyS0 is COM1, /dev/ttyS1
is COM2 etc. If you use USB to serial interface, the device will usually be /dev/ttyUSB0
for COM1 etc. If you are using Ubuntu or Debian, <strong>you have to be member of the dialout users
group</strong> to have rights to the serial ports.<br><br>
<strong>Poll rate:</strong> specifies how often CQRLOG should read data from rigctld. 500 milliseconds
is fine.<br><br>
group</strong> to have rights to the serial ports.
<ul><li><strong> Note: </strong>When connecting to rigctld emulator that imitates a rig via TCP connection the IPaddress and port may be written here like: 192.168.60.1:1234
</li><li><strong> Note: </strong>With recent rigctlds you can use also names in /dev/serial/by-id/ folder. That way the device name does not change
like it often happens if you reorder USB wires in PS's sokets.
<br>(I.E my ci7300 shows out as /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7300_03003483-if00-port0 )
</li></ul>
<strong>Poll rate:</strong> specifies how often CQRLOG should read data from rigctld. 500 milliseconds is defaut.
If your rig is old and slow values 1000 - 3000 may work better.
<br><br>
<strong>Port number</strong> is the number of the port used to communicate with rigctld.
Default value is 4532. The second radio, has to have a different port e.g. 4533.<br>
<br><strong>Extra command line arguments</strong> usefull when you have to specify more parameters to
rigctld. E.g. CIV address (--civaddr=ID, where ID is the CIV address).<br><br>
<strong>Run rigctld when program starts</strong> is usually checked but when rig model #2 <strong>Hamlib Net Rigctld</strong> is used then it is unchecked and disabled because with that rig setting we are trying to connect external rigctld. Either in same PC or in network.
<br>If rig model #1 <b>Hamlib Dummy</b> is selected <strong>Run rigctld when program starts</strong> is forced to be checked. This allows testing and simulated operations without rig CAT control.
<br><br><strong>Use \chkvfo</strong> is normally checked. Then cqrlog tries to find out is rigctld started with parameter "--vfo" because that changes rigctld command format. Uncheck of this disables this function. Use it in case of problems.
<br><br><strong>Serial port parameters</strong> Use the manual of your rig, please choose the correct options.
Default value of rigctld is 4532.
<br><br>
<strong>Extra command line arguments</strong> usefull when you have to specify more parameters to
rigctld. E.g. CIV address (--civaddr=ID, where ID is the CIV address) or similars. See rigctld man page for supported parameters.
<br><br>
<strong>Use CWR insted of CW</strong> means that mode CW will use reverse sideband in receive.
<br><br>
<strong>Run rigctld when program starts</strong> is usually checked but when rig model #2 <strong>Hamlib Net Rigctld</strong> is used then
it is unchecked and disabled because with that rig model we are trying to connect externally running rigctld. Either in same PC or in network.
<br>If rig model #1 <strong>Hamlib Dummy</strong> is selected <strong>Run rigctld when program starts</strong> is forced to be checked.
This allows testing and simulated operations without rig with CAT control.
<ul><li><strong> Note: </strong>If you use Cqrlog without connected rig it may be usefull to select rig model #1. Then you can open TRXConrol
window and set bands, modes and frequency from there that might be more convinient than selecting them from NewQSO window.
<br>Model Hamlib Dummy starts default from 145MHz frequency. Seeing that in TRXControl window tells you that Dummy rig is running.
</li></ul>
<strong>Use \chkvfo</strong> is normally checked. Then cqrlog tries to find out is rigctld started with parameter "--vfo" because
that changes rigctld command format. Uncheck of this disables this function. Use it in case of problems. This may be default ON in future
Hamlibs version > 5.
<br><br>
<strong>Serial port parameters</strong> Use the manual of your rig, please choose the correct options.
Very often it is much better to specify only serial speed and leave other options as default.
Default value means that the settings from HamLib will be used.<br>
Default value means that the default settings from HamLib will be used. That should be fine in normal cases.
<br><br>
<strong>Rig pwr ON cmd</strong> When checked Cqrlog will send power ON command at startup to rig if rig can support power commands.
<br><br>
<strong>Set UTC to Rig</strong> When checked Cqrlog will send "set_clock" command with current UTC time to rig on next full minute change after initialization.
<br><strong>Note:</strong> All rigs do not support set_clock command.
<br><br>
<strong>Compound poll</strong> When checked Cqrlog will send rig poll command as one line "+f +m +v". That is Cqrlog default.
<br>When unchecked every command will be sent with LineEnding, I.E. in it's own line. This may help poor rigctld emulators like WFview.
<br><br>
<strong>User defined TRXControl buttons</strong> can be defined here. Your defined buttons will be shown in the TRX Control window after
you select this option using the <strong>Preferences menu/Show Usr buttons</strong> in the <strong>TRXControl window.</strong>
<br>
<strong>User defined TRXControl buttons</strong> can be defined here. Your defined buttons will shown in the TRX Control window after
you drop select this option in using the <strong>Preferences tab in the TRXControl</strong> window. For setting up buttons use
<strong>preferences</strong> option from TRXControl drop select option <strong>Preferences</strong>. From TRX Control tab you will find group
box named <strong>User defined TRX control buttons</strong>.
The first column is button name shown (4char max). In the same area the second column is the command(s) to execute. Definition can consist one
command or several in a queue, rigctld commands may be used or if definition starts with word "<strong>run</strong>" (without quotes) it can be a program or
script name with full file path for your computer.
The first column is button name shown (4char max). In the same area the second column is for the command(s) to execute.
Definition can consist one command or several ones in a queue.
<br> rigctld commands may be used directly or if definition starts with word "<strong>run</strong>" (without quotes)
it can be a program or script name with full file path.
<br><ul> <li>
<strong>Note:</strong> Rigctld supports raw command <strong>W</strong>. Parameter for it is the rig cat command in bytes. Prefix<strong> \0x</strong> must be added for Hex values. Usr1 command in picture Sets IC7300 to 60m CW with 500Hz filter and reduces output power to leagal limit with raw command.
</li> <li>
@ -279,7 +325,6 @@
<br>Ctrl-0 will disable XIT.
<br>Ctrl-9 has a random value 0-990Hz that is added to setting if split is up. If split is down it is subtracted.<br>
</div>
<br>
<img src=img/h100.png border=0> <img src=img/h100b.png border=0><br>
@ -289,11 +334,11 @@
Setting up Rotator control is very similar to setting up Rig control. Rotor models 1 and 2 (Dummy, NET rotctld ) are using TCP communication and so the <strong>Device</strong> as well
as <strong>Rotor serial parameters</strong> do not need settings.<br><br>
<br>
<br>If <b>Use rotctld \dump_state info for limits</b> cheked rotctld asks turning limits AzMin and AzMax values from rotctld with command <strong>'+\dump_state'</strong>.
<br>If <strong>Use rotctld \dump_state info for limits</strong> cheked rotctld asks turning limits AzMin and AzMax values from rotctld with command <strong>'+\dump_state'</strong>.
That makes user possible to set turning limits other than rotator default turn with
<strong>Extra command line arguments</strong>. Using string <strong> --set-conf=min_az=10,max_az=355</strong> you can set rotator so that cqrlog will never turn it below 10deg or over 355deg.
<br>Using negative value at az_min causes Cqrlog set it's 0degrees "P"-command to given negative value (while still displaying 0). I.E if az_min=-180 Cqrlog will use turning commands from "P-180" to "P180".
<br>Without negative az_min or when checkbox <b>Use rotctld \dump_state info for limits</b> is not set Cqrlog sends commands in usual range "P0 to "P360".
<br>Without negative az_min or when checkbox <strong>Use rotctld \dump_state info for limits</strong> is not set Cqrlog sends commands in usual range "P0 to "P360".
</p><p>Some rotators have turn from -180deg-0deg-180deg (south stop), like Hamlib Dummy test rotator.
<br>Most of rotators have turn 0deg - 360deg.
<br>Some may turn 0deg - >360 deg. With them cqrlog never drives values over 360, but reads position right if rotor sends over 360 deg value (sent_value-360 = cqrlog display).
@ -305,32 +350,45 @@ Setting up Rotator control is very similar to setting up Rig control. Rotor mode
You can define your own favourite frequencis and swich between them directly in New QSO window using ALT+V (Mem down)
and
ALT+B (Mem up). These keys are used in N6TR clones to switch between bands.<br>
You can also switch between memory frequencies with TRXControl's <b>M up</b> and <b>M dwn</b> buttons and set rig frequencies
You can also switch between memory frequencies with TRXControl's <strong>M up</strong> and <strong>M dwn</strong> buttons and set rig frequencies
by double clicking rows in TRXControl's Add/Modify memory list.
</p>
<img src="img/h121.png"><br><br>
<a name=ah8><h2><strong>Modes</strong></h2></a>
<img src=img/h11.png border=0><br><br>
<p>Here you can set up the default bandwidth for any of the supported modes (CW - SSB - RTTY - AM - FM).
If your radio is tuned to the corresponding band segment or if you switch the mode on the radio
control panel, CQRLOG will change the bandwidth to the desired value. The bandwidth can be
changed at any time, however a program restart will probably be needed to make the changes
take effect.<br>
Some <strong>TRX like ICOM don't have support for this in HamLib. To get mode settings work, set
all values to 0 (zero).</strong>
</p><p><strong>User definable digital modes</strong> can be set up in a separate box. Use comma
as a separator, ie. MYMODE1,MYMODE2 etc.<br>
user should add digital modes (submode names) exactly as written in this table <a href="https://adif.org/312/ADIF_312.htm#Mode_Enumeration">ADIF.org: Mode_Enumeration</a>
<p>Here you can set up the default bandwidth for any of the supported modes (CW - SSB - DATA - AM - FM) for rig selectd from <strong>Radio </strong>
selector list box.
If your rig is tuned to the corresponding band segment or if you switch the mode from TRXControl buttons CQRLOG will change the bandwidth
to the defined value.
<br>Setting 0 (zero) to values means that rig should use default bandwidth. This is good selection also when rig can not support bandwidth
settings (like some ICOM rigs).
<br>Setting -1 here means that bandwidth setting must be kept as it was. This also needs that rigctld supports negative value (version >= 4).
<br><br>
<strong>Log mode </strong>This is the data mode you most often use. Defaulting to RTTY. From mode selector you can select another mode.
If mode does not exist you have to define it in <strong>User defined digital modes</strong> and then come back to mode selector.
<br>
This mode efftects to DXCluster window's spot line coloring (See <a href="h1.html#ah11">DX Cluster</a> ) and also sets defined mode if DX spot line
is double clicked.
<br><br>
<strong>CAT cmd </strong>This is the rigctld mode command that needs to be sent to rig to get rig to proper mode for <strong>Log mode</strong>.
<br><br>
<strong>Use also reverse (cat -> rig) </strong>This defines if Cqrlog should show <strong>Log mode</strong> when rig is set to <strong>CAT cmd </strong>
mode. This may have a pitfall. If your settings are for example SSTV and USB then Cqrlog will select mode as SSTV also when you are working USB fone qsos.
<br>Usually this needs not to be set if DATA qsos are worked with external program using Cqrlog remote modes.
<br><br>
<strong>User defined digital modes</strong> can be set up in a separate box. Use comma as a separator, ie. MYMODE1,MYMODE2 etc.<br>
User should add digital modes (submode names) exactly as written in this table <a href="https://adif.org/312/ADIF_312.htm#Mode_Enumeration">ADIF.org: Mode_Enumeration</a>
If mode is missing from <strong>NewQSO/mode</strong> selection list and not added to <strong>User defined digital modes</strong> it may prevent ADIF import causing "wrong mode" error.
</p><p>
<strong>Note:</strong><br>
Cqrlog uses internally modefied mode name. We call it here <strong>CqrMode</strong>. CqrMode is created from ADIF mode and submode with conversion table. CqrMode is mainly ADIF submode if it exist, with some exceptions.
<ul><li>
<strong>Note:</strong> Cqrlog uses internally modified mode name. We call it here <strong>CqrMode</strong>. CqrMode is created from ADIF mode and
submode with conversion table. CqrMode is mainly ADIF submode if it exist, with some exceptions.
<br>Cqrlog will create four files in ~/.config/cqrlog folder for this use if they do not exist. One is a brief <strong>README_modefiles</strong> explaining three other files purposes.
<br><br>If files exist they are not overwritten keeping possible user changes there. How ever user must do backups by himself if files are edited from original format.
</li></ul>
If files exist they are not overwritten keeping possible user changes there. How ever user must do backups by himself if files are edited from original format.
These files apply to all logs created. They are not log based.
<ul>
<li><strong>submode_mode.txt</strong>
<ul><li>
<strong>submode_mode.txt</strong>
<br> This file holds submode=mode pairs used to convert incoming mode+submode pair to CqrMode that mainly is the submode.
<br><br> All pairs must be in uppercase format. User can add or delete mode pairs with text editor if definition at
<br> <a href="https://adif.org/312/ADIF_312.htm#Mode_Enumeration">ADIF.org: Mode_Enumeration</a> changes.
@ -391,23 +449,29 @@ for each operation.
</table>
<br><br>
This option allows an easy setup of the log fields to be exported into ADIF or HTML format.
Only checked fields are exported. The 'Column' option names columns at header line. 'Width' option denotes the column width in approx. count of 16px characters.
<br>Only checked fields are exported. The 'Column' option names columns at header line. 'Width' option denotes the column width in approx. count of 16px characters.
Both options affect only for the HTML export.
<br>The SAT mode field is not stored in the database but instead calculated on the fly from frequency and RX frequency and for SAT QSOs only.
<br>Width setting is ignored if "HTML auto column width" is checked when longest text in column (column name or data) sets the column width.
<br>Distances are not exported when doing log backup at cqlog closing phase. They will be calculated and exported (if selected) in ADIF, HTML and QSL label printing.
<br><br>Distances are not exported when doing log backup at cqlog closing phase. They will be calculated and exported (if selected) in ADIF, HTML and QSL label printing.
Calculation of distances requires that preferences/station/locator is set and applied (automatic) to every qso and that at least 4 digit locator
(in case "ll" is added as 5 and 6th char to get the center of grid) of destination station logged. Sometimes importing logs from other logging program may leave own station locator unset. In this case QSO list/File/Group edit must be used for updating "my locator" field.
(in case "ll" is added as 5 and 6th char to get the center of grid) of destination station logged.
<br>Sometimes importing logs from other logging program may leave own station locator unset. In this case QSO list/File/Group edit must be used for updating "my locator" field.
<br><br>
<a name=ah11><h2><strong>DX cluster</strong></h2></a>
<img src=img/h14.png border=0><br><br>
This dialog allows an easy setup of the DX cluster spot filtering. Check the bands you want
to display. If you want to supress (ie. filter out) spots for some DX countries, put
its prefixes in the box below. Use a semicolon as a separator.
<strong>Show only spots</strong><br>
This dialog allows an easy setup of the DX cluster spot filtering. Check the bands and modes you want
to display.
<br><br><strong>Note: </strong>Mode checkboxes here refer to <a href="h1.html#ah8">Preferences/Modes</a> set for every rig separately, and DATA refers to setting of "Log mode" there.
<br>Each mode's frequency limits are set at <a href="h1.html#ah6">Preferences/Bands/Frequencies</a>.
<br>Without proper setting of these spot filtering can not work and may not drop Spots you wish to disable, or may not show Spots you want to see.
<br><br> If you want to supress (ie. filter out) spots for some DX countries, put
those prefixes in the box below. Use a semicolon as a separator.
<p>
<strong>Callsign alert</strong> - allows you to enter callsigns that you are interested in. Eg. some special station for an award etc.<br>
<strong>Run this command when callsign is spotted:</strong> will run select command when any of callsigns you've enter appears in the cluster.<br>
<strong>Callsign alert</strong><br>Allows you to enter callsigns that you are interested in. Eg. some special station for an award etc.<br>
<strong>Run this command when callsign is spotted</strong><br>Will run select command when any of callsigns you've enter appears in the cluster.<br>
E.g. use this if you want to see small window with information:<br><br>
<i> zenity --info --text='Callsign $CALLSIGN detected at $FREQ $MODE' --title=Info</i><br><br>
You have to install zenity, first. <i>(Thans to SV2RCK for the tip!)</i>
@ -424,10 +488,11 @@ This is also possible with "notify-send". The display duration is set in ms (-t
</p>
<p>
<strong>Show country name in the DX cluster spot</strong> - next to every spot, you will se the coutry name of the DX station<br>
<strong>Send these commands to telnet DXCluster when connected</strong> - one or several commands with comma separated can be sent to DXCluster after connect is initialized.
If your command(s) have space(s) between, like "<strong>acc/spot by_zone 14,15,16 and not (on hf/data or on hf/rtty)</strong>" it is recommended to close each command between double quotes.<br>
<strong>Connect to DX cluster after program startup</strong> - after log is opened, cqrlog will connect to your default cluster. Please remember that
<strong>Show country name in the DX cluster spot</strong><br>Next to every spot, you will se the coutry name of the DX station<br>
<strong>Send these commands to telnet DXCluster when connected</strong><br>One or several commands with comma separated can be sent to DXCluster after connect is initialized.
If your command(s) have space(s) between,
<br>like "<strong>acc/spot by_zone 14,15,16 and not (on hf/data or on hf/rtty)</strong>" it is recommended to close each command between double quotes.<br>
<strong>Connect to DX cluster after program startup</strong><br>After log is opened, cqrlog will connect to your default cluster. Please remember that
username and password(if needed) have to be filled in the cluster list.
</p>
<p align=center><img src=img/line.png></p>
@ -639,18 +704,22 @@ There are no known dependencies issues.<br><br>
<br>Normally you do not need to touch eQSL addresses. But in case something changes at eQSL web pages it might be possible to fix it here without rebuilding cqrlog program.<br><br>
<a name=ch1><h2><strong>CW interface</strong></h2></a>
<img src="img/h95.png"><br><br>
Choose your preferred CW interface for radios you have. There are 5 options: None, WinKeyer USB,
cwdaemon, K3NG keyer and HamLib. We strongly recommend Winkey USB by Steve Elliot, K1EL,
which provides 'all in one' keying, including one of most advanced paddle keyers available.
cwdaemon should be seen as a backup option with many limitations, which may need
a custom linux kernel to avoid sloppy CW at speeds above 25 WPM. If cwdaemon is used,
only keyboard keying is possible.
<br>If you use <strong>same keyer for both rigs</strong>, and it is not HamLib, you can check <strong>Do not reset when switch radios</strong> to prevent keyer reset (that sets CW speed to default).
Choose your preferred CW interface for radio you have selected from <strong>Radio</strong> selector list.
<br>There are 5 options: None, WinKeyer ,cwdaemon, K3NG keyer and HamLib in <strong>CW interface type</strong> selector list.
<br>We strongly recommend <strong>Winkeyer</strong> by Steve Elliot, K1EL, which provides 'all in one' keying, including one of most
advanced paddle keyers available.
<br>When checking <strong>Use potentiometer's CW speed</strong> Cqrlog does not send <strong>Default CW speed</strong> command to keyer
when it is initialized.
<br><br>
Detailed setup of the CW devices is here:
<strong>cwdaemon</strong> should be seen as a backup option with many limitations, which may need a custom linux kernel to avoid
sloppy CW at speeds above 25 WPM. If cwdaemon is used, only keyboard keying is possible.
<br><br>If you use <strong>Do not reset when switching radios</strong> it prevents keyer reset (that sets CW speed to default).
This option does not apply with Hamlib keyer in use.
<br><br>
Detailed setup of the CW devices are here:
<ul>
<li><a href=wkusb.html><strong>Winkeyer</strong></a></li>
<li><a href=cwd.html><strong>cwdaemon</strong></a>
<li><a href=wkusb.html><strong>Winkey USB</strong></a></li>
<li><a href="http://blog.radioartisan.com/arduino-cw-keyer/" target="_blank">
<strong>K3NG</strong></a></li>
<li><a href=cwh.html><strong>HamLib</strong></a>
@ -683,9 +752,9 @@ There are no known dependencies issues.<br><br>
Setting wsjt-x interface is mainly same as setting fldigi. How ever communication is done via UDP frames and so the IP address and Port must be specified.
<br>Default values are <strong>127.0.0.1</strong> or <strong>localhost</strong> for address and <strong>2237</strong> for port. These are set in wsjt-x settings/reporting and if changed there, must also to be changed here.
<br>
Address can also be other PC's IP address if wsjt-x is running in different networked PC than cqrlog, or even<b> 0.0.0.0</b> when cqrlog listens all transmits from every wsjt-x in network.
Address can also be other PC's IP address if wsjt-x is running in different networked PC than cqrlog, or even<strong> 0.0.0.0</strong> when cqrlog listens all transmits from every wsjt-x in network.
<br><br>You can also use a multicast address for both <b>wsjt-x/settings/Reporting/UDP Server</b> and <b>cqrlog/preferences/fldigi/wsjt interface/wsjt addr</b>. Cqrlog will handle ip addresses starting with "239." as multicast addresses.
<br><br>You can also use a multicast address for both <strong>wsjt-x/settings/Reporting/UDP Server</strong> and <strong>cqrlog/preferences/fldigi/wsjt interface/wsjt addr</strong>. Cqrlog will handle ip addresses starting with "239." as multicast addresses.
<br>With multicast you are able to run several programs listening to wsjt-x udp broadcasts at same time. To start with multicast try multicast group address "239.255.0.0" for both cqrlog and wsjt-x (and also other programs needed to listen wsjt-x)
<br><br>
Using <strong> WB4 chk starts from</strong> it is possible to limit log search starting from given date for callsign and/or locator.
@ -734,9 +803,9 @@ There are no known dependencies issues.<br><br>
<br><strong>Note:</strong> Setting html browser here affects only to call attachments and it can be different than system default, or different than selected at preferences/program tab.
<br><strong>Hint:</strong> If you click Web browser name edit box a file open dialog opens and you can navigate to your browser. If you place cursor on Web browser name edit box, press left button and keep it down, you can paint exisiting text and use delete button to clear it and type new text.
<a name=ch5><h2><strong>Callbook support</strong></h2></a>
CQRLOG supports <a href="http://HamQTH.com">HamQTH</a> and <a href="http://qrz.com">QRZ.com</a>
CQRLOG supports <a href="http://HamQTH.com">HamQTH</a>, <a href="http://qrz.com">QRZ.com</a> and <a href="http://qrzcq.com">QRZCQ.com</a>
callbooks but only access through the XML interface is supported. HamQTH has a free interface,
for QRZ.com you have to pay an annual fee.<br><br>
for QRZ.com and QRZCQ.com you have to pay an annual fee.<br><br>
<img src="img/h1112.png"><br><br>
<a name=ch6><h2><strong>RBN support</strong></h2></a>
@ -767,17 +836,19 @@ There are no known dependencies issues.<br><br>
</ul>
<li><strong>Delete old information after XX seconds</strong> The dots won't stay on the map forever.
180 seconds (3 minutes) is a good default value.
<br><b>Note:</b> Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.</li>
<br><strong>Note:</strong> Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.</li>
</ul>
<br><br>
<a name=ch7><h2><strong>Online log upload support</strong></h2></a>
CQRLOG supports online log upload to <a href="http://HamQTH.com">HamQTH</a>,
<a href="https://secure.clublog.org/loginform.php">ClubLog.org</a> and
<a href="http://hrdlog.net/">HRDLOG.net</a><br>
<a href="https://secure.clublog.org/loginform.php">ClubLog.org</a>,
<a href="http://hrdlog.net/">HRDLOG.net</a> and
<a href="https://n1mmwp.hamdocs.com/appendices/external-udp-broadcasts/#contact">N1MM+ UDP contact messages</a><br>
<img src="img/h1116.png"><br><br>
Both ClubLog and HamQTH need a username and password, Clublog also needs the email address
used when you registered. HRDLog.net needs only user name and the code you got by e-mail.
N1MM+ format UDP messages require a hostname/IP and port number in format <i>hostname:port</i> (e.g. 127.0.0.1:5444).
You can set different color for each service. This color will be used for status messages
which will inform you about upload progress.
<strong>Upload QSO data immediately after save, update or delete</strong> means that every
@ -789,6 +860,7 @@ There are no known dependencies issues.<br><br>
<a name=ch8><h3>How to get it to work?</h3></a>
<ul>
<li>check if you have set correct username, password (email, Code)</li>
<li>in case Url address of online log API has changed you are able to change it here</li>
<li>export all data from the log to ADIF file</li>
<li>import this adif file to the website of online log you are going to use
(if you are using HamQTH, please wait untill the email about a successful import arrives)

View File

@ -60,13 +60,13 @@
<td> </td>
</tr>
<tr>
<td width="35%">Ctrl-1...Ctrl-9</td>
<td width="35%">Ctrl-1...Ctrl-9<br><br></td>
<td width="65%">Set split using XIT if rig supports it. Value 0 - 9999Hz UP/DOWN
<br>Ctrl-9 will add random value 0 - 990Hz to setting. Subtract if split is DOWN
<br>Keys work also when TRXcontrol window is active</td>
</tr>
<tr>
<td width="35%">Ctrl-0</td>
<td width="35%">Ctrl-0<br></td>
<td width="65%">Disables XIT
<br>Key works also when TRXcontrol window is active</td>
</tr>
@ -293,6 +293,54 @@
</tbody>
</table>
<p align=center><img src=img/line.png></p>
<strong>When "Contest" window is active:</strong><br><br>
<table>
<tr>
<td valign="top"><img src="img/bulb.png"></td>
<td bgcolor=ccffff width="100%">
<strong><font color="blue">The "Contest" is the screen for fast qso input and some contest related properties</font></strong>
</td>
</tr>
</table>
<br><br>
<table width="100%" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td width="35%">ESC<br><br></td>
<td width="65%">1x Stops CW memory sending<br>2x Returns cursor to Call column<br>3x Empty all fields and prepare program for a new QSO</td>
</tr>
<tr>
<td width="35%">F1..F10<br></td>
<td width="65%">Sends CW memories 1..10 when rig is in CW mode<br>Call voice keyer script 1..10 when rig is in phone mode</td>
</tr>
<tr>
<td width="35%">Shift+F1<br></td>
<td width="65%">Starts/stops Memory1 (CW or phone) repeat timer when S&amp;P is enabled<br>Writing to call column or 1xESC stops repeat sending (in case of CW memory)</td>
</tr>
<tr>
<td width="35%">PgUp</td>
<td width="65%">CW Speed +2 WPM (QRQ)</td>
</tr>
<tr>
<td width="35%">PgDn</td>
<td width="65%">CW Speed -2 WPM (QRS)</td>
</tr>
<tr>
<td width="35%">Ctrl-1...Ctrl-9<br><br></td>
<td width="65%">Set split using XIT if rig supports it. Value 0 - 9999Hz UP/DOWN
<br>Ctrl-9 will add random value 0 - 990Hz to setting. Subtract if split is DOWN</td>
</tr>
<tr>
<td width="35%">Ctrl-0<br></td>
<td width="65%">Disables XIT</td>
</tr>
<tr>
<td width="35%">Ctrl-A<br></td>
<td width="65%">Sets callsign to Band map (for later return with double click)</td>
</tr>
</tbody>
</table>
<p align=center><img src=img/line.png></p>
<a name="ah17"><h2><strong>New QSO (online logging)</strong></h2></a>
While logging online (during your QSO), date, start and end time are

View File

@ -31,10 +31,10 @@
<a name="ah19"><h2><strong>DX Cluster Operation</strong></h2></a>
<img src="img/h4.png" border="0"><br><br>
There are two basic options - web cluster and the usual DX cluster with
telnet options. The web cluster method is good for monitoring. There is no
internal node setup, but you can't spot. CQRLOG downloads the spots at
telnet options. The <b>web cluster</b> method is <b>good for monitoring</b>. There is no
internal node setup, <b>you can not spot</b>. CQRLOG downloads the spots at
regular intervals, the interval is fixed and cannot be changed.
<br><br>Telnet cluster is fully featured. You can also set up your
<br><br>Telnet cluster is <b>fully featured</b>. You can also set up your
preferences on the node. The Command line box is used for all commands,
settings etc. with one exception - the Tilde key (~) is used for spotting.
The color coding and spot filtering is set up in the
@ -42,6 +42,10 @@ The color coding and spot filtering is set up in the
Cluster node by simply clicking the 'Connect' button. You should see the cluster node
messages indicating progress. You can enter any command into the 'Command' field
(ie. SH/DX to display last spots, SH/U to see the users connected to the node etc.).
<br><br><img src="img/h4f.png" border="0"><br><br>
When Telnet connection is active the "F-keys" tab becomes visible. There you can define 10 commands to be sent to DXCluster by pressing corresponding
<b>F1 -F10 key while keeping also Shift key pressed</b>.
<br>
<br> Double click with mouse left on DX spot line applies DX callsign to NewQSO and sets rig frequency to spot QRG.
If you have checked <b>NewQSO/Auto</b> checkbox and set mode frequencies at <b>preferences/bands/frequencies</b> also right mode will be set to rig.
<br>If there is additional info available on spot line it is copied to clipboard. You can set cursor to desired NewQSO field and apply info from clipboard with Ctrl-V.

View File

@ -115,22 +115,26 @@ The 'Save' button exports the statistics to an ASCII text file.
The DOK statistics give you an overview of your collected German DOKs.
These statistic is derived from the DOK field of each logged contact.<br>
If a QSO record does not contain DOK information, the statistics do not reflect this fact.<br><br>
To resolve the DOK into a readable name, please activate in menu preferences - program the setting "Check for newer version of DOK database after program startup". This will download dok.csv and sdok.csv files to ~/.config/cqrlog/dok_data<br><br>
The option 'Show logged (S)DOKs only' will reduce the list, to show only worked DOKs and not all known DOks.<br><br>
The ComboBox 'DOK & SDOK' give you the option to see DOK&SDOK, only DOK and only SDOK.<br><br>
To resolve the DOK into a readable name, please activate in menu preferences - program the setting "Check for newer version of DOK database after program startup". This will download dok.csv and sdok.csv files to ~/.config/cqrlog/dok_data<br>
The option 'Show logged (S)DOKs only' will reduce the list, to show only worked DOKs and not all known DOks.<br>
The ComboBox 'DOK & SDOK' give you the option to see DOK&SDOK, only DOK and only SDOK.<br>
<strong>Caution: </strong> Be aware that the DOK statistic window will not open, when dok.csv and sdok.csv files are missing on ~/.config/cqrlog/dok_data.<br><br>
The 'Export to HTML' button exports the statistics to a HTML table file.<br><br>
The 'Export to HTML' button exports the statistics to a HTML table file.<br>
The 'Show station list' button will show a list of all stations behind the selected and confirmed DOKs.<br><br>
<img src="img/StationList.png" border="0">
<p>
The BIG SQUARE and COUNTY gives you band based report of worked Squares or Counties.<br>
With County the column filling must be excactly same with all similar counties. Count is based to compare and even one space in county name can make different results.<br>
The 'Save to...' button exports the statistics to a HTML file.<br><br>
<img src="img/SquareStat.png" border="0">
<img src="img/CountyStat.png" border="0"><br>
</p>
<p align=center><img src=img/line.png></p>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>

View File

@ -32,12 +32,13 @@
<p>Assuming that your CW interface is properly set up and working,
you can add and/or edit your CW messages.<br><br>
Set up your CW messages via Preferences/CW inteface/CW messages button.
<br> You can also access CW messages from the upper menu bar of the New QSO window.
<br> You can also access CW messages from the top menu of the New QSO window.
Click on the 'File' item and select CW Messages.<br><br>
<img src=img/h96b.png>&nbsp;&nbsp;<img src=img/h96.png><br><br>
Choose the <strong>CW Messages</strong> option. By using the form opened you can edit your CW messages that
will be sent when you press the corresponding <strong>F</strong>-key(s).
You can set up to 10 predefined messages. Save and load them from file for quick change of all messages.<br><br>
CW messages will be sent when you press the corresponding <strong>F</strong>-key(s) or click message buttons in <b> Memory keys </b> or <b> CW type </b> windows.
You can set up to 10 predefined messages in two sets.<br>
Set1 <b>"S&P"</b> is always default. Set2 <b>"Run"</b> is active when contest window is opened and checkbox "S&P" is <b>NOT</b> checked.<br>
Use buttons <b>Save</b> and <b>Load</b> for save/load both sets to/from file.<br><br>
<img src=img/h97.png><br><br><a name="predef">
There are some predefined macros which you can use in your messages:</a><br><br>
<table border="0" cellpadding="5" cellspacing="2" width="50%">
@ -57,8 +58,11 @@
<li>%h - greeting GM/GA/GE calculated from the %c station location time</li>
<br>
<li>%xn - contest exchange serial number</li>
<li>%xm - contest exchange message</li>
<li>%xns - contest exchenge serial number sends 9->N and 0->T</li>
<li>%xnr - contest exchange serial number received</li>
<li>%xnrs- contest exchenge serial number received sends 9->N and 0->T</li>
<li>%xm - contest exchange message</li>
<li>%xmr - contest exchange message received</li>
<li>%xrs - full contest exchange RST+SerialNR+Message sends 9->N and 0->T.<br>
(May be used always instead of %rs as if serNR and Message are empty just sends plain report.)</li>
</li><li> + or - in macro text will increase/decrease CW speed by 5WPM/one mark.
@ -67,7 +71,7 @@
<br> 1) Version of Hamlib must be at least Hamlib 4.1~git Last commit 2020-10-20 03:22:59 2020 +0000 SHA=8a769c
<br> 2) Do not use space(s) between text and +(or -) rigctld will add them I.E. "TU+++599---001"
<br> 3) Speed change works only with BKIN mode (not F-BKIN) and at the moment new Icom rigs (tested only ic7300)
</li>
<br> 4) Does not work if Hamlib CW buffering is used</li>
</ul>
@ -75,7 +79,14 @@
</tr>
</tbody>
</table>
</p><a name=mk1><br></a> <img src="img/misc8.png" name="8" width="500" height="85">
</p>
<p>
<img src=img/h96a.png><br>
<strong>Send hex bytes to keyer</strong>. Will send hex bytes to Winkeyer or K3NG allowing non charcter bytes to be sent from Cqrlog in case there sudden need to change some of keyer's settings.
<br>Consult your keyer's manual to find needed commands.
</p>
<a name=mk1><br></a> <img src="img/misc8.png" name="8" width="500" height="85">
</img>
<p><strong>Memory keys</strong> form has buttons PgUp and PgDn that are not configurable. They alter CW speed in same way as keyboard keys PgUp and PgDn that some, specially laptop computers, may not even have.
<br>When using <strong>Memory keys</strong>-form with mouse, or keyboard, you are able to lauch memories by mouse click or by <strong>F</strong>-key press from keyboard keys. Same with PgUp and PgDn, both are working, keys and mouse click.

View File

@ -1,4 +1,4 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
OS<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<head>
@ -36,34 +36,45 @@
<img src="img/h118b.png" name="8" width="320" height="360">
</img>
<p>
TRX Control window Shows current frequency and buttons allow change of Band, mode, memory and rig. Additional selections are User defined buttons, Power buttons, Vfo A and B buttons and memory information field.
TRX Control window shows current frequency and buttons that allow change of band, mode, memory and rig.
<br>Additional selections are User defined buttons, Power buttons, Vfo A and B buttons and memory information field.
<br>When pressing band selection button rig moves to that band using predefined frequency of currently active mode. Default frequencies and User buttons can be defined in <a href="h1.html#ah7">preferecences/TRX control</a>.
<br><br>You can select rig vfo with buttons <b>A</b> and <b>B</b> but there is no feedback what vfo is currenty used as Icom brand rigs do not support "Get_vfo" command.
</p><a name="m4"></a><p>If <b>M_up</b> or <b>M_dwn</b> are pressed or memory is selected by double click of memory list, the information text will show up to <b>Mem Info</b> field. If frequency is changed manually after that info text will disappear.
<br>If memory does not have info text (max 25chr) just <b>x of y</b> is displayed where x refers to memory order in Add/Modify memory list and y total amount of memories.
<b>None</b> (in red) indicates that there are no memory lines.
<br>With <b>P-on/off/stb</b> buttons current rig can be set ON, OFF or STANDBY (if it supports rigctld power commands).
<br>Default setting for power buttons is hidden. You can change it via dropdown menu "Preferences".
<br><br><b>M_up</b> and <b>M_dwn</b> buttons select next/previous entry from memory list. <b>M_Wri</b> adds entry to memory list from current rig frequency and mode and info field shows<b> "MW ok"</b>.
<br><br>You can change rig frequency by clicking frequency display. Then you can enter a new <b>MHz value</b> and press enter.
<br>You can also use mouse wheel to change frequency. One wheel step is 100Hz, Keeping <b>Shift key</b> pressed the step is 1kHz. Keeping <b>Ctrl key</b> pressed the step is 10kHz.
<br><br>
By clicking frequency display you can set a new frequency and click again (or press enter) to send command to rig.
<br>You can also use mouse roll to move frequency after first clicking the frequency display.
<ul><li>By default steps are 100Hz
</li><li>Keeping <strong>Shift key</strong> pressed while turning the roll steps are 1kHz
</li><li>Keeping <strong>Ctrl key</strong> pressed while turning the roll steps are 10kHz
</li><li>Keeping both <strong>Shift key</strong> and <strong>Ctrl key</strong> pressed while turning the roll steps are 1MHz
</li></ul>
You can select rig vfo with buttons <strong>A</strong> and <strong>B</strong> but there may be no feedback what vfo is currenty used (Icom brand rigs do not support "Get_vfo" command).
</p><a name="m4"></a><p>If <strong>M_up</strong> or <strong>M_dwn</strong> are pressed or memory is selected by double click of memory list, the information text will show up to <strong>Mem Info</strong> field. If frequency is changed manually after that info text will disappear.
<br>If memory does not have info text (max 25chr) just <strong>x of y</strong> is displayed where x refers to memory order in Add/Modify memory list and y total amount of memories.
<strong>None</strong> (in red) indicates that there are no memory lines.
<br>With <strong>P-on/off/stb</strong> buttons current rig can be set ON, OFF or STANDBY (if it supports rigctld power commands).
<br>Default setting for power buttons is hidden. You can change it via dropdown menu "Preferences". They are also hidden if rig can not support power commands.
<br><br><strong>M_up</strong> and <strong>M_dwn</strong> buttons select next/previous entry from memory list. <strong>M_Wri</strong> adds entry to memory list from current rig frequency and mode and info field shows<strong> "MW ok"</strong>.
<br><br>You can change rig frequency by clicking frequency display. Then you can enter a new <strong>MHz value</strong> and press enter.
<br>You can also use mouse wheel to change frequency. One wheel step is 100Hz, Keeping <strong>Shift key</strong> pressed the step is 1kHz. Keeping <strong>Ctrl key</strong> pressed the step is 10kHz.
Keeping both keys pressed the step is 1MHz.
<br>If you use mouse wheel the rig frequency is changed while turning. There is no need to press enter then. Just move mouse cursor away from frequency display.
<br><br><b>NOTE!!!</b> <br>Check <b>pereferences/TRXcontrol/Switch only between mode related memories</b><br>Cqrlog TRXcontrol memories are categorized by mode (groups). CW, SSB(=AM+USB+LSB+FM), RTTY(=RTTY+DATA+PKTLSB+PKTUSB+PKTFM)[no mode selector for PKT* but you may "M wri" them anyway].
So do not wonder if you get smaller amount of memories than in your list when pressing <b>M_up</b> and <b>M_dwn</b> with "Show mode related" checked.
<br><br>
<ul><li><strong>NOTE: </strong>Check <strong>pereferences/TRXcontrol/Switch only between mode related memories</strong><br>Cqrlog TRXcontrol memories are categorized by mode (groups). CW, SSB(=AM+USB+LSB+FM), RTTY(=RTTY+DATA+PKTLSB+PKTUSB+PKTFM)[no mode selector for PKT* but you may "M wri" them anyway].
So do not wonder if you get smaller amount of memories than in your list when pressing <strong>M_up</strong> and <strong>M_dwn</strong> with "Show mode related" checked.
</li></ul>
<img src="img/h122.png" name="9" width="393" height="367">
<img src="img/h121.png" name="10" width="373" height="367">
</img>
<br/>
<br>You can set rig by double click of an memory row in <b>Open memory list</b>. Similar action happen also in <b>Add/Modify memories</b>. The differense is that you can keep
<b>Open memory list</b> open while loggeing qsos etc. Where as <b>Add/Modify memories</b>, when open, blocks other functionality.
<br>While <b>Add/Modify memories</b> is open you can use buttons in right frame. Texts of buttons are quite self explaining.
<br>Deleting a memory line, or all lines, do not have any further warning questions (Are you sure?). In case you deleted something wrong just close window with <b>Cancel</b>. No changes are recorded then.
<br>Closing <b>Add/Modify memories</b> is done with buttons <b>OK</b> or <b>Cancel</b>. Closing <b> Open memory list</b> window must be done using <b>x</b> at top right corner of window.
<br> <b> Open memory list</b> closes also if <b>Add/Modify memories</b> is opened. They can not be open at same time.
<br><br> If you make changes to <b>preferences/TRXControl</b> after that just select another radio (even if not existing) from radio buttons <b>Radio 1</b> , <b>Radio 2</b>. Then select back the previous radio and new values are read. It is possible also reload settings from <b>NewQSO/File/Refresh TRX/ROT control</b>.</p>
<br>You can <b>search a memory</b> by clicking the first (header) line of grid. Search is done against the column you clicked.
<br>You can set rig by double click of an memory row in <strong>Open memory list</strong>. Similar action happen also in <strong>Add/Modify memories</strong>. The differense is that you can keep
<strong>Open memory list</strong> open while loggeing qsos etc. Where as <strong>Add/Modify memories</strong>, when open, blocks other functionality.
<br>While <strong>Add/Modify memories</strong> is open you can use buttons in right frame. Texts of buttons are quite self explaining.
<br>Deleting a memory line, or all lines, do not have any further warning questions (Are you sure?). In case you deleted something wrong just close window with <strong>Cancel</strong>. No changes are recorded then.
<br>Closing <strong>Add/Modify memories</strong> is done with buttons <strong>OK</strong> or <strong>Cancel</strong>. Closing <strong> Open memory list</strong> window must be done using <strong>x</strong> at top right corner of window.
<br> <strong> Open memory list</strong> closes also if <strong>Add/Modify memories</strong> is opened. They can not be open at same time.
<br><br> If you make changes to <strong>preferences/TRXControl</strong> after that just select another radio (even if not existing) from radio buttons <strong>Radio 1</strong> , <strong>Radio 2</strong>. Then select back the previous radio and new values are read. It is possible also reload settings from <strong>NewQSO/File/Refresh TRX/ROT control</strong>.</p>
</p><p>See also <a href="h1.html#ah7">setting up TRX/ROTControl</a>
</p>
@ -76,23 +87,24 @@ From NewQSO/Window you can open <strong>Rotor control</strong> window.
<p><img src="img/h121a.png" name="121a"><img src="img/h121aa.png" name="121aa"><img src="img/h121b.png" name="121b">
<img src="img/h121e.png" name="121e"><img src="img/h121c.png" name="121c"><img src="img/h121d.png" name="121d">
</p>
Window shows current position of rotor with <b>numerical display, Short and Long path Buttons and radio buttons to select rotor 1 or rotor 2</b>.
<br>User can resize window and select <b>additional bar display, direction and stop buttons</b>.
Window shows current position of rotor with <strong>numerical display, Short and Long path Buttons and radio buttons to select rotor 1 or rotor 2</strong>.
<br>User can resize window and select <strong>additional bar display, direction and stop buttons</strong>.
<br>Small numbers on top of bar display shows current rotor limits. Usually this is 0..360, but may be also -180..180 depending on rotor model, or other user defined limits.
<br>Direction drive buttons run rotor until stop button is pressed or maximum 15sec time limit is reached.
<br><br> When a call is entered to <b>NewQSO</b> callsign field and cursor is moved away from that field <b>DXCC info</b> part gets filled against call prefix and/or locator grid,
then, when <b>DXCC/AZIM</b> shows a value, it is possible to press <b>Short Path</b> or <b>Long Path buttons</b> and your ro
<br><br> When a call is entered to <strong>NewQSO</strong> callsign field and cursor is moved away from that field <strong>DXCC info</strong> part gets filled against call prefix and/or locator grid,
then, when <strong>DXCC/AZIM</strong> shows a value, it is possible to press <strong>Short Path</strong> or <strong>Long Path buttons</strong> and your ro
tor will turn your antenna to that direction.
<br><br>It is also possible to set new direction by a click on <b>Azimuth display</b>, type a new direction value and press <b>Enter</b> or use <b>mouse wheel</b> to select degrees.
<br>One wheel step is one degree. If you keep <b>Shift key</b> pressed while turning mouse wheel the step will be 10 degrees. If <b> Ctrl key</b> is pressed instead step will be 100 degrees.
<br><br>It is also possible to set new direction by a click on <strong>Azimuth display</strong>, type a new direction value and press <strong>Enter</strong> or use <strong>mouse wheel</strong> to select degrees.
<br>One wheel step is one degree. If you keep <strong>Shift key</strong> pressed while turning mouse wheel the step will be 10 degrees. If <strong> Ctrl key</strong> is pressed instead step will be 100 degrees.
<br>If you have used mouse wheel it is enough to move mouse away from Azimuth reading to get rotor turning. No enter keypress is needed then.
<br><br>Pressing <b>Stop button</b> stops rotor turning started either with path or turn buttons.</p>
<br><br>Pressing <strong>Stop button</strong> stops rotor turning started either with path or turn buttons.</p>
<p>Progress bar displays Az value relative to AzLimits (if Use \dump_state is checked in preferences) so do not wonder if it in some cases may look different than numerical true direction display.
<br>If error message is received from rotctld button area turns red. If requested turn command is ok, but az_min or az_maz limits change requested direction from true direction
(then antenna may not always reach requested direction) button area will turn yellow as warning sign.
<br>The length of color flash depends on poll rate and is error permanent or not.
<br>
<br>If you make changes to <b>preferences/Rot Control</b> after that just select another rotor (even if not existing) from radio buttons <b>Rotor 1</b> , <b>Rotor 2</b>. Then select back the previous rotor and new values are read. It is possible also reload settings from <b>NewQSO/File/Refresh TRX/ROT control</b>.</p>
<br>If you make changes to <strong>preferences/Rot Control</strong> after that just select another rotor (even if not existing) from radio buttons <strong>Rotor 1</strong> , <strong>Rotor 2</strong>. Then select back the previous rotor and new values are read. It is possible also reload settings from <strong>
NewQSO/File/Refresh TRX/ROT control</strong>.</p>
</p><p>See also <a href="h1.html#ah7">setting up TRX/ROTControl</a>
</p><table width="100%" border="0" cellpadding="2" cellspacing="2">
<tbody>

View File

@ -40,15 +40,17 @@
<li> <b>Show ShortPath</b> By default Grayline map will show straight line from your station (from your locator defined) to station you enter to NewQSO/callsign.
With this selection you can switch the straight line to plotted great circle short path. </li>
<li> <b>Show LongPath</b> As another option you can select great circle longpath. This can be selected with, or without short path.
<li> <b>Show BeamPath</b> If you use ROT control you can select to show Beam path heading.
<li> <b>Clear all spots</b> Clears all RBN spots from map.
<br><b> Note:</b> Dots also depend on the band, if you change band, dots will always be deleted. All data is band related.</li>
<li> <b>Watch for</b> Opens an edit window where you can change callsign or prefix watched without opening preferences. see: <a href="h1.html#ch6">RBN support</a></li>
</ul>
<img src="img/h1114d.png"><br><br>
<img src="img/h1114b.png"><br><br>
<img src="img/h11141.png"><br>
<img src="img/h11142.png"><br>
<img src="img/h11143.png"><br>
<img src="img/h11144.png"><br><br>
<p align="center"><img src=img/line.png></p>
<br>

BIN
help/img/CountyStat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
help/img/SquareStat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 84 KiB

BIN
help/img/contest_cmn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
help/img/contest_mwc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
help/img/contest_nac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 41 KiB

BIN
help/img/h11141.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
help/img/h11142.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

BIN
help/img/h11143.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
help/img/h11144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 19 KiB

BIN
help/img/h4f.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 38 KiB

BIN
help/img/h96a.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 52 KiB

BIN
help/img/wsjt21b.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
help/img/wsjt37.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -12,6 +12,7 @@
<h2><a name="aa"><strong>Contents:</strong></a></h2>
<h3><strong>Quick start</strong></h3>
<ul>
<li><a target="right" href="/usr/share/cqrlog/changelog.html">Changelog</a></li>
<li><a target="right" href="h1.html">Starting cqrlog</a></li>
<li><a target="right" href="firsttime.html">Running first time</a></li>
<li><a target="right" href="h1.html#ah1">Preferences</a></li>

View File

@ -98,8 +98,8 @@ and
at <a href="http://hamlib.sourceforge.net/"><strong>http://hamlib.sourceforge.net/</strong></a>, however
precompiled packages are available for almost all major Linux distributions.
</li>
<li><strong>MySQL server and client</strong> - The MySQL client must be installed,
without this the program will not work at all. A MySQL server must be reachable,
<li><strong>MariaDB mysql server and client</strong> - The MariaDB client must be installed,
without this the program will not work at all. A MariaDB server must be reachable,
either on the local machine or via a network.
</li>
<li><strong>libssl-devel</strong> needed if you want to use LoTW and/or online log upload

View File

@ -1,3 +1,4 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<head>
@ -76,6 +77,14 @@ Top line will show band and mode that is in use, Checking <b>"noHst”</b> (no h
</br>If there are no CQ lines during period then old monitor lines will turn to silver gray indicating that right period of possible answer is passed. This happens ONLY if <b>"noHst”</b> is checked. If not, colors stay as they are.
</br>CQ-lines turning to silver gray does not disable double click answering property. It is just informative color change.
</br>If not checked form will show also older CQs (scrolling) to see what you missed while having a coffee break :). Only 20 lines, how ever.
<p ><img src="img/wsjt37.png" name="22" width="353" height="282"></p>
</br></br>Checking <b>"USt”</b> (USA states) will show US states of CQ callers. Color of text is based to same formula against your logged qsos as described below with callsigns and locators.
<br>State is checked against a list of callsigns=states that is created from file EN.dat wich is a part of zip file from http://wireless.fcc.gov/uls/data/complete/l_amat.zip
<br>This list is named as <b>fcc_states.tab</b> and created into <b>~/.config/cqrlog/ctyfiles</b> folder. Creation needs command line programs <b>wget</b> and <b>unzip</b>. You can test existense of those by simply writing those names, one by one, to command terminal.
If they exist response should be some kind of help text. If they do not exist use your package manager to install them.
<br>Cqrlog will inform you about <b>fcc_states.tab</b> when you check the <b>"USt"</b> checkbox (if file is over 90d ays old or missing). File holds all US calls with states and is over 10Mb in size amd that size is taken from computers RAM memory when <b>USt</b> is checked. It should not be problem with modern computers, but may be it with small one card computers like Raspberry Pi (specially older versions).
</br></br>Checking <b>"sTx”</b> (Stop TX) will fix missing Wsjt-x property: If you answer to someone's CQ at same frequency Wsjt-x will stop your TX if CQ-caller answers to someone else than you. How ever Wsjt-x developing team has
decided that if you anśwer to CQ caller on other frequency (split) your TX remains on even if the answer was directed to someone else.
To reduce band QRM caused by you, you may check <b>sTx</b> to stop your TX if answer was not for you.
@ -88,13 +97,35 @@ In some cases your TX may be shut down after you have first tried to answer some
</img>
<img src="img/wsjt30.png" name="30" width="353" height="83">
</img></p><p>
If you do not want any information texts, just alerts, you can check <b>nTxt</b> to prevent richmemo text updates and minimize window size horizontal or drop it completely down with (<b>_</b>) while alerts and follow are still working.
</br>
If you have Wsjt-x devel version 1.9.0-rc3 r8592 (or higher) <strong>color</strong>ing is sent <strong>back</strong> to Wsjt-x with same choosed colours as CQ-monitor uses.
How ever there are some limitations compared to CQ-monitor:
</br><li><strong>color back</strong> can not change lower case letters of Band Activity line in case call or locator is worked. Just font color is changed</li>
<li><strong>color back</strong> can not print locator with 2 colors in case main grid is worked, but subgrid(numerical part) is not. In that case locator will have maingrid color and yellow background.</li>
<li><strong>color back</strong> will paint both "CQ" and cq-direction with "CQ ext" color if CQ is not directed to you.</li>
</br>
With older versions of wsjt-x this causes unkonwn command error and then <b>nTxt</b> should not be checked until you get newer version of Wsjt-x.
</br></p><p>
<img src="img/wsjt34.png" name="34" width="353" height="282">
</img>
<img src="img/wsjt33.png" name="33" width="353" height="282">
</img></p><p>
If you are able to use <strong>color back</strong> feature you may want to change some Wsjt-x color settings and maybe check "CQ only" checbox at Main window. Selecting also font to some of "mono"+ "bold" ones from "Configuration/General/Decoded Text Font" could make a better view.</p>
<p>
<ul><strong>A word of warning:</strong></ul> In Wsjt-x selecting <strong>CQ only</strong> will <strong>disable Generating of Std messages</strong> by double click either <strong>followed</strong> message line or Wsjt-x <strong>map's non-cq lines</strong>.
</br>This <strong>does not</strong> happen if <strong>CQ only</strong> is <strong>uncheked</strong>. Unchecking it after not working double click does not help if Band Activiy window does not contain that line from which <strong>Wsjt map</strong> or <strong>follow</strong> line was created.
</br>That is because Wsjt-x must found equal line from Band activity and UDP command that produces Std General messages creation.
</br> This may change in future devel versions or in official release of 1.9.0, but at the moment you should be aware of that.</p>
<p><strong>Hint:</strong> If you have had <strong>CQ only</strong> checked and you want to load Std message from just appeared line from <strong>Wsjt map</strong> or <strong>follow line</strong> uncheck <strong>CQ only immediately</strong> during time that entry is not grayed (ongoing period).
Wsjtx will produce again last periods decode (wsjt map will show it double) and after that you can have effect for double click.
If you do not want any information texts, just alerts, you can check <b>nTxt</b> to prevent text updates and minimize window size horizontal or drop it completely down with (<b>_</b>) while alerts and follow are still working.
</br></br>
Selecting <b>DX</b> checkbox cqrlog fiters away all calls that are from same continent as you are. This works both in Cq monitor and MAP mode<br>
Checking <b>Show LoTW, eQSL usage in CQ-monitor</b> from <b>preferences/fldigi- wsjt interface</b> L &amp; E will show up in front of continent in CQ-monitor<br>
</p><p><img src="img/wsjt21.png" name="21" width="363" height="282">
</img><img src="img/wsjt21b.png" name="21" width="363" height="282">
</img></p>
Checking <b>“flw”</b> new part of monitor opens. This will make easier to follow a DX who does not stay on same frequency, but jumps around answering to callers.
</br>Type in a callsing. The callsign is checked to be written in upcase letters and spaces are trimmed away. Pressing RETURN at the end of typing turns <strong>Follow</strong> button ON (green).

View File

@ -4,9 +4,235 @@
<title>List of changes in CQRLOG</title>
</head>
<body>
<strong>New user?</strong> Please look at <strong>Help -> Keys and shortcuts</strong> to find out how to operate CQRLOG from keyboard.
<strong>New user?</strong> Please look at <strong>Help -> Keys and shortcuts</strong> to find out how to operate CQRLOG from keyboard.<br>
You can return to this changelog via <strong>Help</strong> after Cqrlog has started.
<hr>
<br>
<strong>Alpha test version of CQRLOG 2.6.0 (119)</strong><br>
New in this alpha version (not in official version):<br>
<ul style="list-style: square;text-align:left; color: green;" >
<li>eQSL download: Fixed the stuck up caused by eQSL starting to add one more empty line at the end of downloaded file</li>
<li>Contest: Inform remote mode 'on' when saving manual entered qso. Multimode contests like<br>
NAC (CW,Phone,MGM) it may happen that remote is left on when jump from FT8 to CW/Phone.<br>
Then entering qso manually looks like saved, but will never appear into log.
<li>Makefile: Clean fix (by Bill, WK2X)</li>
<li>Contest filter: If Contest window is open contest name is copied to filter</li>
<li>(118)</li>
<li>CW Messages: Fix to open/close when Contest window open and S&P not checked</li>
<li>CW Messages: Added another set F1-F10 for Contest RUN mode</li>
<li>RigControl: Update Hamlib error codes list </li>
<li>Log Upload: Add UDP Log Uploader based on N1MM+ format(by Steven, M1SDH)</li>
<li>Preferences:CWinterface: Layout fixes</li>
<li>Hammlib:CW and Voice keying: Changes for latest Hamlib w34/2023</li>
<li>DBConnection:Utils:Configuration:Export: Force file extension to be '.ini' as Configuration:Import lists only '.ini' files </li>
<li>NewQSO: Details has new Tab 'Call statistic' After call entered shows wkd/L/E status on band grid</li>
<li>RigControl: rigctld parameter '-C auto_power=1' is added only if user checks 'Rig pwr ON cmd' in TRXControl preferences.
This should help old Hamlibs that claim auto_power is wrong parameter and refude to start</li>
<li>NewQSO: Details Tab selected remembered even when satellite mode enabled</li>
<li>RigControl: Fix to set_powerstat at init</li>
<li>Group edit: QSL sent and received date can be cleared</li>
<li>Fixed date format checking routine</li>
<li>HRDUpload: Fix to error codes</li>
<li>NewQSO+Contest: Use rigctld:\send_voice_mem instead of voice_keyer script if rig supports it</li>
<li>eQSL Import: Checkbox to change Rcvd date to current date -1 after successfull download</li>
<li>Added HamQTH & Clublog error hanling code by phl0 that can be found from<br>
https://github.com/ok2cqr/cqrlog/compare/master...phl0:moreDetailedErrorHandlingForOnlineLogs</li>
<li>Group edit warning color change for readability</li>
<li>CW:Hamlib keyer: Should now detect Hamlib>=Jul-2023 that differs with CW commands</li>
<li>Cabrillo export: Sets now suffix '.cbr' for filename as default</li>
<li>(117)</li>
<li>Preferences:TRXControl: Added checkbox 'compound poll' (default checked) When unchecked rig polling commands are sent each one on it's own line. This may help poor emulators like WFview.</li>
<li>HamlibCW: Fixed StopSending procedure. Has now '+\stop_morse currVFO' that should work also other rigs than ts480 and Icoms and is implemented in rigctld at least from Jan2023</li>
<li>Callbook: CQRZCQ XML fixd and tested. Should be mostly ok now.</li>
<li>Callbook: Added support to QRZCQ, not tested at all yet because of lack of premium account</li>
<li>Preferences:TRXControl:#1 Dummy rig: Starting rigctld can be changed (was disabled) </li>
<li>HamlibCW: Added checkbox to use Hamlib (past Jul-2023) 1k CW buffer.(Sends memory as string despite length)</li>
<li>QsoList:Fix:Return cursor to last worked qso when saving edited Qso should not happen</li>
<li>CWkeying:Hamlib: Quick fix for sending because new Hamlib is not backward compatible</li>
<li>Grayline+CWkeying:Fix: Some debug print fixes</li>
<li>NewQso+QsoList:Statistics:Big squares+County:Add: Filter(F12) is now effective if used</li>
<li>NewQso+QsoList:Statistics:Big squares+County:Fix: Totals printing</li>
<li>NewQso+QsoList:Statistics:Big squares+County: Added 'ALL band'. Fixed layouts</li>
<li>Fix: Broken Group edit</li>
<li>NewQso+QsoList:Statistics: Added County statistic. Fixed Help.</li>
<li>Grayline: Removed some unconditional debug prints</li>
<li>Wsjtx:Map:fix: dB view at Map init now read</li>
<li>NewQSO:Contest:Fix: Fixed keep propagation also when contest window used</li>
<li>NewQSO:Fix:Keep propagation mode when 2xESC even when no qsos saved yet</li>
<li>Preferences:NewQSO: Added default operator setting (if different that station callsign)</li>
<li>Grayline: Show also rotor beam path if in use and selected</li>
<li>ROT control: Fix: Remember used rotor (1 or 2) over Cqrlog restart.</li>
<li>WSJTremote, Map mode: '*' appear fixed when line ends ' 73'</li>
<li>Preferences/TRXControl: Added checkbox 'Set UTC to Rig'. Uses rigctld '\set_clock' command on next full minute after rig initialization</li>
<li>WSJTremote, Map mode: '*' appeared when CQ-callers locator ended '73' (should appear only 'RR73' or ' 73' endings). Fixed</li>
<li>Contest: Set TX column lables Green/Red by state of S&P to indicate CW memory auto sending on/off</li>
<li>Contest: Enable CQ panel also when in S&P</li>
<li>Contest: Increase size between status panel and status view for easier acces to status settings (click area)</li>
<li>Fixed: 8M & 5M frequency add to bands when 1st start of Cqrlog. (DB upgrade was ok before)</li>
<li>Contest: pressing 'CQ start' moves focus to Call column</li>
<li>Added hint texts to first start DB selection window</li>
<li>Cabrillo export: Changed export to use time_off instead of time_on.
<br>With CW and Phone qsos this does not matter as times are usually same.
<br>With FT8 qso takes longer and WSTX's (and N1MM's) exports are using time_off.
<br>Now Cqrlog's export is equal to others.</li>
<li>(116)</li>
<li>Preferences: wsjt/fldigi: fixed hidden checkbox</li>
<li>DXCluster: Added user defined command keys F1-F10 See help for details.</li>
<li>WSJT remote: fixed contest logging. Remote name should have WSJT instead of being exactly WSJT-X.<br>
Remote name changes when using special configs.(wsjtx -r cfg_name)</li>
<li>Contest: counter HH:MM since last logged qso, QSO rate /10min and /1hour(these need testing)</li>
<li>Contest: Shift+ESC removes callsign (same as 3x ESC)</li>
<li>LoTW inport: changed date to be (today-1day) to be sure</li>
<li>LoTW Import: Checkbox to change Rcvd date to current date after successfull download (tu: 4X6GP)</li>
<li>When creating a new log it is now possible to copy configuration automated from existing log<br>
(FYI: Configuration is log based)</li>
<li>(115)</li>
<li>Moved also solar data (propagation window) text address to user editable in preferences.</li>
<li>Fixed solar data (propagation window) addresses from 'http' to 'https'</li>
<li>Contest: Stores last used CQ frequency and mode when in Run. Click (or Ctrl+L) over reading resets rig to that freq+mode</li>
<li>Added checbox 'DATA' to 'show only spots' at /preferences/DXCluster. Help files fixed</li>
<li>DXCluster: fixed response missing for "sh/he e6" (all prefixes E1..E9)</li>
<li>Small view fix in RBN monitor header</li>
<li>Small view fix in adif errorfile import</li>
<li>(114)</li>
<li>Added 8M and 5M bands</li>
<li>Fixed radio memory loading/saving (tested with 12000 memories)</li>
<li>Added search to radio memory list</li>
<li>Fixes several SQL query record count requests in many units</li>
<li>Fixed file open dialogs to check file exists. QT5 opendialog allowsuser to type filename and it needs checking</li>
<li>Fixed DXCluster spot:Any of QSL, LoTW, eQSL received prints with confirmed color</li>
<li>Fixed DXCluster font style saving/loading</li>
<li>(113)</li>
<li>Fixed wsjtx std messages clean when remote was set active</li>
<li> Added option (from preferences) to show LoTW/eQSL users in wsjtx CQ-monitor</li>
<li>(112)</li>
<li>Fixed spot splitter a bit and cleaned DXCluster code too</li>
<li>Clicking DXSpot line now sets wsjt std messages if wsjt-remote is active</li>
<li>Rewritten DXCluster spot splitter because of faulty call grep</li>
<li>Wsjtx remote:<br>
Cqrlog will clear wsjt-x DXcall, DXgrid and StdMessages when band changes<br>
HamQTH/QRZ info is now looked when Wsjtx/DXCall changes on RX and TX period<br>
(Was before only on TX period)</li>
<li>Contest window:<br>
Fixed ESC key: 1x stops Cw sending, 2x returns cursor to Call column, 3x clears qso entry<br>
Fixed F2 memory sending in S&amp;P mode when exit from Call column after callisgn was fixed (using 2xESC)<br>
Fixed Call entry so that CW macro %c (callsign) works also with partial callsigns (when in Call column)</li>
<li>Fixed shortcut keys help page: Added Contest window shortcuts</li>
<li>Fixed warning splash and help that you can not spot with WebDXluster</li>
<li>Added missing 'OR' to Qso list/Qsl selection </li>
<li>Fixed update QSO list view when Preferences/Visible columns change</li>
<li>Fixed bug in Qsolist/View/Show Details checbox visibility</li>
<li>(111)</li>
<li>Fixed bug in preferences/Online log edited and saved urls could not be loaded</li>
<li>(110)</li>
<li>Added numeric divide-key to work in contest/call column</li>
<li>Added End-key to work in contest/call column</li>
<li>Added Home-key to work in contest/call column</li>
<li>Changed CQmonitor/Mapmode worked locator color printing<br>
Should now respond better to true situation of current band</li>
<li>Removed one debug print from rigcontrol</li>
<li>(109)</li>
<li>Fixed numkeypad in contest/callsign/gtk2, QT5 was already working</li>
<li>RBNmonitor: Added source callsign filter</li>
<li>Removed small change to "remove all upload triggers". No good<br>
Instead added warnings for use with more than on online log</li>
<li>(108)</li>
<li>Very small change to "remove all upload triggers". Helps? </li>
<li>Fixed startup rig power on with rig models below 10, mainly for mod #2</li>
<li>Fixed Cabrillo export to have adjustable RST fields</li>
<li>Fixed TAB key funtion in Contest window</li>
<li>Added Contest/msg multipliers count and list by contest bands</li>
<li>(107)</li>
<li>Added cache write while preferences closing. Speeds up %50</li>
<li>Added retry counter for rigctld connecting.</li>
<li>Updated sat_names.tab (from Florian,DF2ET)</li>
<li>Made Online logs Urls defineable</li>
<li>Fix for DXCCRef edit/save. Now user changes are saved</li>
<li>Fixed unwanted chars filter in contest/callsign that cause SQL error</li>
<li>Fixed bug in "Fixed ver(104) bug where rig did not initialize"
<li>Set default values for TRX and rotor port and poll</li>
<li>Fixed some rig and rot parameter readings</li>
<li>Fixed ver(104) bug where rig did not initialize if TRXControl window
<br> stayed closed during Cqrlog start</li>
<li>(105)</li>
<li>Added macros:
<br>%xnr - contest exchange serial number received
<br>%xnrs- contest exchenge serial number received sends 9->N and 0->T
<br>%xmr - contest exchange message received</li>
<li>Fixed offline qso feed. When qso is saved returns to QsoDate column.
<br>This makes qso manual feed from paper log easier as things start
<br>from date and tabulation continues in chronological order:
<br>date,start,end,call,freq, mode .. etc and when qso is saved
<br>focus returns again to date column.
<br>When typing in Date and times in Offline Cqrlog will add punctuation
<br>marks ('-' or ':') automatic. This way only number keys need to be typed.
<br>When not valid locator is entered (usually odd number of characters)
<br>NewQSO/GRID label will turn bold red as warning sign when exit from
<br>grid column.</li>
<li>Added support for 1-6 rigs. User can define how many rigs he want to use
<br>As before, only one rig can be active at time.
<br>This change affects also mode/bandwidths settings and CW keyer settings.
<br>All rigs can have their own settings for BW and CW keyer.</li>
<li>Fix for quick split settings.
<br>Fixed all edtboxes value limits to 0..9999. Fixed tabulation orders</li>
<li>Added serial CW keyer commanding menu item.
<br>Menuitem: NewQSO/File/Send hex bytes to keyer (W or K)
<br>Item is visible with winkeyer or K3NG keyer and allows non text
<br>hex bytes to be sent to serial line. </li>
<li>Fix for contest name in contests that have all modes in use
<br>CW/SSB/FM/MGM like NAC has.
<br>Then MGM qsos coming from WSJT-X will get name from Cqrlog contest
<br>name currently in contest window if it is open during remote.
<br>This overwrites WSJT-X predefined 4 contest names making all
<br>qsos in contest to have same contest name defined in contest window. </li>
<li>Upgrade to Contest window
<br>-Has now checkbox "S&P". When checked works as before.
<br> When not checked launches memories F2,F3,F4 automated when
<br> moving on columns.
<br> F1 for sending CQ. Can be auto-repeated
<br> F2 for sending call, rst and message
<br> F3 for sending duplicate qso warning
<br> F4 for sending after qso is logged with button or enter key
<br>-Has now hint texts added. They can be turned off with checkbox.
<br>-Has now status display to see how contest progress.
<br> procedure MWC will show OK1WC memorial status
<br> procedure NAC will show Nordic VUSHf activiy contest status
<br> Common status will show status of other (unspecified) contest statuses
<br> with user defined view.
<br> More status procedures can be added later.
<br>-Duplicate check will work now while typing in callsign. (before worked
<br> after cursor left callsign column)
<br>-Added "Mark Dupe" checbox. When checked with duplicate check ON
<br> saved dupicate qso is marked to "RST send" with "/D". It is operator's
<br> duty to do something (or not) with this after Cabrillo log is produced.
<br>
<br>For more specific information see revised contest help file, please!</li>
<li>Misc bug fixes.
<br>-Changed Contest Filter to show contest names in order from A to Z (acs)
<br>-Adjusted Contest Filter maxlines to default (8). This has effect when
<br> QT5 widgets are used (shows more contest names at time).
<br>-Fixed typo in Group edit field selector. Had "ŕ" in "operator"
<br>-Fixed TRXControl's button "70cm". If no previous settings for 70cm
<br> defaults were done loaded 80m band settings when pressed.
<br>-Fixed double usage of query qBands. Preferences/bands/Frequencies list
<br>loose it's grid contents if Wsjt-x remote is on (behind) and CQ-monitor selected.
<br>-Updated help files</li>
<li>WSJT-C CQ monitor shows US states
<br>CQ-monitor checbox "USt" that allows USA states to monitored wsjt-CQs
<br>When you check it at first time it suggests loading from fcc.gov it should
<br>suggest same after 90 days of usage to update data.
<br>US callsign=state (fcc_states.tab) file is over 10Mb and ist is loaded
<br>to RAM for runtime. Seeking a callsingn from there takes some time.</li>
<li>RTTY mode is now DATA
<br>At preferences/Modes you will see a new "DATA" that replaces the old "RTTY".
<br>Defaults for that are rig cmd:RTTY data mode:RTTY that acts like previous Cqrlogs.
<br>Setting data mode affects DXSpots coloring and double clicking: You can set other
<br>mode than RTTY to be used. </li>
<li>Online log upload
<br>Bottom of Preferences/Online log upload has some checkboxes to affect
<br>to online log upload.
<br>See help/Quick start/Online log upload support for more information. </li>
</ul>
<strong>CQRLOG 2.6.0 (2022-05-29)</strong><br>
<ul style="list-style: square;text-align:left; color: blue;">
<li>new button "URL" to row below "Comment to callsign" (Saku, OH1KH)</li>

245
src/contest.html Normal file
View File

@ -0,0 +1,245 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<head>
<title>CQRLOG - Contest</title>
</head>
<body>
<table border="0" cellpadding="5" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><img src="img/exc.png"></td>
<td bgcolor=ffffcc valign="top" align="justify"><strong>
<font color="red">WARNING!</font></strong>
Backup your data often! BACKUP your log directory at the end of EVERY session!
All that you need to backup and store in a safe place is the log database directory
located in the ~/.config/cqrlog/database folder, or you can enable the autobackup function
in Preferences. This autobackup function creates an ADIF file with a backup of your log.
/td>
</tr>
</tbody>
</table>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td width="33%" align="center">[<a href="index.html" target="_top">Menu</a>]</td>
</tr>
</tbody>
</table>
<br>
<div style="text-align: left;"><strong>CQRLOG for LINUX by OK2CQR &amp; OK1RR</strong></div>
<p align=center><img src=img/line.png></p>
<a name=co1><h2><strong>Contest support</strong></h2></a>
<p>You will find contest selection from <b>NewQSO/Window</b> dropdown menu. Contest support of Cqrlog is very limited, but will serve you well if you just
like to take a part to contest without winning in mind.
<br>Contest window is just a "child form" for <b>NewQSO</b> to make qso logging faster when working in contests.
With <b>Tru</b> and <b>Msg is Loc</b> setting it is useful also in VHF, UHF, SHF Tropo, Es etc. openings for fast qso
logging. Perhaps also in some other operations like WWFF activations.
<br><br><b>Note:</b> This is <b>NOT</b> a contest logging add-on!!! It is a contest-notepad.
It is meant to be a tool for "Sunday contesters working in Tourist Class". Do not expect wonders!
<br><br>When contest window is open NewQSO</b> has contest exchange fields visible. You may have to stretch <b>NewQSO </b> window horizontally to see them.
You <b>do not normally need NewQSO</b> window during contest.
<br><b>Only need for <i>NewQSO</i> is in case you have to edit an already worked qso.</b>
Select qso normally via <b>QSO list</b> and press <b>edit QSO button</b> and you are able to edit qso, also the contest message part of it.
<br><br><b>Repeat: <i> NewQSO</i></b> is not meant to be used during contest qso feeds. <b>All new qsos are entered via contest window.</b></p>
<p align="center">
<img src="img/contest.png">
</p>
<p>
<b>RECOMMENDATION:</b><br> Make new log for each contest, consider not to allow qrz/hamqth search, it may slow down qso feed.
<br> It might be a good idea to have two logs the "contest" that is used during a contest and then cleared for new contest and the other as
"contest archive" where contents of "contest" are moved with adif export after Cabrillo log is sent.
<br>Benefit of having "contest" log with one contest is also that you get <b>DXCC statistic</b> right after cursor leaves callsign column. You can place contest window just above NewQSO/DXCC statistic.(see pic above).
</p><p>
Contest window has a simple dupe check that turns typed duplicate callsign bold red printed. If you save a duplicate qso it is marked as "<b>/D</b>" in "<b>RST sent</b>" field.
When doing Cabrillo export it is operator's duty to decide what to do with "/D" reports
<br>To get duplication check working properly you must <b>either</b> create a new log for every contest <b>or</b> set dupe start date (I.E. contest starting day) with button <b>"from YYYY-MM-DD"</b>
</p>
<p>
<h4>Hotkeys:</h4>
Hotkeys work same way as with <a href="h20.html">New QSO window</a>.
<ul><li> <b>2x ESC</b> clears all fileds</li>
<li>Note: <b>1x ESC</b> returns cursor back to Call-field (if cursor is in some of the other fields like RSTr) and places cursor at the end of callsign for possible repairs.<br>
It also halts CW memory output if it is just running.</li>
<li> <b> F1..F10 </b>send CW or VOICE messages depending on used mode.</li>
<li> <b>TAB-key</b> moves cursor between fields. (may also be SPACE key, if set) </li>
<li> <b>Ctrl+Tab</b> will set <b>S&P</b> mode</li>
<li> <b>Shift+Tab</b> will reset <b>S&P</b> mode</li>
</ul>
</p>
<p>
<h4>Contest window has following fields and checkboxes:</h4>
<ul>
<li><b>Contest name</b> Selection box has a list of predefined contest names. When selecting one and leaving <b>Contest name</b> combo box name will be cut from "|"(including it) that separates contest name and explanation.
You can also type contest name here if it is not in list. Be sure you do not use "|" character(s) in name because program will cut name from the first one found.
<br><b>RECOMMENDATION:</b><br>
Add date to contest name if you keep many contests in same log. That way <b>QSO list/Filter/Contest filter</b> can separate contests by name.</li>
<li><b>Tab in order</b> when checked overrides all other Tab settings (see below) and Tab Order is: Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll</li>
<li><b>Show hint</b> when checked shows help text of object that mouse cursor currently points</li>
<li><b>CQ panel</b> is visible when <b>S&P</b> is not checked (CQ calling mode)</li>
<ul><li><b>CQ period</b> timer period in millisecons to send one CQ+listen (5000 - 50000, 5-50sec)
<br> To adjust: Set repeats=1, press CQ start, adjust period value so that F1 has time to run + listening time</li>
<li><b>CQ repeats</b> repeat period how many times CQ period is repeated (1 - 20)s</li>
<li><b>CQ start</b> start/stop repeated CQ calling. <b>Shorcut key: Shift+F1</b>.
<br>Pressing <b>ESC</b> stops timer and CW send. It can not stop voice keyer script.
<br>Also writing anyting to <b>Call</b> will stop running timer and CW sending.</li>
</li></ul>
<li><b>Call</b> when you leave this field callsign is moved to NewQSO. Callsign <b>turns BOLD RED</b> while typing if it is duplicate (and duplicate check is active).</li>
<li><b>SPACE is TAB</b> when checked space bar acts like TAB-key moving to next field. <b>Note:</b>This prevents typing space (perhaps needed in MSG fields).</li>
<li><b>Dupe check</b> Default checked. If you use same log for several contests, and/or other working, set the contest start date with <b>from YY-MM-DD</b> button.
<br> if <b>NoMode4Dupe</b> is selected duplicate check allows qso with same station in same band if mode differs.
<br> if <b>Ignore dupes</b> is selected it will ignore duplication check completely.
<br> When dupe check is active and callsign is found as duplicate, but still saved, program will add <b>/D</b> to <b>RST sent</b>.
It is then operator's duty to clean or leave <b>/D</b> to exported Cabrillo log.</li>
<br>
<li><b>RST s</b> RST sent. Can be changed.
<br><b> Note:</b> defaults to 599 (CW) 59(phone). If rig mode is changed you get corresponding RST with 2xESC.
<br>It also changes when cursol leaves <b>call</b> column. So do not worry when working mixed mode contest!</li>
<li><b>Tru</b> means you like to exchange true reports. Makes Tab order to stop at RST (s & r) fields. Useful in some high band contests, Es and tropo openings.</li>
<br>
<li><b>NR s</b> serial number to send.
<br><b> Note:</b> you can type only numbers to NR s field.</li>
<li> <b>Inc</b> if checked it will auto increment serial number. You may change this number at any time. Increment goes on from typed number.</li>
<br>
<li><b>MSG s</b> sometimes you may need an additional message with number, or just a message with no number.
On high band contests you may type your locator here.</li>
<li><b>Qsp</b> if checked makes TAB order stop at MSG s. Content of MSG s is taken from last logged MSG r. Cursor is placed at the end of message for possible edit.
For contests where you have circulating message: At 1st qso you set your own word to send, after that you send previously received word as your next own message. </li>
<li><b>S&P</b> When Search & Pounce is checked operator launces all CW/Voice messages manually.
<br>When S&P is not checked program launches message F2 when cursor enters one of RSTr, NRr, or MSGr columns. This way also if true reports are selected F2 is sent after your message is ready.
<br>In case duplicate checking is enabled and callsign is duplicate, message F3 is launched instead of F2 and it happens always when cursor leaves callsign column.
<br>When <i>Enter</i> or <i>Save qso</i> button is pressed program will send message F4.
<br>Message F1 can be used for CQ that is manually launched.
<br>When phone modes are used messages are lauched same way but you need very special voice script if you want to include worked station's callsign into F2 and F3 messages, but launcing F4 at QSO save may be useful.
<br><b>RECOMMENDATION:</b><br> Reserve memory macros F1-F5 for calling operation and F6-F9 for S&P operation.
<br>See more about <a href="/h26.html">CW messages</a> how to define messages with macros and save/load different setups of CW messages.</li>
<br>
<li><b>RST r</b> RST received. Default to 599 (CW) 59 (phone). Can be changed.
<br>Default rst for CW and phone is created from rig's current mode. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons.
</li>
<br>
<li><b>NR r</b> serial number you receive.
<br><b> Note:</b> you can type only numbers to NR r field. </li>
<li><b>No </b> if thre is no serial number in contest this setting changes tab order so that it jumps over, directly to MSG r. </li>
<br>
<li><b>MSG r</b> message you receive</li>
<li> <b>MSG is Grid</b> If '<b>MSG is ...</b>' is checked then message will be logged in <i> SRX_String </i><b>AND ALSO</b> to <i>selected NewQSO column</i>.
<br><br> By default <b>Msg is Grid</b>. It can be changed with right mouse click on the text.
If <b>checked</b> then input will turn red if character count is odd. Maximum of 6 characters locator can be entered.
<br>If <b>MSG is Grid</b> but the entered locator is <b>not valid</b> it will <b>NOT</b> be copied to <i>NewQSO/Grid column</i> and stays only in <i>Srx_String</i>.
<br>
<br>In case of <b>MSG is State</b> and callsign is detected by prefix to be a Germany callsign srx_string is copied to <b>DarcDOC</b> column, orherwise to <b>State</b> column.
<br>In other cases MSG is copied to correspondig NewQSO column.
<br><b>NOTE: </b>After selecting '<b>MSG is ...</b>' remember also to check the checkbox to get it activated!</b></li>
</ul>
<h4>Buttons you really do not need (you should <b>NOT use mouse</b> when working contest!):</h4>
<ul>
<li><b>Save QSO</b> Save QSO button at NewQSO, increments NR and clears all fields.
<br><b> Note:</b> pressing <b>ENTER at any time after cursor is out from Call column</b> does the same.</li>
<br><li><b>Clear QSO</b> Clear all QSO information.
<br><b> Note:</b> Pressing 2x ESC key does the same.</li>
<br><li><b>Clear all</b> Clear all fields. Usefull when starting a new contest to remove all saved settings.</li>
</ul>
<br>
All settings, including contest name, are saved when closing contest form. When opening cqrlog and contest form again after rest period you can directly continue contest working.
</p>
<p>
<b>Typical contest qso goes like this:</b><br>
Type callsign-&gt;press TAB-&gt;type contest rxnumber-&gt;press TAB-&gt;type contest message-&gt;press ENTER.
Or hit ENTER after rxnumber if no additional message is exchanged. When S&P is checked you maybe need to launch some Cw messages manually.
</p>
<p>Remember that pressing <b>ENTER</b> key at any column saves qso with existing values. How ever there must be
callsign of least three characters long. Sent/Received number and message(s) are not needed.
<br><b>There is no need to use the mouse.</b> Keep your hands on keyboard (and possible on CW key / PTT (if not foot pedal in use)). It is faster.</p>
<p>
Contest numbers and messages are saved in log in their own columns. Use <b>preferences/Visible columns</b> to show them in <b>Qso list</b>.
<br><br>
<b>CW messages</b> can be used for sending contest messages. Look at help section <a href="h26.html">CW Operation</a>
how to use macros in messages.
<br><b>NOTE:</b> If you use macro that sends whole contest message (%xrs = RST, STX, STXString) message will skip empty ones. This way %xrs works for all contests.
</p>
<h4>Status view support</h4>
<b>NOTE:</b> If you have one log called <b>contest</b> that you clear always before contest, to have just qsos of that contest, and after contest you move all qsos
with adif export to another log called <b>archive</b> you can view contest status afterwards from that log if you have used <b>unique contest names</b> I.E. added contest start date to name.
<br> Find contest with <b>Filter/Contest filter</b> and copy name from selection list box and paste it to Contest window. You do not have to activate contest filter to see the status of that contest.
<p><b>OK1WC memorial contest</b> status is supported.
<p align="center">
<img src="img/contest_mwc.png">
</p>
<p>
If contest name has "<b>mwc</b>" or "<b>ok1wc</b>" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>TRXControl must show that rig is on 80m or 40m band. If you do not have cat controlled rig select "Hamlib dummy #1" as rig and set correct band and mode from TRXControl's band buttons.
<br>Only bands 80M and 40M and mode CW are counted (See rules of contest).
<br><br>
</p>
<br>
<p><b>Nordic Activity Contest (NAC)</b> status is supported.
<p align="center">
<img src="img/contest_nac.png">
</p>
<p>
If contest name has "<b>nac</b>" included (no case sensitive) then status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>
<br><br>
</p>
<p><b>Common</b> status is supported.
<p align="center">
<img src="img/contest_cmn.png">
</p>
<p>
If contest name has <b>any name that does not fit rules of two above</b> status counting is activated. At the start of contest (and any oher time when no qso to save) it can be seen by pressing <b>2xESC</b>.
After saving a qso Status view is updated.
<br>There are several items shown in Status display. You can control them by left click below text <b>Status</b> (but above status display itself).
<br>The DX and own continent counts (EU in picture) are defined against your callsign in preferences/station/call.
<br><br> To see Status section you may need to stretch the bottom part of Contest window.
<br><b>NOTE:</b><i> Status counting may have errors! It is just for showing progress of contest, not to show final score.</i>
</p>
<p>
<H4>After contest</h4>
Most contests expect <b>Cabrillo</b> log format. Cqrlog has a limited support of Cabrillo exports. Mostly enough for a Sunday contester.
<br>In case you want to use external Cabrillo program you have to make ADIF export of qsos</b>
and then use another program.</p><p>
</br>
I found nice <b>adif2cabrillo</b> program for Linux from <a href="http://users.telenet.be/on4qz/a2c/index.html" target="_blank">http://users.telenet.be/on4qz/</a> that supports ADIF importing.
</p></p>Starting is bit complicated:
</br>You need to compile it from source. Qt5 with qmake (called qmake-qt5 if your distro is Fedora) is needed to be able to compile
it.</br>
Then there are no templates for different contests. You have to create them, but after that it serves you well!
It accepts nicely exported ADIF format from cqrlog and dig out STX and SRX as expected.
</p>
<p>
<h5>ADIF exports fields to right tags.</h5>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;001<br>
&lt;RST_RCVD:3&gt;599&lt;SRX:3&gt;002<br>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;003&lt;STX_STRING:2&gt;SA<br>
&lt;RST_RCVD:3&gt;599&lt;SRX:3&gt;003&lt;SRX_STRING:2&gt;dd<br>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;002&lt;STX_STRING:2&gt;SA<br>
&lt;RST_RCVD:3&gt;599&lt;SRX:3&gt;003&lt;SRX_STRING:2&gt;kb<br>
&lt;RST_SENT:3&gt;599&lt;STX:3&gt;001&lt;STX_STRING:2&gt;SA<br>
&lt;RST_RCVD:3&gt;599&lt;SRX:3&gt;002&lt;SRX_STRING:2&gt;SB<br>
</p>
<p>
HTML export will look like this:<br>
<img src="img/contest_html_export.png">
</p>
<p align=center><img src=img/line.png></p>
<br>
<table width="100%" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td width="33%" align="center">[<a href="index.html" target="_top">Menu</a>]</td>
</tr>
</tbody>
</table>
<br>
</body>
</html>

BIN
src/contest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
src/contest_cmn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
src/contest_html_export.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src/contest_mwc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
src/contest_nac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="11"/>
<Version Value="12"/>
<General>
<Flags>
<LRSInOutputDirectory Value="False"/>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<AutoCreateForms Value="False"/>
<Title Value="cqrlog"/>
<Icon Value="0"/>
@ -19,7 +19,7 @@
<AutoIncrementBuild Value="True"/>
<MinorVersionNr Value="3"/>
<RevisionNr Value="1"/>
<BuildNr Value="2201"/>
<BuildNr Value="2202"/>
<StringTable ProductVersion="0.3.1.2026"/>
</VersionInfo>
<MacroValues Count="1">
@ -40,7 +40,7 @@
<RunParams>
<local>
<CommandLineParams Value="--debug=0"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
<environment>
<UserOverrides Count="2">
@ -53,7 +53,7 @@
<Mode0 Name="default">
<local>
<CommandLineParams Value="--debug=0"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
<environment>
<UserOverrides Count="2">
@ -105,7 +105,7 @@
<MinVersion Major="1" Minor="2" Release="1" Valid="True"/>
</Item10>
</RequiredPackages>
<Units Count="122">
<Units Count="125">
<Unit0>
<Filename Value="cqrlog.lpr"/>
<IsPartOfProject Value="True"/>
@ -163,6 +163,7 @@
<Filename Value="fMarkQSL.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmMarkQSL"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit8>
<Unit9>
@ -896,10 +897,28 @@
<ResourceBaseClass Value="Form"/>
</Unit120>
<Unit121>
<Filename Value="fProgress.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmProgress"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit121>
<Unit122>
<Filename Value="fDbError.pas"/>
<IsPartOfProject Value="True"/>
<HasResources Value="True"/>
</Unit121>
</Unit122>
<Unit123>
<Filename Value="fCountyStat.lfm"/>
<IsPartOfProject Value="True"/>
</Unit123>
<Unit124>
<Filename Value="fCountyStat.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmCountyStat"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit124>
</Units>
</ProjectOptions>
<CompilerOptions>
@ -920,6 +939,7 @@
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
@ -928,6 +948,7 @@
<ShowNotes Value="False"/>
<ShowHints Value="False"/>
<ShoLineNum Value="True"/>
<ShowDebugInfo Value="True"/>
</Verbosity>
<CustomOptions Value="-dNO_CONTEST"/>
<CreateMakefileOnBuild Value="True"/>

View File

@ -26,7 +26,7 @@ uses
fWorkedGrids, fPropDK0WCY, fRemind, fContest, fMonWsjtx, fXfldigi,
dMembership, dSatellite, uRigControl, uRotControl, azidis3, aziloc, fDOKStat,
fCabrilloExport, uDbUtils, dQTHProfile, uConnectionInfo, znacmech, gline2,
fDbSqlSel, fDbError;
fDbSqlSel, fProgress, fDbError, fCountyStat;
var
Splash : TfrmSplash;
@ -99,6 +99,7 @@ begin
Application.CreateForm(Tfrmxfldigi, frmxfldigi);
Application.CreateForm(TdmMembership, dmMembership);
Application.CreateForm(TdmSatellite, dmSatellite);
Application.CreateForm(TfrmProgress, frmProgress);
Splash.Update;
application.ProcessMessages;

View File

@ -91,7 +91,6 @@ type
function CountryFromADIF(adif : Word) : String;
function GetBandFromFreq(freq : string; kHz : Boolean=false): String;
function IsAlertCall(const call,band,mode : String;RegExp :Boolean) : Boolean;
function GetfreeTextFromSpot(ua:String):String;
procedure AddToMarkFile(prefix,call : String;sColor : Integer;Max,lat,long : String);
procedure GetRealCoordinate(lat,long : String; var latitude, longitude: Currency);
@ -99,6 +98,7 @@ type
procedure LoadDXCCRefArray;
procedure LoadExceptionArray;
procedure RunCallAlertCmd(call,band,mode,freq,freeText : String);
procedure GetSplitSpot(Spot:String;var call,freq,info:String);
end;
@ -110,7 +110,7 @@ implementation
{$R *.lfm}
{ TdmDXCluster }
uses dUtils, dData, znacmech, uMyini;
uses dUtils, dData, znacmech, uMyini, fTRXControl;
type Tchyb1 = object(Tchyby) // podedim objekt a prepisu "hlaseni"
//procedure hlaseni(vzkaz,kdo:string);virtual;
@ -129,66 +129,55 @@ begin
Writeln(vzkaz);
end;
}
function TdmDXCluster.GetfreeTextFromSpot(ua:String):String;
Procedure TdmDXCluster.GetSplitSpot(Spot:String;var call,freq,info:String);
var
a:longint;
uz:string;
p,l:integer;
i,n,r : integer;
s,t : String;
Begin
Result:='';
if pos('DX de',ua)=1 then //normal DX spot
Spot:=trim(Spot); //to be sure
//remove extra spaces
repeat
Begin
ExtractWordPos(6,ua,[' '],p); //info part starts at 6th word
if p>0 then
begin
ua := copy(ua,p,length(ua));
for l:=1 to wordCount(ua,[' ']) do
Spot:=StringReplace(Spot,' ',' ',[rfReplaceAll],i);
end;
until i=0;
if (pos('DX DE ',UpperCase(Spot))=1) then //normal cluster spot format
Begin
uz:= ExtractWordPos(l,ua,[' '],p);
if ((length(uz)=5) and (uz[5]='Z')) then //Z is lastchr, length is 5
if TryStrToInt(copy(uz,1,4 ),a ) then
if ((a>=0) and (a<=2400)) then //must be zulu time
Begin // we do not take Zulu time or anything after that
if (p>1) then //something to copy
begin
ua:=trim(copy(ua,1,p-1));
Result:=ua;
if dmData.DebugLevel >=1 then writeln ('DX spot info: ',ua);
call := UpperCase(ExtractDelimited(5,Spot,[' '])); //to be sure case
freq := ExtractDelimited(4,Spot,[' ']);
s:=trim(copy(Spot,pos(call,Spot)+length(call),length(Spot)));
n:=0;
r:=0;
for i:=1 to length(s) do //find zulu time works with telnet and web
Begin
if ((n=4) and (s[i]='Z')) then
Begin
r:= i-5;
break;
end;
end;
end;
end;
end
if (s[i] in ['0'..'9']) then
inc(n)
else
Begin // from command 'sh/dx'
if TryStrToInt( copy(ua,1,pos('.',ExtractWordPos(1,ua,[' '],p))-1),a) then //1st have number (frq) with dot
n:=0;
end;
if (r=0) then r:=i; //r points chars before zulu time, if not found points end of s
info := trim(copy(s,1,r));
end
else //format from sh/dx command
Begin
ExtractWordPos(5,ua,[' '],p); //info part starts at 5th word
if p>0 then
begin
ua := copy(ua,p,length(ua)); //2nd cut from 5th word
a:=0;
for l:=length(ua) downto 1 do
Begin
if ((a=0) and (ua[l]='>')) then a:=1;
if ((a=1) and (ua[l]='<')) then //search word that starts '<' ends '>' start from end of line
begin
if l>1 then
begin
ua := trim(copy(ua,1,l-1)); //cut form start to that word pos
Result:=ua;
if dmData.DebugLevel >=1 then writeln ('sh/dx spot info: ',ua);
break; // that is info
call := UpperCase(ExtractDelimited(2,Spot,[' '])); //to be sure case
freq := ExtractDelimited(1,Spot,[' ']);
t := ExtractDelimited(4,Spot,[' ']); //zulu time
s:=trim(copy(Spot,pos(t,Spot)+length(t),length(Spot)));
i:=Rpos('<',s);
if (i > 0) then
info:= copy(s,1,i-1)
else //should not happen
info:=s;
end;
end;
end;
end;
end;
end;
end;
function TdmDXCluster.MyTryStrToInt(s : String; var i : Integer) : Boolean;
begin
@ -209,6 +198,7 @@ function TdmDXCluster.BandModFromFreq(freq : String;var mode,band : String) : Bo
var
tmp : Extended;
cw, ssb : Extended;
n :String;
begin
EnterCriticalsection(csDX);
try
@ -229,6 +219,7 @@ begin
trBands.RollBack;
trBands.StartTransaction;
qBands.Open;
//qBands.Last; //to get proper count
//Writeln('qBands.RecorfdCount: ',qBands.RecordCount);
if qBands.RecordCount = 0 then
exit;
@ -243,8 +234,12 @@ begin
if (tmp >= ssb) then
mode := 'SSB'
else
mode := 'RTTY';
Begin
n:=IntToStr(frmTRXControl.cmbRig.ItemIndex);
mode := cqrini.ReadString('Band'+n, 'Datamode', 'RTTY')
end;
end;
//Writeln('TdmDXCluster.BandModFromFreq:',Result,' cw ',FloatToStr(cw),' ssb ',FloatToStr(ssb))
finally
LeaveCriticalsection(csDX)
@ -282,12 +277,14 @@ begin
if lotw then
Q.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' AND ((qsl_r='+
QuotedStr('Q')+') OR (lotw_qslr='+QuotedStr('L')+')) AND mode='+
QuotedStr('Q')+') OR (lotw_qslr='+ QuotedStr('L')+
') OR (eqsl_qsl_rcvd='+ QuotedStr('E')+')) AND mode='+
QuotedStr(mode)+' LIMIT 1'
else
Q.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' AND qsl_r='+
QuotedStr('Q')+ ' AND mode='+QuotedStr(mode)+' LIMIT 1';
trQ.StartTransaction;
Q.Open;
if Q.Fields[0].AsInteger > 0 then
@ -1214,6 +1211,7 @@ begin
qCallAlert.Open;
if qCallAlert.RecordCount > 0 then
begin
qCallAlert.Last; //to get proper count
if dmData.DebugLevel>=1 then Writeln('Alert: Call hits with ', qCallAlert.RecordCount,' records');
qCallAlert.First;
while ( (not qCallAlert.Eof) and (not Result) ) do

View File

@ -2,68 +2,69 @@ object dmData: TdmData
OnCreate = DataModuleCreate
OnDestroy = DataModuleDestroy
OldCreateOrder = False
Height = 606
HorizontalOffset = 381
VerticalOffset = 87
Width = 822
PPI = 96
Height = 654
HorizontalOffset = 153
VerticalOffset = 39
Width = 1050
object dsrMain: TDataSource
DataSet = qCQRLOG
left = 304
top = 24
Left = 304
Top = 24
end
object dsrQSOBefore: TDataSource
DataSet = qQSOBefore
left = 304
top = 360
Left = 216
Top = 368
end
object dsrImport: TDataSource
left = 728
top = 528
Left = 728
Top = 528
end
object dsrBands: TDataSource
DataSet = qBands
left = 88
top = 360
Left = 112
Top = 552
end
object dsrWorkedContests: TDataSource
DataSet = qWorkedContests
left = 416
top = 424
Left = 416
Top = 424
end
object dsrProfiles: TDataSource
DataSet = qProfiles
left = 88
top = 24
Left = 88
Top = 24
end
object dsrDXCluster: TDataSource
DataSet = qDXClusters
left = 224
top = 24
Left = 224
Top = 24
end
object dsrQSLMgr: TDataSource
AutoEdit = False
DataSet = qQSLMgr
left = 152
top = 360
Left = 32
Top = 552
end
object mQ: TSQLQuery
FieldDefs = <>
BeforeOpen = mQBeforeOpen
Transaction = trmQ
Params = <>
Macros = <>
ParseSQL = False
left = 632
top = 80
Left = 632
Top = 80
end
object trmQ: TSQLTransaction
Active = False
Action = caNone
left = 632
top = 144
Left = 632
Top = 144
end
object scCommon: TSQLScript
Transaction = trmQ
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -158,11 +159,12 @@ object dmData: TdmData
UseSetTerm = True
UseCommit = True
UseDefines = True
left = 304
top = 472
Left = 304
Top = 472
end
object scLog: TSQLScript
Transaction = trmQ
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -401,9 +403,6 @@ object dmData: TdmData
'ALTER TABLE log_changes'
'ADD INDEX id_cqrlog_main (id_cqrlog_main);'
''
'ALTER TABLE log_changes'
'ADD FOREIGN KEY (id_cqrlog_main) REFERENCES cqrlog_main (id_cqrlog_main) ON DELETE SET NULL ON UPDATE CASCADE;'
''
'CREATE TABLE upload_status ('
' id int NOT NULL AUTO_INCREMENT PRIMARY KEY,'
' logname varchar(30) NOT NULL,'
@ -436,243 +435,258 @@ object dmData: TdmData
UseCommit = False
UseDefines = False
OnException = scLogException
left = 152
top = 472
Left = 152
Top = 472
end
object dsrmQ: TDataSource
DataSet = mQ
left = 632
top = 24
Left = 632
Top = 24
end
object qLogList: TSQLQuery
FieldDefs = <>
BeforeOpen = qLogListBeforeOpen
Transaction = trLogList
Params = <>
Macros = <>
ParseSQL = False
left = 528
top = 216
Left = 528
Top = 216
end
object trLogList: TSQLTransaction
Active = False
Action = caNone
left = 528
top = 288
Left = 528
Top = 288
end
object dsrLogList: TDataSource
DataSet = qLogList
left = 528
top = 360
Left = 368
Top = 368
end
object qSQLConsole: TSQLQuery
PacketRecords = 100
FieldDefs = <>
Transaction = trmQ
Params = <>
Macros = <>
ParseSQL = False
left = 632
top = 216
Left = 632
Top = 216
end
object trSQLConsole: TSQLTransaction
Active = False
Action = caNone
left = 632
top = 288
Left = 632
Top = 288
end
object dsrSQLConsole: TDataSource
DataSet = qSQLConsole
left = 632
top = 360
Left = 632
Top = 360
end
object qQSLMgr: TSQLQuery
FieldDefs = <>
Transaction = trQSLMgr
Params = <>
Macros = <>
ParseSQL = False
left = 152
top = 216
Left = 152
Top = 216
end
object trQSLMgr: TSQLTransaction
Active = False
Action = caNone
left = 152
top = 288
Left = 152
Top = 288
end
object qCallBook: TSQLQuery
FieldDefs = <>
Transaction = trCallBook
Params = <>
left = 24
top = 80
Macros = <>
Left = 24
Top = 80
end
object trCallBook: TSQLTransaction
Active = False
Action = caNone
left = 24
top = 144
Left = 24
Top = 144
end
object trLongNote: TSQLTransaction
Active = False
Action = caNone
left = 728
top = 144
Left = 728
Top = 144
end
object qLongNote: TSQLQuery
FieldDefs = <>
BeforeOpen = qLongNoteBeforeOpen
Transaction = trLongNote
Params = <>
left = 728
top = 80
Macros = <>
Left = 728
Top = 80
end
object qProfiles: TSQLQuery
FieldDefs = <>
Transaction = trProfiles
Params = <>
Macros = <>
ParseSQL = False
left = 88
top = 80
Left = 88
Top = 80
end
object trProfiles: TSQLTransaction
Active = False
Action = caNone
left = 88
top = 144
Left = 88
Top = 144
end
object qIOTAList: TSQLQuery
FieldDefs = <>
Transaction = trIOTAList
Params = <>
Macros = <>
ParseSQL = False
left = 24
top = 216
Left = 24
Top = 216
end
object trIOTAList: TSQLTransaction
Active = False
Action = caNone
left = 24
top = 288
Left = 24
Top = 288
end
object trBands: TSQLTransaction
Active = False
Action = caNone
left = 88
top = 288
Left = 88
Top = 288
end
object trWorkedContests: TSQLTransaction
Active = False
Action = caNone
left = 416
top = 360
Left = 304
Top = 368
end
object qBands: TSQLQuery
FieldDefs = <>
BeforeOpen = qBandsBeforeOpen
Transaction = trBands
Params = <>
Macros = <>
ParseSQL = False
left = 88
top = 216
Left = 88
Top = 216
end
object qWorkedContests: TSQLQuery
FieldDefs = <>
Transaction = trWorkedContests
Params = <>
Macros = <>
ParseSQL = False
left = 122
top = 216
Left = 122
Top = 216
end
object trDXClusters: TSQLTransaction
Active = False
Action = caNone
left = 224
top = 144
Left = 224
Top = 144
end
object qDXClusters: TSQLQuery
FieldDefs = <>
Transaction = trDXClusters
Params = <>
Macros = <>
ParseSQL = False
left = 224
top = 80
Left = 224
Top = 80
end
object trComment: TSQLTransaction
Active = False
Action = caNone
left = 224
top = 288
Left = 224
Top = 288
end
object qComment: TSQLQuery
FieldDefs = <>
Transaction = trComment
Params = <>
Macros = <>
ParseSQL = False
left = 224
top = 216
Left = 224
Top = 216
end
object trException: TSQLTransaction
Active = False
Action = caNone
left = 472
top = 288
Left = 472
Top = 288
end
object qException: TSQLQuery
FieldDefs = <>
Transaction = trException
Params = <>
Macros = <>
ParseSQL = False
left = 472
top = 216
Left = 472
Top = 216
end
object trQSOBefore: TSQLTransaction
Active = False
Action = caNone
left = 304
top = 288
Left = 304
Top = 288
end
object qQSOBefore: TSQLQuery
FieldDefs = <>
Transaction = trQSOBefore
Params = <>
Macros = <>
ParseSQL = False
left = 299
top = 216
Left = 299
Top = 216
end
object trQ1: TSQLTransaction
Active = False
Action = caNone
left = 528
top = 144
Left = 528
Top = 144
end
object Q1: TSQLQuery
FieldDefs = <>
BeforeOpen = Q1BeforeOpen
Transaction = trQ1
Params = <>
Macros = <>
ParseSQL = False
left = 528
top = 80
Left = 528
Top = 80
end
object trQ: TSQLTransaction
Active = False
Action = caNone
left = 472
top = 144
Left = 472
Top = 144
end
object Q: TSQLQuery
FieldDefs = <>
BeforeOpen = QBeforeOpen
Transaction = trQ
Params = <>
Macros = <>
ParseSQL = False
left = 472
top = 80
Left = 472
Top = 80
end
object trCQRLOG: TSQLTransaction
Active = False
Action = caNone
left = 304
top = 144
Left = 304
Top = 144
end
object qCQRLOG: TSQLQuery
PacketRecords = 100
@ -680,12 +694,14 @@ object dmData: TdmData
BeforeOpen = qCQRLOGBeforeOpen
Transaction = trCQRLOG
Params = <>
Macros = <>
ParseSQL = False
left = 304
top = 80
Left = 304
Top = 80
end
object scViews: TSQLScript
Transaction = trmQ
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -715,16 +731,17 @@ object dmData: TdmData
UseCommit = True
UseDefines = True
OnException = scViewsException
left = 224
top = 472
Left = 224
Top = 472
end
object tmrDBPing: TTimer
Enabled = False
OnTimer = tmrDBPingTimer
left = 16
top = 24
Left = 16
Top = 24
end
object scQSLExport: TSQLScript
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -781,11 +798,12 @@ object dmData: TdmData
UseSetTerm = True
UseCommit = True
UseDefines = True
left = 528
top = 472
Left = 528
Top = 472
end
object scOnlineLogTriggers: TSQLScript
Transaction = trmQ
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -818,10 +836,11 @@ object dmData: TdmData
UseSetTerm = True
UseCommit = True
UseDefines = True
left = 416
top = 472
Left = 416
Top = 472
end
object scMySQLConfig: TSQLScript
AutoCommit = False
UseDollarString = False
Directives.Strings = (
'SET TERM'
@ -907,84 +926,140 @@ object dmData: TdmData
UseSetTerm = True
UseCommit = True
UseDefines = True
left = 40
top = 472
Left = 40
Top = 472
end
object qBandMapFil: TSQLQuery
FieldDefs = <>
Params = <>
left = 728
top = 216
Macros = <>
Left = 728
Top = 216
end
object trBandMapFil: TSQLTransaction
Active = False
left = 728
top = 288
Left = 728
Top = 288
end
object qRbnMon: TSQLQuery
FieldDefs = <>
Params = <>
left = 152
top = 80
Macros = <>
Left = 152
Top = 80
end
object trRbnMon: TSQLTransaction
Active = False
left = 152
top = 144
Left = 152
Top = 144
end
object qFreqMem: TSQLQuery
FieldDefs = <>
Transaction = trFreqMem
Params = <>
left = 368
top = 216
Macros = <>
Left = 600
Top = 544
end
object trFreqMem: TSQLTransaction
Active = False
left = 368
top = 288
Left = 528
Top = 544
end
object W: TSQLQuery
FieldDefs = <>
BeforeOpen = WBeforeOpen
Transaction = trW
Params = <>
left = 368
top = 80
Macros = <>
Left = 368
Top = 80
end
object trW: TSQLTransaction
Active = False
Action = caNone
left = 368
top = 144
Left = 368
Top = 144
end
object W1: TSQLQuery
FieldDefs = <>
BeforeOpen = W1BeforeOpen
Transaction = trW1
Params = <>
left = 416
top = 80
Macros = <>
Left = 416
Top = 80
end
object trW1: TSQLTransaction
Active = False
Action = caNone
left = 416
top = 144
Left = 416
Top = 144
end
object Q2: TSQLQuery
FieldDefs = <>
BeforeOpen = Q2BeforeOpen
Transaction = trQ2
Params = <>
Macros = <>
ParseSQL = False
left = 576
top = 80
Left = 576
Top = 80
end
object trQ2: TSQLTransaction
Active = False
Action = caNone
left = 576
top = 144
Left = 576
Top = 144
end
object CQ: TSQLQuery
FieldDefs = <>
BeforeOpen = QBeforeOpen
Transaction = trCQ
Params = <>
Macros = <>
ParseSQL = False
Left = 680
Top = 80
end
object trCQ: TSQLTransaction
Active = False
Action = caNone
Left = 680
Top = 144
end
object dsrFreqs: TDataSource
DataSet = qFreqs
Left = 24
Top = 368
end
object trFreqs: TSQLTransaction
Active = False
Action = caNone
Left = 144
Top = 368
end
object qFreqs: TSQLQuery
FieldDefs = <>
BeforeOpen = qBandsBeforeOpen
Transaction = trFreqs
Params = <>
Macros = <>
ParseSQL = False
Left = 88
Top = 368
end
object qFreqMemGrid: TSQLQuery
FieldDefs = <>
Transaction = trFreqMemGrid
Params = <>
Macros = <>
Left = 352
Top = 552
end
object trFreqMemGrid: TSQLTransaction
Active = False
Left = 440
Top = 552
end
end

View File

@ -24,8 +24,8 @@ uses
const
cDB_LIMIT = 500;
cDB_MAIN_VER = 18;
cDB_COMN_VER = 5;
cDB_MAIN_VER = 19;
cDB_COMN_VER = 6;
cDB_PING_INT = 300; //ping interval for database connection in seconds
//program crashed after long time of inactivity
//so now after cDB_PING_INT will be run simple sql query
@ -55,11 +55,17 @@ type
{ TdmData }
TdmData = class(TDataModule)
dsrFreqs: TDataSource;
dsrSQLConsole: TDatasource;
dsrLogList: TDatasource;
dsrmQ: TDatasource;
mQ: TSQLQuery;
Q2: TSQLQuery;
CQ: TSQLQuery;
qFreqMemGrid: TSQLQuery;
qFreqs: TSQLQuery;
trFreqMemGrid: TSQLTransaction;
trFreqs: TSQLTransaction;
trQ2: TSQLTransaction;
qSQLConsole: TSQLQuery;
scCommon: TSQLScript;
@ -86,7 +92,9 @@ type
qBandMapFil: TSQLQuery;
qRbnMon: TSQLQuery;
qFreqMem: TSQLQuery;
trCQ: TSQLTransaction;
trW: TSQLTransaction;
trWorkedContests: TSQLTransaction;
W1: TSQLQuery;
trW1: TSQLTransaction;
W: TSQLQuery;
@ -160,12 +168,14 @@ type
MySQLProcess : TProcess;
csPreviousQSO : TRTLCriticalSection;
fMySQLVersion : Currency;
FreqMemCount : integer;
function FindLib(const Path,LibName : String) : String;
function GetMysqldPath : String;
function TableExists(TableName : String) : Boolean;
function GetDebugLevel : Integer;
function FieldExists(TableName, FieldName : String) : Boolean;
function ConstraintExists(TableName, ConstraintName : String) : Boolean;
procedure CreateDBConnections;
procedure CreateViews;
@ -192,6 +202,7 @@ type
eQSLUsers : Array of ShortString;
CallArray : Array of String[20];
IsFilterSQL : String; //String that is created with Filter settings. Isvalid if isfilter is valid, no cleanups.
IsFilter : Boolean;
IsSFilter : Boolean; //Search filter
//search function uses filter function but user doesn't need to know about it
@ -766,7 +777,11 @@ begin
dmUtils.LoadBandsSettings;
frmTRXControl.InicializeRig;
frmTRXControl.cmbRig.ItemIndex:=cqrini.ReadInteger('TRX', 'RigInUse', 1);
frmTRXControl.cmbRigCloseUp(nil);
frmTRXControl.InitializeRig;
frmRotControl.rbRotor1.Checked:= cqrini.ReadBool('ROT','Use1',True);
frmRotControl.rbRotor2.Checked:= not(cqrini.ReadBool('ROT','Use1',True));
frmRotControl.InicializeRot;
OpenFreqMemories('');
@ -1675,10 +1690,18 @@ begin
QuotedStr('10M')+',28.000,30.000,28.070,28.070,28.300)';
Q.ExecSQL;
Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('8M')+',40.0000,45.0000,40.3000,40.3000,40.6800)';
Q.ExecSQL;
Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('6M')+',50.000,52.000,50.110,50.110,50.120)';
Q.ExecSQL;
Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('5M')+',54.0000,69.9000,59.5000,59.6000,59.6000)';
Q.ExecSQL;
Q.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('4M')+',70.000,71.000,70.150,70.150,70.150)';
Q.ExecSQL;
@ -2583,8 +2606,8 @@ begin
try
Q.Open;
Q.Last;
Q.First;
Result := dmData.Q.RecordCount
//Q.First;
finally
Q.Close;
trQ.RollBack
@ -2753,6 +2776,18 @@ begin
Q1.ExecSQL;
end;
if old_version < 6 then
begin
Q1.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('8M')+',40.0000,45.0000,40.3000,40.3000,40.6800)';
if fDebugLevel>=1 then Writeln(Q1.SQL.Text);
Q1.ExecSQL;
Q1.SQL.Text := 'INSERT INTO cqrlog_common.bands (band,b_begin,b_end,cw,rtty,ssb) VALUES (' +
QuotedStr('5M')+',54.0000,69.9000,59.5000,59.6000,59.6000)';
if fDebugLevel>=1 then Writeln(Q1.SQL.Text);
Q1.ExecSQL;
end;
Q1.SQL.Text := 'update cqrlog_common.db_version set nr='+IntToStr(cDB_COMN_VER);
if fDebugLevel>=1 then Writeln(Q1.SQL.Text);
Q1.ExecSQL
@ -2774,6 +2809,7 @@ end;
procedure TdmData.UpgradeMainDatabase(old_version : Integer);
var
err : Boolean = False;
max : Integer;
begin
if fDebugLevel>=1 then Writeln('[UpgradeMainDatabase] Old version: ', old_version, ' cDB_MAIN_VER: ', cDB_MAIN_VER);
@ -3160,6 +3196,33 @@ begin
end;
end;
if (old_version < 19) then
begin
if (ConstraintExists('log_changes', 'log_changes_ibfk_1')) then
begin
trQ1.StartTransaction;
Q1.SQL.Text := 'ALTER TABLE log_changes DROP FOREIGN KEY log_changes_ibfk_1';
if fDebugLevel>=1 then Writeln(Q1.SQL.Text);
Q1.ExecSQL;
trQ1.Commit;
end;
// PrepareEmptyLogUploadStatusTables() would have been called
// for older versions
if (old_version >= 8) then
begin
trQ1.StartTransaction;
Q1.SQL.Text := 'select max(id) from log_changes';
Q1.Open;
max := Q1.Fields[0].AsInteger;
Q1.Close;
Q1.SQL.Text := 'insert into upload_status (logname, id_log_changes) values ('+QuotedStr(C_UDPLOG)+','+IntToStr(max)+')';
if fDebugLevel>=1 then Writeln(Q1.SQL.Text);
Q1.ExecSQL;
trQ1.Commit;
end;
end;
if TableExists('view_cqrlog_main_by_callsign') then
begin
trQ1.StartTransaction;
@ -3435,9 +3498,11 @@ begin
trBands.RollBack;
trBands.StartTransaction;
qBands.Open;
qBands.Last; //to get proper record count
if dmData.DebugLevel>=1 then Writeln('qBands.RecorfdCount: ',qBands.RecordCount);
if qBands.RecordCount = 0 then
exit;
qBands.First;
band := qBands.Fields[1].AsString;
cw := qBands.Fields[4].AsFloat;
ssb := qBands.Fields[6].AsFloat;
@ -3665,6 +3730,33 @@ begin
end
end;
function TdmData.ConstraintExists(TableName, ConstraintName : String) : Boolean;
const
C_SEL = 'select constraint_name from information_schema.table_constraints where table_schema=%s and table_name=%s and constraint_name=%s';
var
t : TSQLQuery;
tr : TSQLTransaction;
begin
Result := True;
t := TSQLQuery.Create(nil);
tr := TSQLTransaction.Create(nil);
try
t.Transaction := tr;
tr.DataBase := MainCon;
t.DataBase := MainCon;
t.SQL.Text := Format(C_SEL,[QuotedStr(fDBName),QuotedStr(TableName), QuotedStr(ConstraintName)]);
if fDebugLevel>=1 then Writeln(t.SQL.Text);
t.Open;
Result := t.RecordCount>0
finally
t.Close;
tr.Rollback;
FreeAndNil(t);
FreeAndNil(tr)
end
end;
procedure TdmData.PrepareEmptyLogUploadStatusTables(lQ : TSQLQuery;lTr : TSQLTransaction);
var
@ -3691,6 +3783,10 @@ begin
if fDebugLevel>=1 then Writeln(lQ.SQL.Text);
lQ.ExecSQL;
lQ.SQL.Text := 'insert into upload_status (logname, id_log_changes) values ('+QuotedStr(C_UDPLOG)+',1)';
if fDebugLevel>=1 then Writeln(lQ.SQL.Text);
lQ.ExecSQL;
if Commit then
lTr.Commit
end;
@ -3932,52 +4028,61 @@ var
i : Integer;
begin
try try
dmData.trQ.StartTransaction;
dmData.Q.SQL.Text := C_DEL;
dmData.Q.ExecSQL;
dmData.Q.SQL.Text := C_INS;
dmData.qFreqMemGrid.Close;
if dmData.trFreqMemGrid.Active then dmData.trFreqMemGrid.Rollback;
dmData.trFreqMemGrid.StartTransaction;
dmData.qFreqMemGrid.SQL.Text := C_DEL;
dmData.qFreqMemGrid.ExecSQL;
dmData.trFreqMemGrid.Commit;
dmData.trFreqMemGrid.StartTransaction;
dmData.qFreqMemGrid.SQL.Text := C_INS;
for i:= 1 to grid.RowCount-1 do
begin
Q.Prepare;
Q.Params[0].AsFloat := StrToFloat(grid.Cells[0,i]);
Q.Params[1].AsString := grid.Cells[1,i];
Q.Params[2].AsInteger := StrToInt(grid.Cells[2,i]);
Q.Params[3].AsString := grid.Cells[3,i];
Q.ExecSQL
qFreqMemGrid.Prepare;
qFreqMemGrid.Params[0].AsFloat := StrToFloat(grid.Cells[0,i]);
qFreqMemGrid.Params[1].AsString := grid.Cells[1,i];
qFreqMemGrid.Params[2].AsInteger := StrToInt(grid.Cells[2,i]);
qFreqMemGrid.Params[3].AsUTF8String := grid.Cells[3,i];
qFreqMemGrid.ExecSQL;
end
except
dmData.trQ.Rollback
dmData.trFreqMemGrid.Rollback
end
finally
dmData.Q.Close;
if dmData.trQ.Active then
dmData.trQ.Commit;
dmData.qFreqMemGrid.Close;
if dmData.trFreqMemGrid.Active then
dmData.trFreqMemGrid.Commit;
OpenFreqMemories(frmTRXControl.GetRawMode)
end
end;
procedure TdmData.LoadFreqMemories(grid : TStringGrid);
const
C_SEL = 'select freq,mode,bandwidth,info from freqmem order by id';
C_SEL = 'select freq,mode,bandwidth,info from freqmem order by freq';
begin
try
grid.clear;
grid.RowCount := 1;
dmData.trQ.StartTransaction;
dmData.Q.SQL.Text := C_SEL;
dmData.Q.Open;
while not dmData.Q.Eof do
dmData.qFreqMemGrid.Close;
if dmData.trFreqMemGrid.Active then dmData.trFreqMemGrid.Rollback;
dmData.trFreqMemGrid.StartTransaction;
dmData.qFreqMemGrid.SQL.Text := C_SEL;
dmData.qFreqMemGrid.Open;
while not dmData.qFreqMemGrid.Eof do
begin
grid.RowCount := grid.RowCount + 1;
grid.Cells[0,grid.RowCount-1] := FloatToStrF(Q.Fields[0].AsFloat,ffFixed,15,3);
grid.Cells[1,grid.RowCount-1] := Q.Fields[1].AsString;
grid.Cells[2,grid.RowCount-1] := IntToStr(Q.Fields[2].AsInteger);
grid.Cells[3,grid.RowCount-1] := Q.Fields[3].AsString;
Q.Next
grid.Cells[0,grid.RowCount-1] := FloatToStrF(qFreqMemGrid.Fields[0].AsFloat,ffFixed,15,3);
grid.Cells[1,grid.RowCount-1] := qFreqMemGrid.Fields[1].AsString;
grid.Cells[2,grid.RowCount-1] := IntToStr(qFreqMemGrid.Fields[2].AsInteger);
grid.Cells[3,grid.RowCount-1] := qFreqMemGrid.Fields[3].AsUTF8String;
qFreqMemGrid.Next
end
finally
dmData.Q.Close;
dmData.trQ.Rollback
dmData.qFreqMemGrid.Close;
dmData.trFreqMemGrid.Rollback
end
end;
procedure TdmData.OpenFreqMemories(mode : String);
@ -3987,8 +4092,7 @@ var
c : integer;
begin
qFreqMem.Close;
if trFreqMem.Active then
trFreqMem.Rollback;
if trFreqMem.Active then trFreqMem.Rollback;
if not cqrini.ReadBool('TRX','MemModeRelated',False) then mode:=''; //use related settings!!
@ -4007,21 +4111,24 @@ begin
qFreqMem.SQL.Text := C_SEL + ' where (mode = ' + QuotedStr(mode) +') order by id'
end;
end;
if fDebugLevel>=1 then Writeln('FreqmemSql:',qFreqMem.SQL.Text);
if fDebugLevel>=1 then
Writeln('FreqmemSql:',qFreqMem.SQL.Text);
trFreqMem.StartTransaction;
qFreqMem.Open;
qFreqMem.Last; //to get proper record count
FreqMemCount:=qFreqMem.RecordCount;
setLength(MemNR,(FreqMemCount)+1);
qFreqMem.First;
qFreqMem.prior;
fFirstMemId := qFreqMem.Fields[0].AsInteger;
c:=-1;
setLength(MemNR,qFreqMem.RecordCount+1);
repeat
begin
inc(c);
MemNR[c]:= qFreqMem.Fields[0].AsInteger;
if fDebugLevel>=1 then Writeln('FreqmemNR:',c,'=',MemNR[c]);
if fDebugLevel>=1 then
Writeln('FreqmemNR:',c,'=',MemNR[c]);
qFreqMem.Next;
end;
until qFreqMem.Eof;
@ -4030,14 +4137,15 @@ begin
fLastMemId := qFreqMem.Fields[0].AsInteger;
if fDebugLevel>=1 then Writeln('FreqmemFirst:',fFirstMemId,' FreqmemLast:',fLastMemId);
if fDebugLevel>=1 then
Writeln('FreqmemFirst:',fFirstMemId,' FreqmemLast:',fLastMemId);
end;
procedure TdmData.GetCurrentFreqFromMem(var freq : Double; var mode : String; var bandwidth : Integer; var info : String);
var
c: integer;
begin
if qFreqMem.Active and (qFreqMem.RecordCount > 0) then
if qFreqMem.Active and (FreqMemCount > 0) then
begin
freq := qFreqMem.Fields[1].AsFloat;
mode := qFreqMem.Fields[2].AsString;
@ -4046,9 +4154,9 @@ begin
frmTRXControl.edtMemNr.Font.Color:= clDefault; // May be red if previous was "None"
if info='' then
begin
for c:=0 to qFreqMem.RecordCount do
for c:=0 to FreqMemCount do
if MemNR[c]= qFreqMem.Fields[0].AsInteger then break;
frmTRXControl.edtMemNr.Text := IntToStr(c+1)+' of '+ IntToStr(qFreqMem.RecordCount );
frmTRXControl.edtMemNr.Text := IntToStr(c+1)+' of '+ IntToStr(FreqMemCount);
end
else frmTRXControl.edtMemNr.Text := info;
frmTRXControl.infosetstage :=1;

View File

@ -8,16 +8,18 @@ uses
Classes, SysUtils, sqldb, FileUtil, LResources,
dynlibs, lcltype, ExtCtrls, sqlscript, process, mysql51dyn, ssl_openssl_lib,
mysql55dyn, mysql55conn, mysql51conn, db, httpsend, blcksock, synautil, Forms,
Graphics, mysql56conn, mysql56dyn, mysql57dyn, mysql57conn;
Graphics, mysql56conn, mysql56dyn, mysql57dyn, mysql57conn,
lNet, lNetComponents, laz2_DOM, laz2_XMLWrite, md5;
const
C_HAMQTH = 'HamQTH';
C_CLUBLOG = 'ClubLog';
C_HRDLOG = 'HRDLog';
C_UDPLOG = 'UDPLog';
C_ALLDONE = 'ALLDONE';
C_CLUBLOG_API = '21507885dece41ca049fec7fe02a813f2105aff2';
type
TWhereToUpload = (upHamQTH, upClubLog, upHrdLog);
TWhereToUpload = (upHamQTH, upClubLog, upHrdLog, upUDPLog);
type
@ -40,22 +42,26 @@ type
function RemoveSpaces(s : String) : String;
function GetQSOInAdif(id_cqrlog_main : Integer) : String;
function EncodeBandForClubLog(band : String) : String;
function EncodeBandForUDPLog(band : String) : String;
function ParseHrdLogOutput(Output : String; var Response : String) : Integer;
procedure AddQSOKeyValue(id_cqrlog_main : Integer; data : TStringList);
public
csLogUpload : TRTLCriticalSection;
function UploadLogData(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
function UploadLogData(where : TWhereToUpload; cmd: String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
function UploadLogDataHTTP(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
function UploadLogDataUDP(cmd : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
function CheckUserUploadSettings(where : TWhereToUpload) : String;
function GetLogUploadColor(where : TWhereToUpload) : Integer;
function GetUploadUrl(where : TWhereToUpload; cmd : String) : String;
function GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var FatalError : Boolean) : String;
function GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var ErrorCode : Integer) : String;
function LogUploadEnabled : Boolean;
procedure MarkAsUploadedToAllOnlineLogs;
procedure MarkAsUploaded(LogName : String);
procedure PrepareUserInfoHeader(where : TWhereToUpload; data : TStringList);
procedure PrepareInsertHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList);
procedure PrepareDeleteHeader(where : TWhereToUpload; id_log_changes : Integer; data : TStringList);
procedure PrepareDeleteHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList);
procedure MarkAsUploaded(LogName : String; id_log_changes : Integer);
procedure MarkAsUpDeleted(id_log_upload : Integer);
procedure DisableOnlineLogSupport;
@ -106,8 +112,16 @@ begin
if dmData.DebugLevel >=1 then Writeln(Q.SQL.Text)
end;
function TdmLogUpload.UploadLogData(where : TWhereToUpload; cmd: String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
begin
case where of
upUDPLog : Result := UploadLogDataUDP(cmd,data,Response,ResultCode)
else
Result := UploadLogDataHTTP(dmLogUpload.GetUploadUrl(where,cmd), data, Response, ResultCode);
end; // case
end;
function TdmLogUpload.UploadLogData(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
function TdmLogUpload.UploadLogDataHTTP(Url : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
var
HTTP : THTTPSend;
Bound : string;
@ -159,6 +173,106 @@ begin
end
end;
function TdmLogUpload.UploadLogDataUDP(cmd : String; data : TStringList; var Response : String; var ResultCode : Integer) : Boolean;
var
i : Integer;
Key : String;
Value : String;
Address : String;
udp : TLUDPComponent;
n : Integer;
Doc : TXMLDocument;
RootNode,ItemNode,TextNode: TDOMNode;
msg : TStringStream;
msg_len : Integer;
sent : Integer;
begin
Result := False;
sent := 0;
Address := '';
try
Doc := TXMLDocument.Create;
if (cmd='DELETE') then
RootNode := Doc.CreateElement('contactdelete')
else if (cmd='UPDATE') then
RootNode := Doc.CreateElement('contactreplace')
else // INSERT
RootNode := Doc.CreateElement('contactinfo');
Doc.Appendchild(RootNode);
RootNode := Doc.DocumentElement;
for i:=0 to data.Count-1 do
begin
Key := copy(data.Strings[i],1,Pos('=',data.Strings[i])-1);
Value := copy(data.Strings[i],Pos('=',data.Strings[i])+1,Length(data.Strings[i])-Pos('=',data.Strings[i])+1);
case Key of
'Address' : Address := Value;
else
ItemNode := Doc.CreateElement(Key);
TextNode := Doc.CreateTextNode(Value);
ItemNode.AppendChild(TextNode);
RootNode.AppendChild(ItemNode)
end; // case
end;
if (Address='') then
begin
ResultCode := 500;
Response := 'Address not set; check config';
Result := True;
exit
end;
try
msg := TStringStream.Create('', TEncoding.UTF8);
WriteXMLFile(Doc, msg);
except
FreeAndNil(msg);
raise;
end;
finally
FreeAndNil(Doc);
end;
msg_len := Length(msg.DataString);
try
udp := TLUDPComponent.Create(nil);
n := Pos(':', Address);
if n > 0 then
begin
udp.Host := Copy(Address, 1, n-1);
udp.Port := StrToInt(Copy(Address, n+1, Length(Address)));
end
else
begin
udp.Host := Address;
udp.Port := 5444;
end;
if udp.Connect then sent := udp.SendMessage(msg.DataString, Address);
finally
if udp.Connected then udp.Disconnect;
FreeAndNil(udp);
FreeAndNil(msg);
end;
if (sent = msg_len) then
begin
ResultCode := 200;
Response := 'Success';
Result := True;
end
else
begin
ResultCode := 400;
Response := 'Failed. Only sent ' + IntToStr(sent) + ' of ' + IntToStr(msg_len) + ' bytes to ' + Address;
Result := False
end;
end;
procedure TdmLogUpload.MarkAsUploadedToAllOnlineLogs;
var
err : Boolean = False;
@ -412,6 +526,42 @@ begin
end
end;
function TdmLogUpload.EncodeBandForUDPLog(band : String) : String;
var
i : Integer;
begin
case band of
'160M' : Result := '1.8';
'80M' : Result := '3.5';
'60M' : Result := '5';
'40M' : Result := '7';
'30M' : Result := '10';
'20M' : Result := '14';
'17M' : Result := '18';
'15M' : Result := '21';
'12M' : Result := '24';
'10M' : Result := '28';
'6M' : Result := '50';
'4M' : Result := '70';
'2M' : Result := '144';
'1.25M' : Result := '222';
'70CM' : Result := '420';
'33CM' : Result := '902';
'23CM' : Result := '1240';
'13CM' : Result := '2300';
'9CM' : Result := '3300';
'6CM' : Result := '5650';
'3CM' : Result := '10000';
'1.25CM' : Result := '24000';
'6MM' : Result := '47000';
'4MM' : Result := '76000';
'2MM' : Result := '142000';
'1MM' : Result := '241000';
else
Result := '';
end;
end;
function TdmLogUpload.ParseHrdLogOutput(Output : String; var Response : String) : Integer;
var
msg : String = '';
@ -433,6 +583,54 @@ begin
end
end;
procedure TdmLogUpload.AddQSOKeyValue(id_cqrlog_main : Integer; data : TStringList);
begin
Q1.Close;
if trQ1.Active then trQ1.Rollback;
trQ1.StartTransaction;
try
Q1.SQL.Text := 'select * from cqrlog_main where id_cqrlog_main = '+IntToStr(id_cqrlog_main);
Q1.Open;
if Q1.Fields[0].IsNull then
begin //this should not happen
if dmData.DebugLevel>=1 then Writeln('AddQsoKeyValue: QSO not found in the log. ID:', id_cqrlog_main);
exit
end;
data.Add('snt='+Q1.FieldByName('rst_s').AsString);
data.Add('rcv='+Q1.FieldByName('rst_r').AsString);
data.Add('name='+Q1.FieldByName('name').AsString);
data.Add('qth='+Q1.FieldByName('qth').AsString);
data.Add('gridsquare='+Q1.FieldByName('loc').AsString);
data.Add('continent='+Q1.FieldByName('cont').AsString);
data.Add('zone='+Q1.FieldByName('waz').AsString);
{
data.Add('zone='+Q1.FieldByName('itu').AsString);
}
data.Add('power='+Q1.FieldByName('pwr').AsString);
data.Add('contestname='+Q1.FieldByName('contestname').AsString);
data.Add('operator='+Q1.FieldByName('operator').AsString);
if cqrini.ReadBool('OnlineLog','UdIncExch',True) then
begin
data.Add('sntnr='+Q1.FieldByName('stx').AsString);
data.Add('rcvnr='+Q1.FieldByName('srx').AsString);
data.Add('exchange1='+Q1.FieldByName('stx_string').AsString+' '+Q1.FieldByName('srx_string').AsString)
end
else
begin
data.Add('sntnr=');
data.Add('rcvnr=');
data.Add('exchange1=');
end;
finally
Q1.Close;
trQ1.Rollback
end
end;
function TdmLogUpload.CheckUserUploadSettings(where : TWhereToUpload) : String;
const
C_IS_NOT_SET = '%s is not set! Go to Preferences and change settings.';
@ -458,6 +656,10 @@ begin
Result := C_HRDLOG + ' ' + Format(C_IS_NOT_SET,['Callsign'])
else if (cqrini.ReadString('OnlineLog','HrCode','')='') then
Result := C_HRDLOG + ' ' + Format(C_IS_NOT_SET,['Code'])
end;
upUDPLog : begin
if (cqrini.ReadString('OnlineLog','UdAddress','')='') then
Result := C_UDPLOG + ' ' + Format(C_IS_NOT_SET,['Address'])
end
end //case
end;
@ -468,7 +670,8 @@ begin
case where of
upHamQTH : Result := cqrini.ReadInteger('OnlineLog','HaColor',clBlue);
upClubLog : Result := cqrini.ReadInteger('OnlineLog','ClColor',clRed);
upHrdLog : Result := cqrini.ReadInteger('OnlineLog','HrColor',clPurple)
upHrdLog : Result := cqrini.ReadInteger('OnlineLog','HrColor',clPurple);
upUDPLog : Result := cqrini.ReadInteger('OnlineLog','UdColor',clGreen)
end
end;
@ -491,6 +694,11 @@ begin
data.Add('Code='+cqrini.ReadString('OnlineLog','HrCode',''));
data.Add('App=CQRLOG')
end;
upUDPLog : begin
data.Add('Address='+cqrini.ReadString('OnlineLog','UdAddress',''));
data.Add('mycall='+cqrini.ReadString('Station', 'Call', ''));
data.Add('app=CQRLOG')
end;
end //case
end;
@ -539,6 +747,25 @@ begin
end;
upHrdLog : begin
data.Add('ADIFData='+adif)
end;
upUDPLog : begin
data.Add('IsOriginal=True');
data.Add('timestamp='+Q2.FieldByName('qsodate').AsString+' '+Q2.FieldByName('time_on').AsString+':00');
data.Add('call='+Q2.FieldByName('callsign').AsString);
data.Add('band='+EncodeBandForUDPLog(Q2.FieldByName('band').AsString));
data.Add('mode='+Q2.FieldByName('mode').AsString);
data.Add('rxfreq='+IntToStr(round(Q2.FieldByName('freq').AsFloat*100000)));
data.Add('txfreq='+IntToStr(round(Q2.FieldByName('freq').AsFloat*100000)));
if (id_cqrlog_main>0) then
begin
AddQSOKeyValue(id_cqrlog_main, data);
data.Add('ID='+MD5Print(MD5String(cqrini.ReadString('Station', 'Call', '') + ':' + IntToStr(id_cqrlog_main))));
end;
if (Q2.FieldByName('old_qsodate').AsString <> '') then
begin
data.Add('oldtimestamp='+Q2.FieldByName('old_qsodate').AsString+' '+Q2.FieldByName('old_time_on').AsString+':00');
data.Add('oldcall='+Q2.FieldByName('old_callsign').AsString);
end
end
end //case
finally
@ -547,7 +774,7 @@ begin
end
end;
procedure TdmLogUpload.PrepareDeleteHeader(where : TWhereToUpload; id_log_changes : Integer; data : TStringList);
procedure TdmLogUpload.PrepareDeleteHeader(where : TWhereToUpload; id_log_changes,id_cqrlog_main : Integer; data : TStringList);
const
C_SEL_LOG_CHANGES = 'select * from log_changes where id = %d';
var
@ -587,6 +814,18 @@ begin
GetAdifValue('CALL',Q2.FieldByName('old_callsign').AsString);
data.Add('ADIFKey='+adif);
data.Add('Cmd=DELETE')
end;
upUDPLog : begin
data.Add('timestamp='+Q2.FieldByName('old_qsodate').AsString+' '+Q2.FieldByName('old_time_on').AsString+':00');
data.Add('call='+Q2.FieldByName('old_callsign').AsString);
data.Add('band='+EncodeBandForUDPLog(Q2.FieldByName('old_band').AsString));
data.Add('mode='+Q2.FieldByName('old_mode').AsString);
data.Add('rxfreq='+IntToStr(round(Q2.FieldByName('old_freq').AsFloat*100000)));
data.Add('txfreq='+IntToStr(round(Q2.FieldByName('old_freq').AsFloat*100000)));
if (id_cqrlog_main>0) then
begin
data.Add('ID='+MD5Print(MD5String(cqrini.ReadString('Station', 'Call', '') + ':' + IntToStr(id_cqrlog_main))));
end
end
end //case
finally
@ -599,21 +838,21 @@ function TdmLogUpload.GetUploadUrl(where : TWhereToUpload; cmd : String) : Strin
begin
Result := '';
case where of
upHamQTH : Result := 'http://www.hamqth.com/qso_realtime.php';
upHamQTH : Result := cqrini.ReadString('OnlineLog','HaUrl','http://www.hamqth.com/qso_realtime.php');
upClubLog : begin
if (cmd='DELETE') then
Result := 'https://secure.clublog.org/delete.php'
Result := cqrini.ReadString('OnlineLog','ClUrlDel','https://clublog.org/delete.php')
else
Result := 'https://secure.clublog.org/realtime.php'
Result := cqrini.ReadString('OnlineLog','ClUrl','https://clublog.org/realtime.php');
end;
upHrdLog : Result := 'http://robot.hrdlog.net/NewEntry.aspx'
upHrdLog : Result := cqrini.ReadString('OnlineLog','HrUrl','http://robot.hrdlog.net/NewEntry.aspx');
end //case
end;
function TdmLogUpload.GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var FatalError : Boolean) : String;
function TdmLogUpload.GetResultMessage(where : TWhereToUpload; Response : String; ResultCode : Integer; var ErrorCode : Integer) : String;
begin
Result := '';
FatalError := False;
ErrorCode := 0;
Response := Trim(Response);
case where of
@ -622,26 +861,26 @@ begin
200 : Result := 'OK';
500 : begin
Result := Response;
FatalError := True
ErrorCode := 1;
end;//something wrong with HamQTH server
400 : begin
Result := Response;
if (Response = 'QSO already exists in the log') then
Result := 'Already exists'
else if (Response = 'QSO not found in the log!') then
FatalError := False
ErrorCode := 0
else begin
FatalError := True; //QSO rejected
ErrorCode := 2; //QSO rejected; continue with next one
Result := Response
end
end;
403 : begin
Result := 'Access denied';
FatalError := True
Errorcode := 1
end
else begin
Result := Response;
FatalError := True
ErrorCode := 1
end
end
end;
@ -651,29 +890,49 @@ begin
400 : begin
Result := Response;
if (Pos('skipping qso',LowerCase(Response))=0) then //consider skiping QSO as non fatal error, the app can live with it :)
FatalError := True
ErrorCode := 2
end;
403 : begin
Result := 'Access denied';
FatalError := True
ErrorCode := 1
end;
500 : begin
Result := 'Internal error';
FatalError := True
ErrorCode := 2
end;
404 : begin
Result := Response;
FatalError := True
if (Response = 'QSO Details Not Matched') then
begin
ErrorCode := 2;
end
else
begin
ErrorCode := 1;
end;
end
end //case
end;
upHrdLog : begin
case ParseHrdLogOutput(Response,Result) of
200 : Result := 'OK';
400 : FatalError := True;
403 : FatalError := True;
500 : FatalError := True;
404 : FatalError := True
400 : ErrorCode := 2;
403 : ErrorCode := 2;
500 : ErrorCode := 1;
404 : ErrorCode := 2
end //case
end;
upUDPLog : begin
case ResultCode of
200 : Result := 'OK';
400 : begin
Result := Response;
ErrorCode := 2
end;
500 : begin
Result := Response;
ErrorCode := 1
end
end //case
end
end //case
@ -739,7 +998,8 @@ function TdmLogUpload.LogUploadEnabled : Boolean;
begin
Result := cqrini.ReadBool('OnlineLog','HaUp',False) or
cqrini.ReadBool('OnlineLog','ClUp',False) or
cqrini.ReadBool('OnlineLog','HrUp',False)
cqrini.ReadBool('OnlineLog','HrUp',False) or
cqrini.ReadBool('OnlineLog','UdUp',False)
end;
procedure TdmLogUpload.DisableOnlineLogSupport;

View File

@ -51,32 +51,34 @@ const
':', '|', '-', '=', '+', '@', '#', '*', '%', '_', '(', ')', '$', '<', '>'];
empty_freq = '0.00000';
empty_azimuth = '0.0';
cMaxModes = 48; //last added FST4
cModes: array [0..cMaxModes] of string =
('CW', 'SSB', 'AM', 'FM', 'RTTY', 'SSTV', 'PACTOR', 'PSK', 'ATV', 'CLOVER', 'GTOR', 'MTOR',
'PSK31', 'HELL', 'MT63',
'QRSS', 'CWQ', 'BPSK31', 'MFSK', 'JT44', 'FSK44', 'WSJT', 'AMTOR',
'THROB', 'BPSK63', 'PACKET',
'OLIVIA', 'MFSK16', 'JS8', 'JT4','JT6M', 'JT65', 'JT65A', 'JT65B', 'JT65C',
'JT9', 'QRA64', 'ISCAT', 'MSK144', 'FT8', 'FT4', 'FST4', 'FSK441', 'PSK125',
'PSK63', 'WSPR', 'PSK250', 'ROS', 'DIGITALVOICE');
cMaxBandsCount = 30; //29 bands
cDefaultFreq =
'0.136|0.472|1.800|3.500|3.700|5.351|7.000|10.100|14.000|14.200|18.100|21.000|21.200|24.890|28.000|28.500|50.000|70.0875|'
+
'70.0500|144.000|145.275|430.000|902.0|1250.0|2400.0|3450.0|5670.0|10250.0|24100.0|47100.0|78000.0|122252.0|134930.0|248000.0';
cBands: array[0..28] of string[10] =
cMaxModes = 48; //One less than count 49 modes (loops have 0..MaxModes)
cModes: array [0..cMaxModes] of string =
('CW', 'SSB', 'AM', 'FM', 'RTTY', 'SSTV', 'PACTOR','PSK', 'ATV', 'CLOVER',
'GTOR', 'MTOR', 'PSK31', 'HELL', 'MT63', 'QRSS', 'CWQ', 'BPSK31','MFSK', 'JT44',
'FSK44', 'WSJT', 'AMTOR', 'THROB', 'BPSK63','PACKET','OLIVIA','MFSK16','JS8', 'JT4',
'JT6M', 'JT65', 'JT65A', 'JT65B', 'JT65C', 'JT9', 'QRA64', 'ISCAT', 'MSK144', 'FT8',
'FT4', 'FST4', 'FSK441','PSK125','PSK63', 'WSPR', 'PSK250','ROS', 'DIGITALVOICE');
cMaxBandsCount = 31; //True count of bands. (loops have 0..MaxBandsCount-1)
cBands: array[0..30] of string[10] =
('2190M', '630M', '160M', '80M' , '60M','40M' , '30M', '20M' , '17M' , '15M' ,
'12M' , '10M' , '6M' , '4M' , '2M' , '1.25M', '70CM', '33CM', '23CM', '13CM',
'9CM' , '6CM' , '3CM' , '1.25CM', '6MM', '4MM', '2.5MM', '2MM', '1MM');
'12M' , '10M' , '5M' , '6M' , '8M' ,'4M' , '2M' , '1.25M', '70CM', '33CM',
'23CM' , '13CM', '9CM' , '6CM' , '3CM','1.25CM','6MM', '4MM' , '2.5MM','2MM',
'1MM');
cDefaultFreq =
'0.136|0.472|1.800|3.500|3.700|5.351|7.000|10.100|14.000|14.200|'+
'18.100|21.000|21.200|24.890|28.000|28.500|40.000|50.000|60.0000|70.0500|'+
'144.000|145.275|430.000|902.0|1250.0|2400.0|3450.0|5670.0|10250.0|24100.0|'+
'47100.0|78000.0|122252.0|134930.0|248000.0';
cMaxIgnoreFreq = 6;
cIngnoreFreq: array [0..cMaxIgnoreFreq] of string =
('1800.0', '3500.0', '7000.0', '10100.0', '14000.0', '21000.0', '28000.0');
C_RBN_CONT = 'AF,AN,AS,EU,NA,SA,OC';
C_RBN_BANDS = '630M,160M,80M,60M,40M,30M,20M,17M,15M,12M,10M,6M,2M';
C_RBN_BANDS = '630M,160M,80M,60M,40M,30M,20M,17M,15M,12M,10M,8M,6M,5M,2M';
C_RBN_MODES = 'CW,RTTY,PSK31';
C_CONTEST_LIST_FILE_NAME = 'ContestName.tab';
@ -109,6 +111,7 @@ type
fGrayLineOffset: currency;
fQRZSession: string;
fHamQTHSession: string;
fQRZCQSession: string;
fSysUTC: boolean;
SubmodeMode: TStringList;
ImportMode : TStringlist;
@ -122,11 +125,14 @@ type
function nr(ch: char): integer;
function GetTagValue(Data, tg: string): string;
function GetQRZSession(var ErrMsg: string): boolean;
function GetQRZCQSession(var ErrMsg: string): boolean;
function GetHamQTHSession(var ErrMsg: string): boolean;
function GetQRZInfo(call: string;
var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg: string): boolean;
function GetHamQTHInfo(call: string;
var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean;
function GetQRZCQInfo(call: string;
var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean;
public
s136: string;
@ -141,7 +147,9 @@ type
s15: string;
s12: string;
s10: string;
s8: string;
s6: string;
s5: string;
s4: string;
s220: string;
s2: string;
@ -220,6 +228,10 @@ type
procedure BandFromDbase;
procedure UpdateHelpBrowser;
procedure ModeFromCqr(CqrMode:String;var OutMode,OutSubmode:String;dbg:Boolean);
procedure UpdateCallBookcnf;
procedure ClearStatGrid(g:TStringGrid);
procedure AddBandsToStatGrid(g:TStringGrid);
procedure ShowStatistic(ref_adif,old_stat_adif:Word; g:TStringGrid; call:String='');
function BandFromArray(tmp:Currency):string;
function MyDefaultBrowser:String;
@ -275,7 +287,7 @@ type
function ExtractZipCode(qth : String; Position : Integer) : String;
function GetLabelBand(freq : String) : String;
function GetAdifBandFromFreq(MHz : string): String;
function GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text: String) : String;
function GetCWMessage(Key,call,rst_s,stx,stx_str,srx,srx_str,HisName,HelloMsg, text: String) : String;
function RigGetcmd(r : String): String;
function GetLastQSLUpgradeDate : TDateTime;
function GetLastDOKUpgradeDate : TDateTime;
@ -323,7 +335,7 @@ implementation
{$R *.lfm}
{ TdmUtils }
uses dData, dDXCC, fEnterFreq, fTRXControl, uMyini, fNewQSO;
uses dData, dDXCC, fEnterFreq, fTRXControl, uMyini, fNewQSO, uVersion, fContest;
function TdmUtils.LetterFromMode(mode: string): string;
begin
@ -551,7 +563,8 @@ begin
end
end
finally
cqrini.SaveToDisk;
//cqrini.SaveToDisk; WHY we save when load? Is this unchecked direct copy from SaveForm source abowe?
// There is no cqrini writing done, so why need to save?
l.Free
end
end;
@ -702,7 +715,6 @@ begin
QSL_R.Items.Add('!');
end;
procedure TdmUtils.InsertFreq(cmbFreq: TcomboBox);
var
a: TExplodeArray;
@ -713,36 +725,6 @@ begin
for i := 0 to Length(a) - 1 do
if a[i] <> '' then
cmbFreq.Items.Add(a[i]);
{
cmbFreq.Items.Add('1.800');
cmbFreq.Items.Add('3.500');
cmbFreq.Items.Add('3.700');
cmbFreq.Items.Add('7.000');
cmbFreq.Items.Add('10.100');
cmbFreq.Items.Add('14.000');
cmbFreq.Items.Add('14.200');
cmbFreq.Items.Add('18.100');
cmbFreq.Items.Add('21.000');
cmbFreq.Items.Add('21.200');
cmbFreq.Items.Add('24.890');
cmbFreq.Items.Add('28.000');
cmbFreq.Items.Add('28.500');
cmbFreq.Items.Add('50.000');
cmbFreq.Items.Add('70.0875');
cmbFreq.Items.Add('70.0500');
cmbFreq.Items.Add('144.000');
cmbFreq.Items.Add('145.275');
cmbFreq.Items.Add('430.000');
cmbFreq.Items.Add('902.0');
cmbFreq.Items.Add('1250.0');
cmbFreq.Items.Add('2400.0');
cmbFreq.Items.Add('3450.0');
cmbFreq.Items.Add('5670.0');
cmbFreq.Items.Add('10250.0');
cmbFreq.Items.Add('24100.0');
cmbFreq.Items.Add('47100.0');
cmbFreq.Items.Add('78000.0');
}
end;
procedure TdmUtils.InsertBands(cmbBand: TComboBox);
@ -758,7 +740,7 @@ procedure TdmUtils.InsertWorkedContests(cmbContest: TComboBox);
var
i: integer;
const
C_SEL = 'SELECT DISTINCT `contestname` FROM `cqrlog_main` WHERE `contestname` IS NOT NULL and `contestname` != "" ORDER BY `contestname` DESC';
C_SEL = 'SELECT DISTINCT `contestname` FROM `cqrlog_main` WHERE `contestname` IS NOT NULL and `contestname` != "" ORDER BY `contestname` ASC';
begin
cmbContest.Clear;
dmData.qWorkedContests.Close;
@ -1280,6 +1262,9 @@ end;
function TdmUtils.IsDateOK(date: string): boolean;
var
tmp: string;
//OH1KH: this 230-0010-20 passes as 2023-01-20 !!! We have to do something for this !!
begin
if date = '' then
begin
@ -1288,6 +1273,10 @@ begin
end;
Result := True;
//check separator places first
if (date[5]<>'-') or (date[8]<>'-') then
Result:=false;
tmp := FormatSettings.ShortDateFormat;
try
FormatSettings.ShortDateFormat := 'YYYY-MM-DD';
@ -2728,7 +2717,7 @@ begin
Result := LowerCase(GetBandFromFreq(freq));
end;
function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text : String) : String;
function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,srx,srx_str,HisName,HelloMsg, text : String) : String;
{
%mc - my callsign
%mn - my name
@ -2741,9 +2730,12 @@ function TdmUtils.GetCWMessage(Key,call,rst_s,stx,stx_str,HisName,HelloMsg, text
%c - callsign
%h - greeting GM/GA/GE calculated from the %c station location time
%xn - contest exchenge serial number
%xn - contest exchange serial number
%xnr - contest exchange seral number received
%xm - contest exchange message
%xmr - contest exchange message received
%xns - contest exchenge serial number sends 9->N and 0->T
%xnrs- contest exchange message received sends 9->N and 0->T
%xrs - full contest exchange RST+SerialNR+Message sends 9->N and 0->T.
Can be used "always" as if serNR and/or Message are empty just sends plain report.
@ -2758,6 +2750,7 @@ var
myqth : String = '';
rst_sh : String = '';
stx_sh : String = '';
srx_sh : String = '';
con_ex : String = '';
begin
@ -2766,7 +2759,15 @@ begin
myname := cqrini.ReadString('Station', 'Name', '');
myqth := cqrini.ReadString('Station', 'QTH', '');
if key <> '' then
Begin
if (frmContest.Showing) and ( not (cqrini.ReadBool('CW','S&P',True))) then //if contest and run mode keys are F11-F20
Begin
if key='F10' then key:='F20'
else
key:= key[1]+'1'+key[2];
end;
Result := LowerCase(cqrini.ReadString('CW', key, ''))
end
else
Result := text;
@ -2776,27 +2777,38 @@ begin
stx_sh := StringReplace(stx,'9','N',[rfReplaceAll, rfIgnoreCase]);
stx_sh := StringReplace(stx_sh,'0','T',[rfReplaceAll, rfIgnoreCase]);//replace zeros, too
srx_sh := StringReplace(srx,'9','N',[rfReplaceAll, rfIgnoreCase]);
srx_sh := StringReplace(srx_sh,'0','T',[rfReplaceAll, rfIgnoreCase]);//replace zeros, too
con_ex := rst_sh;
if stx_sh <>'' then con_ex:=con_ex+' '+stx_sh;
if stx_str <>'' then con_ex:=con_ex+' '+stx_str;
Result := StringReplace(Result,'%xnrs',srx_sh,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xnr',srx,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xns',stx_sh,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xn',stx,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xmr',srx_str,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xm',stx_str,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xrs',con_ex,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%rs',rst_sh,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%r',rst_s,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%n',HisName,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%mc',mycall,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%ml',myloc,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%mn',myname,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%mq',myqth,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xrs',con_ex,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%rs',rst_sh,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%r',rst_s,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%n',HisName,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%c',call,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%h',HelloMsg,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xns',stx_sh,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xn',stx,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%xm',stx_str,[rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result,'%c',call,[rfReplaceAll, rfIgnoreCase]);
if dmData.DebugLevel>=1 then Writeln('Sending:',Result)
if dmData.DebugLevel>=1 then
Writeln('Sending:',Result)
end;
function TdmUtils.RigGetcmd(r : String) : String;
@ -3246,7 +3258,93 @@ begin
HTTP.Free
end;
end;
function TdmUtils.GetQRZCQInfo(call: string;
var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean;
var
http: THTTPSend;
req: string = '';
m: TStringList;
tmp:String;
begin
Result := False;
nick := '';
address := '';
grid := '';
state := '';
county := '';
qsl := '';
ErrMsg := '';
if fQRZCQSession = '' then
begin
if not GetQRZCQSession(ErrMsg) then
exit;
end;
http := THTTPSend.Create;
m := TStringList.Create;
try
http.ProxyHost := cqrini.ReadString('Program', 'Proxy', '');
http.ProxyPort := cqrini.ReadString('Program', 'Port', '');
http.UserName := cqrini.ReadString('Program', 'User', '');
http.Password := cqrini.ReadString('Program', 'Passwd', '');
if (call = '') then
begin
ErrMsg := 'Callsign field empty!';
exit;
end;
req := 'https://ssl.qrzcq.com/xml?s=' + fQRZCQSession + '&callsign=' + GetIDCall(call)+'&agent=Cqrlog_'+uVersion.cVERSION;
if not HTTP.HTTPMethod('GET', req) then
ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString
else
begin
m.LoadFromStream(http.Document);
if Pos(UpperCase('<Error>Session Timeout</Error>'), UpperCase(m.Text)) > 0 then
begin
fQRZCQSession := '';
cqrini.WriteString('CallBook', 'CbQRZCQKey', fQRZCQSession);
Result := GetQRZCQInfo(call, nick, qth, address, zip, grid, state,
county, qsl, iota, waz, itu, dok, ErrMsg);
end
else
begin
if Pos('<Error>Not found:', m.Text) > 0 then
exit;
nick:= GetTagValue(m.Text, '<name>');
if WordCount(nick,[' ']) >2 then //There may be nickname after true name
Begin
tmp := ExtractWord(2,nick,[' ']);
nick:= ExtractWord(1,nick,[' ']);
if ((pos('(',tmp)>0)
or (pos('"',tmp)>0)
or (pos(#$27,tmp)>0) // '
or (pos('[',tmp)>0)
or (pos('{',tmp)>0) ) then //There may be nickname after true name
nick:= nick+' '+tmp;
end
else
nick:= ExtractWord(1,nick,[' ']);
qth := GetTagValue(m.Text, '<qth>');
state := GetTagValue(m.Text, '<state>');
zip := GetTagValue(m.Text, '<zip>');
address := GetTagValue(m.Text, '<name>') + LineEnding +
GetTagValue(m.Text, '<address>') + LineEnding;
if (state <> '') then
address := address + ', ' + state;
address := address + ' ' + zip;
county := GetTagValue(m.Text, '<county>');
grid := UpperCase(GetTagValue(m.Text, '<locator>'));
qsl := GetTagValue(m.Text, '<manager>');
iota := GetTagValue(m.Text, '<iota>');
waz := GetTagValue(m.Text, '<cq>');
itu := GetTagValue(m.Text, '<itu>');
dok := GetTagValue(m.Text, '<dok>')
end
end
finally
m.Free;
HTTP.Free
end;
end;
procedure TdmUtils.SaveWindowPos(a: TForm);
var
section: string = '';
@ -3788,8 +3886,10 @@ function TdmUtils.GetCallBookData(call: string;
var nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg: string): boolean;
begin
if cqrini.ReadBool('Callbook', 'QRZ', False) then
Result := GetQRZInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg)
else
Result := GetQRZInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, ErrMsg) ;
if cqrini.ReadBool('Callbook', 'QRZCQ', False) then
Result := GetQRZCQInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg) ;
if cqrini.ReadBool('Callbook', 'HamQTH', False) then
Result := GetHamQTHInfo(call, nick, qth, address, zip, grid, state, county, qsl, iota, waz, itu, dok, ErrMsg)
end;
@ -3812,7 +3912,6 @@ begin
end;
end;
function TdmUtils.GetQRZSession(var ErrMsg: string): boolean;
var
http: THTTPSend;
@ -3822,8 +3921,8 @@ var
kpos: word;
begin
Result := False;
if (cqrini.ReadString('CallBook', 'CBUser', '') = '') or
(cqrini.ReadString('CallBook', 'CBPass', '') = '') then
if (cqrini.ReadString('CallBook', 'CbQRZUser', '') = '') or
(cqrini.ReadString('CallBook', 'CbQRZPass', '') = '') then
begin
ErrMsg := 'Empty password or user name';
exit;
@ -3836,8 +3935,8 @@ begin
http.UserName := cqrini.ReadString('Program', 'User', '');
http.Password := cqrini.ReadString('Program', 'Passwd', '');
req := 'https://xmldata.qrz.com/xml/1.34?username=' + cqrini.ReadString(
'CallBook', 'CBUser', '') + ';password=' + cqrini.ReadString(
'CallBook', 'CBPass', '') + ';agent=cqrlog';
'CallBook', 'CbQRZUser', '') + ';password=' + cqrini.ReadString(
'CallBook', 'CbQRZPass', '') + ';agent=Cqrlog_'+uVersion.cVERSION;
if not HTTP.HTTPMethod('GET', req) then
ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString
else
@ -3867,16 +3966,23 @@ begin
HTTP.Free
end;
end;
function TdmUtils.GetHamQTHSession(var ErrMsg: string): boolean;
function TdmUtils.GetQRZCQSession(var ErrMsg: string): boolean;
var
http: THTTPSend;
req: string = '';
m: TStringList;
epos: word;
kpos: word;
begin
fQRZCQSession:= cqrini.ReadString('CallBook', 'CbQRZCQKey','');
if fQRZCQSession<>'' then
Begin
Result:=true;
exit;
end;
Result := False;
if (cqrini.ReadString('CallBook', 'CBUser', '') = '') or
(cqrini.ReadString('CallBook', 'CBPass', '') = '') then
if (cqrini.ReadString('CallBook', 'CbQRZCQUser', '') = '') or
(cqrini.ReadString('CallBook', 'CbQRZCQPass', '') = '') then
begin
ErrMsg := 'Empty password or user name';
exit;
@ -3888,8 +3994,62 @@ begin
http.ProxyPort := cqrini.ReadString('Program', 'Port', '');
http.UserName := cqrini.ReadString('Program', 'User', '');
http.Password := cqrini.ReadString('Program', 'Passwd', '');
req := 'http://www.hamqth.com/xml.php?u=' + cqrini.ReadString('CallBook', 'CBUser', '') +
'&p=' + EncodeURLData(cqrini.ReadString('CallBook', 'CBPass', '')) + '&prg=cqrlog';
req := 'https://ssl.qrzcq.com/xml?username=' + cqrini.ReadString(
'CallBook', 'CbQRZCQUser', '') + '&password=' + cqrini.ReadString(
'CallBook', 'CbQRZCQPass', '') + '&agent=Cqrlog_'+uVersion.cVERSION;
if not HTTP.HTTPMethod('GET', req) then
ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString
else
begin
m.LoadFromStream(http.Document);
if dmData.DebugLevel >= 1 then
Writeln(m.Text);
//I'd like to parse it as normal XML but it seems XML support in Freepascal
//2.4.0 is broken :-(
epos := Pos('<Error>', m.Text);
if epos > 0 then
ErrMsg := copy(m.Text, epos + 7, Pos('</Error>', m.Text) - epos - 7)
else
begin
kpos := Pos('<Key>', m.Text);
if kpos > 0 then
begin
fQRZCQSession := copy(m.Text, kpos + 5, Pos('</Key>', m.Text) - kpos - 5);
cqrini.WriteString('CallBook', 'CbQRZCQKey', fQRZCQSession);
Result := True;
end
else
ErrMsg := 'Tag "<Key>" not found!';
end;
end
finally
m.Free;
HTTP.Free
end;
end;
function TdmUtils.GetHamQTHSession(var ErrMsg: string): boolean;
var
http: THTTPSend;
req: string = '';
m: TStringList;
begin
Result := False;
if (cqrini.ReadString('CallBook', 'CbHamQTHUser', '') = '') or
(cqrini.ReadString('CallBook', 'CbHamQTHPass', '') = '') then
begin
ErrMsg := 'Empty password or user name';
exit;
end;
http := THTTPSend.Create;
m := TStringList.Create;
try
http.ProxyHost := cqrini.ReadString('Program', 'Proxy', '');
http.ProxyPort := cqrini.ReadString('Program', 'Port', '');
http.UserName := cqrini.ReadString('Program', 'User', '');
http.Password := cqrini.ReadString('Program', 'Passwd', '');
req := 'http://www.hamqth.com/xml.php?u=' + cqrini.ReadString('CallBook', 'CbHamQTHUser', '') +
'&p=' + EncodeURLData(cqrini.ReadString('CallBook', 'CbHamQTHPass', '')) + '&prg=Cqrlog_'+uVersion.cVERSION;
//Writeln(req);
if not HTTP.HTTPMethod('GET', req) then
ErrMsg := '(' + IntToStr(http.ResultCode) + '):' + http.ResultString
@ -4013,7 +4173,6 @@ begin
HTTP.Free
end;
end;
procedure TdmUtils.ShowHamQTHInBrowser(call: string);
var
AProcess: TProcess;
@ -4447,7 +4606,7 @@ begin
end
end;
if (CmbText='') then
RigComboBox.ItemIndex := 0
RigComboBox.ItemIndex := -1
else
RigComboBox.Text := CmbText
end;
@ -5038,5 +5197,198 @@ Begin
if num=4 then CreaFile(dmData.HomeDir+C_MODEFILE_DIR+C_READMEMODE_FILE,R_file);
end;
procedure TdmUtils.UpdateCallBookcnf;
var
c,p:string;
Begin
c:= cqrini.ReadString('CallBook', 'CBUser', '');
if c <> '' then
Begin //remove old definition
p:= cqrini.ReadString('CallBook', 'CBPass', '');
if cqrini.ReadBool('Callbook', 'HamQTH', True) then
begin
cqrini.WriteString('CallBook', 'CbHamQTHUser', c);
cqrini.WriteString('CallBook', 'CbHamQTHPass', p);
end
else
begin
cqrini.WriteString('CallBook', 'CbQRZUser', c);
cqrini.WriteString('CallBook', 'CbQRZPass', p);
end;
cqrini.DeleteKey('CallBook', 'CBUser');
cqrini.DeleteKey('CallBook', 'CBPass');
end;
end;
procedure TdmUtils.ClearStatGrid(g:TStringGrid);
var
i,y : Integer;
begin
for i:= 0 to g.ColCount-1 do
for y := 0 to g.RowCount-1 do
g.Cells[i,y] := ' ';
with g do
begin
Cells[0, 1] := 'SSB';
Cells[0, 2] := 'CW';
Cells[0, 3] := 'DIGI'
end;
end;
procedure TdmUtils.AddBandsToStatGrid(g:TStringGrid);
var
i : Integer;
begin
g.ColCount := cMaxBandsCount;
for i:=0 to cMaxBandsCount-1 do
begin
if dmUtils.MyBands[i][0]='' then
begin
g.ColCount := i+1;
break
end;
g.Cells[i+1,0] := dmUtils.MyBands[i][1];
end;
end;
procedure TdmUtils.ShowStatistic(ref_adif,old_stat_adif:Word; g:TStringGrid; call:String='');
var
i : Integer;
ShowLoTW : Boolean = False;
mode : String;
QSLR,LoTW,eQSL : String;
tmps,tmpq : String;
space: String;
begin
tmpq:='';
if call='' then
Begin
if old_stat_adif = ref_adif then
exit;
old_stat_adif := ref_adif;
end
else
begin
tmpq:=' and callsign='+QuotedStr(call);
end;
g.ColCount := cMaxBandsCount;
dmUtils.ClearStatGrid(g);
dmUtils.AddBandsToStatGrid(g);
space := ' ';
if cqrini.ReadBool('Fonts','GridDotsInsteadSpaces',False) = True then
begin
space := '.';
end;
for i:=0 to cMaxBandsCount-1 do
begin
if dmUtils.MyBands[i][0]='' then
begin
g.ColCount := i+1;
break
end;
g.Cells[i+1,1] := space+space+space;
g.Cells[i+1,2] := space+space+space;
g.Cells[i+1,3] := space+space+space;
end;
if dmData.trQ.Active then
dmData.trQ.RollBack;
dmData.Q.Close;
ShowLoTW := cqrini.ReadBool('LoTW','NewQSOLoTW',False);
if ShowLoTW then
dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+
IntToStr(ref_adif) + tmpq + ' and ((qsl_r='+QuotedStr('Q')+') or '+
'(lotw_qslr = '+QuotedStr('L')+') or (eqsl_qsl_rcvd='+QuotedStr('E')+
')) group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd'
else
dmData.Q.SQL.Text := 'select band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd from cqrlog_main where adif='+
IntToStr(ref_adif) + tmpq + ' and (qsl_r = '+QuotedStr('Q')+') '+
'group by band,mode,qsl_r,lotw_qslr,eqsl_qsl_rcvd';
dmData.trQ.StartTransaction;
dmData.Q.Open;
while not dmData.Q.Eof do
begin
i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1;
mode := dmData.Q.Fields[1].AsString;
QSLR := dmData.Q.Fields[2].AsString;
LoTW := dmData.Q.Fields[3].AsString;
eQSL := dmData.Q.Fields[4].AsString;
if i > 0 then
begin
if (Mode = 'SSB') or (Mode='FM') or (Mode='AM') then
begin
tmps := g.Cells[i,1] ;
if QSLR = 'Q' then
tmps[1] := 'Q';
if (LoTW = 'L') then
tmps[2] := 'L';
if (eQSL = 'E') then
tmps[3] := 'E';
g.Cells[i,1] := tmps
end
else begin
if (Mode='CW') or (Mode='CWQ') then
begin
tmps := g.Cells[i,2] ;
if QSLR = 'Q' then
tmps[1] := 'Q';
if (LoTW = 'L') then
tmps[2] := 'L';
if (eQSL = 'E') then
tmps[3] := 'E';
g.Cells[i,2] := tmps
end
else begin
tmps := g.Cells[i,3] ;
if QSLR = 'Q' then
tmps[1] := 'Q';
if (LoTW = 'L') then
tmps[2] := 'L';
if (eQSL = 'E') then
tmps[3] := 'E';
g.Cells[i,3] := tmps
end
end;
end;
dmData.Q.Next
end;
dmData.trQ.Rollback;
dmData.Q.Close;
if dmData.trQ.Active then
dmData.trQ.Rollback;
dmData.Q.SQL.Text := 'select band,mode from cqrlog_main where adif='+
IntToStr(ref_adif) + tmpq +' group by band,mode';
dmData.trQ.StartTransaction;
dmData.Q.Open;
while not dmData.Q.Eof do
begin
i := dmUtils.GetBandPos(dmData.Q.Fields[0].AsString)+1;
mode := dmData.Q.Fields[1].AsString;
if i > 0 then
begin
if ((mode = 'SSB') or (mode = 'FM') or (mode = 'AM')) then
if(g.Cells[i,1] = space+space+space) then g.Cells[i,1] := ' X ';
if ((mode = 'CW') or (mode = 'CWR')) then
if (g.Cells[i,2] = space+space+space) then g.Cells[i,2] := ' X ';
if ((mode <> 'SSB') and (mode <>'FM') and (mode <> 'AM') and (mode <> 'CW') and (mode <> 'CWR')) then
if (g.Cells[i,3] = space+space+space) then g.Cells[i,3] := ' X '
end;
dmData.Q.Next;
end;
dmData.Q.Close;
dmData.trQ.Rollback
end;
end.

View File

@ -8,9 +8,10 @@ object frmAddRadioMemory: TfrmAddRadioMemory
ClientHeight = 222
ClientWidth = 308
OnCreate = FormCreate
OnKeyDown = FormKeyDown
OnShow = FormShow
Position = poOwnerFormCenter
LCLVersion = '2.0.0.4'
LCLVersion = '2.2.4.0'
object lblFreq: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
@ -32,8 +33,9 @@ object frmAddRadioMemory: TfrmAddRadioMemory
Top = 19
Width = 192
BorderSpacing.Left = 12
OnKeyDown = FormKeyDown
OnKeyPress = edtFreqKeyPress
TabOrder = 0
Text = '0'
end
object lblMode: TLabel
AnchorSideLeft.Control = Owner
@ -61,8 +63,8 @@ object frmAddRadioMemory: TfrmAddRadioMemory
BorderSpacing.Left = 12
CharCase = ecUppercase
ItemHeight = 0
OnKeyDown = FormKeyDown
TabOrder = 1
Text = 'CMBMODE'
end
object lblWidth: TLabel
AnchorSideLeft.Control = Owner
@ -86,8 +88,9 @@ object frmAddRadioMemory: TfrmAddRadioMemory
Top = 125
Width = 112
BorderSpacing.Left = 12
NumbersOnly = True
OnKeyDown = FormKeyDown
TabOrder = 2
Text = '0'
end
object Button1: TButton
AnchorSideTop.Control = Owner
@ -144,6 +147,7 @@ object frmAddRadioMemory: TfrmAddRadioMemory
Width = 284
BorderSpacing.Left = 12
MaxLength = 25
OnKeyDown = FormKeyDown
TabOrder = 3
end
end

View File

@ -24,7 +24,9 @@ type
lblWidth: TLabel;
lblInfo: TLabel;
procedure Button1Click(Sender: TObject);
procedure edtFreqKeyPress(Sender: TObject; var Key: char);
procedure FormCreate(Sender : TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormShow(Sender: TObject);
private
{ private declarations }
@ -45,8 +47,7 @@ uses dUtils;
procedure TfrmAddRadioMemory.FormShow(Sender: TObject);
begin
dmUtils.LoadFontSettings(frmAddRadioMemory);
edtFreq.SetFocus
edtFreq.SetFocus;
end;
procedure TfrmAddRadioMemory.Button1Click(Sender: TObject);
@ -60,6 +61,13 @@ begin
exit
end;
if cmbMode.ItemIndex < 0 then
begin
Application.MessageBox('Please enter correct mode','Error...', mb_OK+mb_IconError);
cmbMode.SetFocus;
exit
end;
if not TryStrToFloat(edtWidth.Text,f) then
begin
Application.MessageBox('Please enter correct bandwidth','Error...', mb_OK+mb_IconError);
@ -70,6 +78,11 @@ begin
ModalResult := mrOK
end;
procedure TfrmAddRadioMemory.edtFreqKeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9','.']) then key:=#0;
end;
procedure TfrmAddRadioMemory.FormCreate(Sender : TObject);
begin
dmUtils.InsertModes(cmbMode);
@ -78,6 +91,13 @@ begin
cmbMode.Items.Insert(2,'LSB')
end;
procedure TfrmAddRadioMemory.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_RETURN then Button1Click(nil);
if key = VK_ESCAPE then ModalResult:=mrCancel;
end;
initialization
{$I fAddRadioMemory.lrs}

View File

@ -904,6 +904,7 @@ begin
lblCount.Caption :='';
lblErrors.Caption := '';
Do_Err_Import:=true;
lblComplete.Visible := False;
end;
procedure TfrmAdifImport.mnuDeleteClick(Sender: TObject);

View File

@ -1,87 +1,166 @@
object frmBigSquareStat: TfrmBigSquareStat
Left = 580
Left = 283
Height = 590
Top = 279
Top = 53
Width = 655
Caption = 'Big square statistic'
ClientHeight = 590
ClientWidth = 655
OnClose = FormClose
OnShow = FormShow
LCLVersion = '1.2.2.0'
LCLVersion = '2.2.6.0'
object Panel1: TPanel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
Left = 0
Height = 88
Height = 80
Top = 0
Width = 655
Align = alTop
BevelOuter = bvNone
ClientHeight = 88
ClientHeight = 80
ClientWidth = 655
TabOrder = 0
object cmbBands: TComboBox
Left = 63
Height = 31
Top = 24
AnchorSideLeft.Control = Label1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
Left = 55
Height = 33
Top = 9
Width = 164
BorderSpacing.Left = 6
BorderSpacing.Top = 9
ItemHeight = 0
OnChange = cmbBandsChange
Style = csDropDownList
TabOrder = 0
end
object Label1: TLabel
Left = 16
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = cmbBands
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 32
Width = 38
Top = 17
Width = 37
BorderSpacing.Left = 12
Caption = 'Band:'
ParentColor = False
end
object GroupBox1: TGroupBox
Left = 240
Height = 72
Top = 11
Width = 225
AnchorSideLeft.Control = cmbBands
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbBands
AnchorSideRight.Control = btnRefresh
Left = 231
Height = 42
Top = 9
Width = 244
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 12
BorderSpacing.Right = 12
Caption = ' Confirmed '
ClientHeight = 53
ClientWidth = 221
ClientHeight = 24
ClientWidth = 242
TabOrder = 1
object chkQSL: TCheckBox
Left = 6
Height = 24
Top = 3
Width = 53
AnchorSideLeft.Control = GroupBox1
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
Left = 5
Height = 23
Top = 1
Width = 51
BorderSpacing.Left = 5
Caption = 'QSL'
OnChange = cmbBandsChange
TabOrder = 0
end
object chkLoTW: TCheckBox
Left = 70
Height = 24
Top = 3
Width = 65
AnchorSideLeft.Control = GroupBox1
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
Left = 90
Height = 23
Top = 1
Width = 62
Caption = 'LoTW'
OnChange = cmbBandsChange
TabOrder = 1
end
object chkeQSL: TCheckBox
Left = 149
Height = 24
Top = 3
Width = 61
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = GroupBox1
AnchorSideRight.Side = asrBottom
Left = 177
Height = 23
Top = 1
Width = 59
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'eQSL'
OnChange = cmbBandsChange
TabOrder = 2
end
end
object btnRefresh: TButton
Left = 496
Height = 25
Top = 28
Width = 128
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 487
Height = 33
Top = 14
Width = 156
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Caption = 'Refresh statistic'
OnClick = btnRefreshClick
TabOrder = 2
end
object pbTot: TProgressBar
AnchorSideLeft.Control = cmbBands
AnchorSideTop.Control = cmbBands
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = cmbBands
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 55
Height = 10
Top = 54
Width = 161
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 12
BorderSpacing.Right = 3
TabOrder = 3
end
object lblFIlterActive: TLabel
AnchorSideLeft.Control = GroupBox1
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrBottom
Left = 305
Height = 17
Top = 57
Width = 96
BorderSpacing.Top = 6
Caption = 'Filter is active!'
Font.Color = clRed
ParentColor = False
ParentFont = False
Visible = False
end
end
object Panel2: TPanel
AnchorSideLeft.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
Left = 0
Height = 34
Top = 556
@ -92,33 +171,50 @@ object frmBigSquareStat: TfrmBigSquareStat
ClientWidth = 655
TabOrder = 1
object btnClose: TButton
Left = 569
Height = 25
Top = 6
Width = 75
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel2
AnchorSideRight.Side = asrBottom
Left = 553
Height = 33
Top = 1
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Cancel = True
Caption = 'Close'
ModalResult = 2
TabOrder = 0
end
object btnSaveTo: TButton
Left = 480
Height = 25
Top = 6
Width = 75
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = btnClose
Left = 451
Height = 33
Top = 1
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Caption = 'Save to ...'
OnClick = btnSaveToClick
TabOrder = 1
end
end
object IpHtmlPanel1: TIpHtmlPanel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel2
Left = 0
Height = 468
Top = 88
Height = 476
Top = 80
Width = 655
Align = alClient
BorderWidth = 1
BorderStyle = bsSingle
DataProvider = IpFileDataProvider1
FixedTypeface = 'Courier New'
DefaultTypeFace = 'Sans'
@ -128,17 +224,29 @@ object frmBigSquareStat: TfrmBigSquareStat
PrintSettings.MarginTop = 0.5
PrintSettings.MarginRight = 0.5
PrintSettings.MarginBottom = 0.5
PrintSettings.Preview.Left = 320
PrintSettings.Preview.Top = 200
PrintSettings.Preview.Width = 960
PrintSettings.Preview.Height = 600
TabOrder = 2
VLinkColor = clBlue
end
object IpFileDataProvider1: TIpFileDataProvider
left = 160
top = 512
Left = 160
Top = 512
end
object dlgSave: TSaveDialog
DefaultExt = '.html'
Filter = 'HTML files|*.html'
left = 64
top = 512
Left = 64
Top = 512
end
object tmrBlink: TTimer
Enabled = False
OnTimer = tmrBlinkTimer
OnStartTimer = tmrBlinkStartTimer
OnStopTimer = tmrBlinkStopTimer
Left = 248
Top = 512
end
end

View File

@ -5,9 +5,9 @@ unit fBigSquareStat;
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, ExtCtrls, StdCtrls, Grids, IpHtml, Ipfilebroker, db, BufDataset,
LazFileUtils;
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls, Grids, ComCtrls, IpHtml, Ipfilebroker, db, BufDataset,
LazFileUtils, dateutils;
type
@ -25,13 +25,20 @@ type
IpFileDataProvider1: TIpFileDataProvider;
IpHtmlPanel1: TIpHtmlPanel;
Label1: TLabel;
lblFIlterActive: TLabel;
Panel1: TPanel;
Panel2: TPanel;
dlgSave: TSaveDialog;
pbTot: TProgressBar;
tmrBlink: TTimer;
procedure btnRefreshClick(Sender: TObject);
procedure btnSaveToClick(Sender: TObject);
procedure cmbBandsChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormShow(Sender: TObject);
procedure tmrBlinkStartTimer(Sender: TObject);
procedure tmrBlinkStopTimer(Sender: TObject);
procedure tmrBlinkTimer(Sender: TObject);
private
TmpFile : String;
f : TextFile;
@ -61,60 +68,26 @@ begin
DeleteFileUTF8(ExtractFileNameWithoutExt(TmpFile)+'.html')
end;
{ dbfBand.FilePathFull := fHomeDir;
dbfBand.TableName := 'bandmap.dat';
if not FileExists(fHomeDir+'bandmap.dat') then
begin
dbfBand.TableLevel := 7;
dbfBand.Exclusive := True;
dbfBand.FieldDefs.Clear;
With dbfBand.FieldDefs do begin
Add('vfo_a', ftFloat);
Add('Call', ftString, 20);
Add('vfo_b', ftFloat);
Add('split',ftBoolean);
Add('color',ftLargeint);
Add('mode',ftString,8);
Add('band',ftString,6);
Add('time',ftDateTime);
Add('age', ftString,1);
Add('pfx',ftString,10);
Add('lat',ftString,10);
Add('long',ftString,10);
Add('id', ftAutoInc)
end;
dbfBand.CreateTable;
dbfBand.Open;
dbfBand.AddIndex('id','id', [ixPrimary, ixUnique]);
dbfBand.AddIndex('vfo_a','vfo_a', []);
dbfBand.Close;
dbfBand.Exclusive := false;
dbfBand.Open
}
procedure TfrmBigSquareStat.btnRefreshClick(Sender: TObject);
var
tmp : String = '';
bnd : String = '';
grb : String = '';
wkd : Word = 0;
cfm : Word = 0;
allwkd : longint = 0;
thiswkd : longint =0;
allwkdBig : longint = 0;
TotPos : longint = 0;
wkd : integer = 0;
cfm : integer = 0;
ll : String = '';
sum_wkd : Word = 0;
sum_cfm : Word = 0;
sum_wkd : integer = 0;
sum_cfm : integer = 0;
db : TBufDataset;
TableName : String;
begin
//db := TBufDataset.Create(nil);
tmrBlink.Enabled:=False;
TableName:='cqrlog_main';
try
//db.Fields.Clear;
//with db.FieldDefs do
//begin
// Add('loc', ftString, 4);
// Add('cfm',ftBoolean)
//end;
//db.CreateDataset;
//db.IndexDefs.Add('loc','loc',[ixPrimary]);
//db.Open;
dmData.Q.Close;
dmData.Q1.Close;
if dmData.trQ.Active then dmData.trQ.Rollback;
@ -136,24 +109,68 @@ begin
end;
tmp := copy(tmp,1,Length(tmp)-2); //remove "or"
if cmbBands.Text='ALL' then
bnd:=' '
else
bnd:= ' and band='+QuotedStr(cmbBands.Text);
dmData.trQ.StartTransaction;
dmData.trQ1.StartTransaction;
try
dmData.Q.SQL.Text := 'select upper(left(loc,2)) as ll FROM cqrlog_main where loc <> '+QuotedStr('')+
' and band='+QuotedStr(cmbBands.Text)+' group by ll';
if dmData.IsFilter then
begin
try
TableName:='statistic_filter';
dmData.Q.Close;
dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
dmData.Q.Close;
dmData.Q.SQL.Text:='CREATE VIEW '+TableName+' AS '+dmData.IsFilterSQL;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
dmData.Q.Close;
except
on E : EDatabaseError do
Begin
ShowMessage('Can not create filter view!');
Exit;
end;
end;
end;
dmData.Q.SQL.Text := 'select left(loc,2) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+' group by ll';
dmData.Q.Open;
dmData.Q.Last;
allwkdBig:=dmData.Q.RecordCount;
dmData.Q.Close;
dmData.Q.SQL.Text := 'select left(loc,4) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+' group by ll';
dmData.Q.Open;
dmData.Q.Last;
allwkd:=dmData.Q.RecordCount;
dmData.Q.Close;
dmData.Q.SQL.Text := 'select upper(left(loc,2)) as ll FROM '+TableName+' where loc <> '+QuotedStr('')+
bnd+' group by ll';
dmData.Q.Open;
dmData.Q.Last;
WriteHMTLHeader;
writeln(f,'<table>');
pbTot.Max:=dmData.Q.RecordCount;
thiswkd:= dmData.Q.RecordCount;
dmData.Q.First;
while not dmData.Q.Eof do
begin
inc(TotPos);
pbTot.Position:=TotPos;
Application.ProcessMessages;
ll := dmData.Q.Fields[0].AsString;
writeln(f,'<tr>'+LineEnding+'<td valign="middle">'+LineEnding+'<font color="black"><b>'+ll+'</b></font>'+LineEnding+'</td>');
writeln(f,'<td align="left">');
writeln(f,'<font color="black">');
dmData.Q1.Close;
dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM cqrlog_main where loc like '+
QuotedStr(ll+'%')+' and band = '+QuotedStr(cmbBands.Text)+
' group by lll order by loc';
dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM '+TableName+' where loc like '+
QuotedStr(ll+'%')+bnd+' group by lll order by loc';
dmData.Q1.Open;
db := TBufDataset.Create(nil); //I was not able to clear all records from TBufDataset without this workaround
@ -179,9 +196,8 @@ begin
if tmp <> '' then
begin
dmData.Q1.Close;
dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM cqrlog_main where loc like '+
QuotedStr(ll+'%')+' and band = '+QuotedStr(cmbBands.Text)+
'and ('+tmp+') group by lll order by loc';
dmData.Q1.SQL.Text := 'select upper(left(loc,4)) as lll FROM '+TableName+' where loc like '+
QuotedStr(ll+'%')+bnd+'and ('+tmp+') group by lll order by loc';
dmData.Q1.Open;
cfm := 0;
while not dmData.Q1.Eof do
@ -237,11 +253,26 @@ begin
Writeln(f,'<hr>');
Writeln(f,'<font color="black">'+LineEnding+'<b>Total:</b><br>');
Writeln(f,'Worked:',sum_wkd,'<br>');
Writeln(f,'Confirmed:',sum_cfm);
Writeln(f,'Confirmed:',sum_cfm,'<br>');
Writeln(f,'<b>Different squares:</b><br>');
if cmbBands.Text<>'ALL' then Writeln(f,'On this band:',thiswkd,'<br>');
Writeln(f,'On all bands:',allwkdBig,'/',allwkd);
Writeln(f,'</font>');
Writeln(f,'</body>');
Writeln(f,'</html>');
CloseFile(f)
CloseFile(f);
if dmData.IsFilter then
begin
try
dmData.Q.Close;
dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
Finally
end;
end;
finally
dmData.trQ.Rollback;
dmData.trQ1.Rollback
@ -263,6 +294,12 @@ begin
end
end;
procedure TfrmBigSquareStat.cmbBandsChange(Sender: TObject);
begin
tmrBlink.Enabled:=True;
pbTot.Position:=0;
end;
procedure TfrmBigSquareStat.WriteHMTLHeader;
begin
AssignFile(f,TmpFile);
@ -286,6 +323,7 @@ begin
TmpFile := GetTempFileNameUTF8(dmData.HomeDir,'square');
dmUtils.LoadForm(frmBigSquareStat);
dmUtils.FillBandCombo(cmbBands);
cmbBands.Items.Insert(0,'ALL');
if cqrini.ReadInteger('SquareStat','Band',0) > cmbBands.Items.Count-1 then
cmbBands.ItemIndex := 0
else
@ -297,7 +335,49 @@ begin
dlgSave.InitialDir := cqrini.ReadString('SquareStat','Directory',dmData.UsrHomeDir);
IpHtmlPanel1.Font.Color := clBlack;
btnRefresh.Click
pbTot.Min:=0;
pbTot.Max:=1;
pbTot.Smooth:=True;
pbTot.Step:=1;
pbTot.Enabled:=True;
pbTot.Position:=0;
tmrBlink.Enabled:=False;
lblFilterActive.Visible:= dmData.IsFilter;
cmbBandsChange(nil);
end;
procedure TfrmBigSquareStat.tmrBlinkStartTimer(Sender: TObject);
begin
btnRefresh.Caption:='Press to';
btnRefresh.Font.Color:=clGreen;
btnRefresh.Repaint;
end;
procedure TfrmBigSquareStat.tmrBlinkStopTimer(Sender: TObject);
begin
btnRefresh.Caption:='Refresh statistic';
btnRefresh.Font.Color:=clDefault;
btnRefresh.Repaint;
end;
procedure TfrmBigSquareStat.tmrBlinkTimer(Sender: TObject);
var
C :Tcolor;
t:String;
begin
case odd(SecondOf(Now)) of
True: Begin
C := clGreen;
T :='run statistic'
end;
False: Begin
C := clGreen;
T :='Press to'
end;
end;
btnRefresh.Caption:= T;
btnRefresh.Font.Color:=C;
btnRefresh.Repaint;
end;
end.

View File

@ -91,7 +91,7 @@ implementation
{$R *.lfm}
{ TfrmCWType }
uses fNewQSO,dUtils,dData, uMyIni;
uses fTRXControl,fNewQSO,dUtils,dData, uMyIni, fContest;
function TfrmCWType.PassedKey(key:char):boolean;
Begin
@ -140,6 +140,7 @@ procedure TfrmCWType.btnF1MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -154,6 +155,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F2',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -162,6 +164,7 @@ procedure TfrmCWType.btnF10MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F10',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -171,6 +174,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F10',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -184,9 +188,17 @@ procedure TfrmCWType.btnF1Click(Sender: TObject);
begin
m.SetFocus; //after click focus back to memo
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
begin
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F1',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''));
if frmContest.Showing then //set the "lastCqFreq" @contest window
Begin
frmContest.lblCqMode.Caption:=frmTRXControl.GetRawMode;
frmContest.lblCqFreq.Caption := FormatFloat('0.00',frmTRXControl.GetFreqkHz);
end;
end
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -194,6 +206,7 @@ procedure TfrmCWType.btnF2MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F2',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -208,6 +221,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F3',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -216,6 +230,7 @@ procedure TfrmCWType.btnF3MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F3',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -230,6 +245,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F4',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -238,6 +254,7 @@ procedure TfrmCWType.btnF4MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F4',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -252,6 +269,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F5',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -260,6 +278,7 @@ procedure TfrmCWType.btnF5MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F5',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -274,6 +293,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F6',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -282,6 +302,7 @@ procedure TfrmCWType.btnF6MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F6',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -296,6 +317,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F7',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -304,6 +326,7 @@ procedure TfrmCWType.btnF7MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F7',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -318,6 +341,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F8',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -326,6 +350,7 @@ procedure TfrmCWType.btnF8MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F8',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -340,6 +365,7 @@ begin
if Assigned(frmNewQSO.CWint) and (frmNewQSO.cmbMode.Text='CW') then
frmNewQSO.CWint.SendText(dmUtils.GetCWMessage('F9',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,''))
else ShowMessage('Radio: Not in CW mode!'+LineEnding+'or'+LineEnding+'CW interface: No keyer defined! ');
end;
@ -348,6 +374,7 @@ procedure TfrmCWType.btnF9MouseEnter(Sender: TObject);
begin
frmCWType.lblToShowMouseOverText.Caption:=dmUtils.GetCWMessage('F9',frmNewQSO.edtCall.Text,
frmNewQSO.edtHisRST.Text, frmNewQSO.edtContestSerialSent.Text,frmNewQSO.edtContestExchangeMessageSent.Text,
frmNewQSO.edtContestSerialReceived.Text,frmNewQSO.edtContestExchangeMessageReceived.Text,
frmNewQSO.edtName.Text,frmNewQSO.lblGreeting.Caption,'');
end;
@ -392,6 +419,8 @@ begin
end;
procedure TfrmCWType.FormShow(Sender: TObject);
var
n:string;
begin
dmUtils.LoadWindowPos(frmCWType);
rgMode.ItemIndex := cqrini.ReadInteger('CW','Mode',1);
@ -400,6 +429,15 @@ begin
m.Clear;
Switch2Word :=false;
WasMemoLen := length(m.lines.text);
n:=IntToStr(frmTRXControl.cmbRig.ItemIndex);
if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then
Begin
frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM';
edtSpeed.Enabled:=False;
end
else
edtSpeed.Enabled:=True;
//set debug rules for this form
LocalDbg := dmData.DebugLevel >= 1 ;
if dmData.DebugLevel < 0 then
@ -412,10 +450,19 @@ begin
end;
procedure TfrmCWType.edtSpeedChange(Sender: TObject);
var
n:string;
begin
if Assigned(frmNewQSO.CWint) then
begin
n:=IntToStr(frmTRXControl.cmbRig.ItemIndex);
frmNewQSO.CWint.SetSpeed(edtSpeed.Value);
if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then
frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM'
else
frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(edtSpeed.Value)+'WPM';
end;
end;
procedure TfrmCWType.fraCWKeys1Resize(Sender: TObject);
var
w, h, l, t: word;
@ -556,11 +603,16 @@ end;
procedure TfrmCWType.SetSpeed(change:integer);
var
speed : Integer = 0;
Begin
n : string;
begin
if Assigned(frmNewQSO.CWint) then
begin
n:=IntToStr(frmTRXControl.cmbRig.ItemIndex);
speed := frmNewQSO.CWint.GetSpeed+change;
frmNewQSO.CWint.SetSpeed(speed);
if (cqrini.ReadInteger('CW'+n,'Type',0)=1) and cqrini.ReadBool('CW'+n,'PotSpeed',False) then
frmNewQSO.sbNewQSO.Panels[4].Text := 'Pot WPM'
else
frmNewQSO.sbNewQSO.Panels[4].Text := IntToStr(speed)+'WPM';
edtSpeed.Value := speed;
end;

View File

@ -11,12 +11,12 @@ object frmCabrilloExport: TfrmCabrilloExport
OnClose = FormClose
OnCreate = FormCreate
OnShow = FormShow
LCLVersion = '2.0.12.0'
LCLVersion = '2.2.4.0'
object lblCabfileName: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 6
Height = 15
Height = 17
Top = 6
Width = 126
BorderSpacing.Left = 6
@ -29,9 +29,9 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Control = lblCabfileName
AnchorSideTop.Side = asrBottom
Left = 6
Height = 33
Height = 34
Hint = 'Write export file name and path or press Browse'
Top = 33
Top = 35
Width = 421
BorderSpacing.Top = 12
TabOrder = 0
@ -44,7 +44,7 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 435
Height = 25
Top = 37
Top = 40
Width = 75
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
@ -66,7 +66,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Cancel = True
Caption = 'Close'
ModalResult = 2
TabOrder = 14
TabOrder = 15
end
object btnCabExport: TButton
AnchorSideTop.Control = pbCabExport
@ -80,7 +80,7 @@ object frmCabrilloExport: TfrmCabrilloExport
BorderSpacing.Right = 6
Caption = 'Export'
OnClick = btnCabExportClick
TabOrder = 12
TabOrder = 13
end
object pbCabExport: TProgressBar
AnchorSideLeft.Control = lblCabfileName
@ -93,8 +93,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Anchors = [akLeft, akBottom]
BorderSpacing.Bottom = 21
Step = 1
TabOrder = 13
TabStop = True
TabOrder = 17
end
object lblCabDone: TLabel
AnchorSideLeft.Control = pbCabExport
@ -102,8 +101,8 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Control = pbCabExport
AnchorSideTop.Side = asrCenter
Left = 282
Height = 15
Top = 649
Height = 17
Top = 648
Width = 34
BorderSpacing.Left = 12
Caption = 'Done'
@ -115,8 +114,8 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Control = cmbCabContestName
AnchorSideTop.Side = asrCenter
Left = 6
Height = 15
Top = 75
Height = 17
Top = 78
Width = 95
BorderSpacing.Top = 6
Caption = 'Contest name:'
@ -126,23 +125,23 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideLeft.Control = lblCabfileName
AnchorSideBottom.Control = pbCabExport
Left = 6
Height = 15
Top = 619
Height = 17
Top = 617
Width = 94
Anchors = [akLeft, akBottom]
BorderSpacing.Bottom = 12
Caption = 'Error message'
ParentColor = False
OnClick = lblCabErrorClick
Visible = False
OnClick = lblCabErrorClick
end
object lblCabPower: TLabel
AnchorSideLeft.Control = lblCabfileName
AnchorSideTop.Control = cmbCabPower
AnchorSideTop.Side = asrCenter
Left = 6
Height = 15
Top = 106
Height = 17
Top = 109
Width = 44
Caption = 'Power:'
ParentColor = False
@ -154,7 +153,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Left = 123
Height = 29
Hint = 'Select category-power'
Top = 99
Top = 103
Width = 100
ItemHeight = 0
Items.Strings = (
@ -163,15 +162,15 @@ object frmCabrilloExport: TfrmCabrilloExport
'QRP'
)
Style = csDropDownList
TabOrder = 3
TabOrder = 4
end
object lblCabLocation: TLabel
AnchorSideLeft.Control = lblCabfileName
AnchorSideTop.Control = edtCabLocation
AnchorSideTop.Side = asrCenter
Left = 6
Height = 15
Top = 137
Height = 17
Top = 141
Width = 59
Caption = 'Location:'
ParentColor = False
@ -181,8 +180,8 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Control = gbCabQsoTail
AnchorSideTop.Side = asrBottom
Left = 6
Height = 15
Top = 529
Height = 17
Top = 544
Width = 76
BorderSpacing.Top = 15
Caption = 'Statistics:'
@ -196,9 +195,9 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Control = edtCabFileName
AnchorSideRight.Side = asrBottom
Left = 123
Height = 33
Height = 34
Hint = 'Select or type contest name'
Top = 66
Top = 69
Width = 304
Anchors = [akTop, akRight]
AutoComplete = True
@ -267,14 +266,14 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 6
Height = 80
Top = 286
Top = 292
Width = 504
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Caption = 'info sent'
ClientHeight = 62
ClientWidth = 502
TabOrder = 7
TabOrder = 8
object chkCabInfoSrst: TCheckBox
AnchorSideLeft.Control = gbCabInfoSent
AnchorSideTop.Control = gbCabInfoSent
@ -283,9 +282,8 @@ object frmCabrilloExport: TfrmCabrilloExport
Height = 23
Hint = 'Include RST, normally YES'
Top = 20
Width = 78
Width = 23
BorderSpacing.Left = 12
Caption = 'inc. RST'
Checked = True
ParentShowHint = False
ShowHint = True
@ -293,31 +291,31 @@ object frmCabrilloExport: TfrmCabrilloExport
TabOrder = 0
end
object cmbCabInfoSEx1: TComboBox
AnchorSideLeft.Control = chkCabInfoSrst
AnchorSideLeft.Control = edtCabInfoSrstWdt
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblCabSEx1Cmb
AnchorSideTop.Side = asrBottom
Left = 96
Height = 32
Left = 100
Height = 33
Hint = 'Exhange1 selection'
Top = 21
Top = 23
Width = 100
BorderSpacing.Left = 6
BorderSpacing.Left = 21
BorderSpacing.Top = 6
ItemHeight = 0
ParentShowHint = False
ShowHint = True
Style = csDropDownList
TabOrder = 1
TabOrder = 2
end
object edtCabInfoSEx1Wdt: TEdit
AnchorSideLeft.Control = cmbCabInfoSEx1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbCabInfoSEx1
Left = 202
Height = 33
Left = 206
Height = 34
Hint = 'Width of stx field '
Top = 21
Top = 23
Width = 38
BorderSpacing.Left = 6
MaxLength = 2
@ -325,7 +323,7 @@ object frmCabrilloExport: TfrmCabrilloExport
OnExit = edtCabInfoSEx1WdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 2
TabOrder = 3
Text = '6'
end
object cmbCabInfoSEx2: TComboBox
@ -335,7 +333,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Left = 318
Height = 29
Hint = 'Exhange2 selection'
Top = 21
Top = 23
Width = 100
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
@ -348,16 +346,16 @@ object frmCabrilloExport: TfrmCabrilloExport
ParentShowHint = False
ShowHint = True
Style = csDropDownList
TabOrder = 3
TabOrder = 4
end
object edtCabInfoSEx2Wdt: TEdit
AnchorSideTop.Control = cmbCabInfoSEx1
AnchorSideRight.Control = gbCabInfoSent
AnchorSideRight.Side = asrBottom
Left = 424
Height = 33
Height = 34
Hint = 'Width of stx_string field '
Top = 21
Top = 23
Width = 38
Anchors = [akTop, akRight]
BorderSpacing.Right = 40
@ -366,14 +364,14 @@ object frmCabrilloExport: TfrmCabrilloExport
OnExit = edtCabInfoSEx2WdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 4
TabOrder = 5
Text = '6'
end
object lblCabSEx1Cmb: TLabel
AnchorSideLeft.Control = cmbCabInfoSEx1
AnchorSideTop.Control = gbCabInfoSent
Left = 96
Height = 15
Left = 100
Height = 17
Top = 0
Width = 143
Caption = 'Exchange1 and width '
@ -383,12 +381,40 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideLeft.Control = cmbCabInfoSEx2
AnchorSideTop.Control = gbCabInfoSent
Left = 318
Height = 15
Height = 17
Top = 0
Width = 143
Caption = 'Exchange2 and width '
ParentColor = False
end
object edtCabInfoSrstWdt: TEdit
AnchorSideLeft.Control = chkCabInfoSrst
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbCabInfoSEx1
Left = 41
Height = 34
Hint = 'Width of stx field '
Top = 23
Width = 38
BorderSpacing.Left = 6
MaxLength = 2
NumbersOnly = True
OnExit = edtCabInfoSrstWdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 1
Text = '3'
end
object lblCabInfoSrst: TLabel
AnchorSideLeft.Control = chkCabInfoSrst
AnchorSideTop.Control = lblCabSEx1Cmb
Left = 12
Height = 17
Top = 0
Width = 65
Caption = 'RST width'
ParentColor = False
end
end
object gbCabInfoRcvd: TGroupBox
AnchorSideLeft.Control = lblCabfileName
@ -398,14 +424,14 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 6
Height = 80
Top = 372
Top = 378
Width = 504
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Caption = 'info rcvd'
ClientHeight = 62
ClientWidth = 502
TabOrder = 8
TabOrder = 9
object chkCabInfoRrst: TCheckBox
AnchorSideLeft.Control = gbCabInfoRcvd
AnchorSideTop.Control = gbCabInfoRcvd
@ -414,9 +440,8 @@ object frmCabrilloExport: TfrmCabrilloExport
Height = 23
Hint = 'Include RST, normally YES'
Top = 20
Width = 78
Width = 23
BorderSpacing.Left = 12
Caption = 'inc. RST'
Checked = True
ParentShowHint = False
ShowHint = True
@ -424,16 +449,16 @@ object frmCabrilloExport: TfrmCabrilloExport
TabOrder = 0
end
object cmbCabInfoREx1: TComboBox
AnchorSideLeft.Control = chkCabInfoRrst
AnchorSideLeft.Control = edtCabInfoRrstWdt
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblCabSrxCmb
AnchorSideTop.Side = asrBottom
Left = 96
Left = 100
Height = 29
Hint = 'Exhange1 selection'
Top = 21
Top = 23
Width = 100
BorderSpacing.Left = 6
BorderSpacing.Left = 21
BorderSpacing.Top = 6
ItemHeight = 0
Items.Strings = (
@ -444,25 +469,7 @@ object frmCabrilloExport: TfrmCabrilloExport
ParentShowHint = False
ShowHint = True
Style = csDropDownList
TabOrder = 1
end
object edtCabInfoREx1Wdt: TEdit
AnchorSideLeft.Control = cmbCabInfoREx1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbCabInfoREx1
Left = 202
Height = 33
Hint = 'Width of stx field '
Top = 21
Width = 38
BorderSpacing.Left = 6
MaxLength = 2
NumbersOnly = True
OnExit = edtCabInfoREx1WdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 2
Text = '6'
end
object cmbCabInfoREx2: TComboBox
AnchorSideLeft.Side = asrBottom
@ -471,7 +478,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Left = 318
Height = 29
Hint = 'Exhange2 selection'
Top = 21
Top = 23
Width = 100
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
@ -484,16 +491,16 @@ object frmCabrilloExport: TfrmCabrilloExport
ParentShowHint = False
ShowHint = True
Style = csDropDownList
TabOrder = 3
TabOrder = 4
end
object edtCabInfoREx2Wdt: TEdit
AnchorSideTop.Control = cmbCabInfoREx1
AnchorSideRight.Control = gbCabInfoRcvd
AnchorSideRight.Side = asrBottom
Left = 424
Height = 33
Height = 34
Hint = 'Width of stx_string field '
Top = 21
Top = 23
Width = 38
Anchors = [akTop, akRight]
BorderSpacing.Right = 40
@ -502,14 +509,14 @@ object frmCabrilloExport: TfrmCabrilloExport
OnExit = edtCabInfoREx2WdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 4
TabOrder = 5
Text = '6'
end
object lblCabSrxCmb: TLabel
AnchorSideLeft.Control = cmbCabInfoREx1
AnchorSideTop.Control = gbCabInfoRcvd
Left = 96
Height = 15
Left = 100
Height = 17
Top = 0
Width = 143
Caption = 'Exchange1 and width '
@ -519,12 +526,58 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideLeft.Control = cmbCabInfoREx2
AnchorSideTop.Control = gbCabInfoRcvd
Left = 318
Height = 15
Height = 17
Top = 0
Width = 143
Caption = 'Exchange2 and width '
ParentColor = False
end
object edtCabInfoREx1Wdt: TEdit
AnchorSideLeft.Control = cmbCabInfoREx1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbCabInfoREx1
Left = 206
Height = 34
Hint = 'Width of stx field '
Top = 23
Width = 38
BorderSpacing.Left = 6
MaxLength = 2
NumbersOnly = True
OnExit = edtCabInfoREx1WdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 3
Text = '6'
end
object edtCabInfoRrstWdt: TEdit
AnchorSideLeft.Control = chkCabInfoRrst
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbCabInfoREx1
Left = 41
Height = 34
Hint = 'Width of rst field '
Top = 23
Width = 38
BorderSpacing.Left = 6
MaxLength = 2
NumbersOnly = True
OnExit = edtCabInfoRrstWdtExit
ParentShowHint = False
ShowHint = True
TabOrder = 1
Text = '3'
end
object lblCabInfoRrst: TLabel
AnchorSideLeft.Control = chkCabInfoRrst
AnchorSideTop.Control = lblCabSrxCmb
Left = 12
Height = 17
Top = 0
Width = 65
Caption = 'RST width'
ParentColor = False
end
end
object gbCabQsoHeader: TGroupBox
AnchorSideLeft.Control = lblCabfileName
@ -534,20 +587,20 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 6
Height = 80
Top = 200
Top = 206
Width = 504
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Caption = 'QSO: common header'
ClientHeight = 62
ClientWidth = 502
TabOrder = 6
TabOrder = 7
object lblCabQsoHeader: TLabel
AnchorSideLeft.Control = gbCabQsoHeader
AnchorSideTop.Control = edtCabCallWdt
AnchorSideTop.Side = asrCenter
Left = 6
Height = 15
Height = 17
Top = 9
Width = 280
BorderSpacing.Left = 6
@ -559,7 +612,7 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Control = gbCabQsoHeader
AnchorSideRight.Side = asrBottom
Left = 458
Height = 33
Height = 34
Hint = 'Width of sent and rcvd callsign field'
Top = 0
Width = 38
@ -578,7 +631,7 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = edtCabCallWdt
Left = 373
Height = 15
Height = 17
Top = 9
Width = 82
Anchors = [akTop, akRight]
@ -594,7 +647,7 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideTop.Side = asrBottom
Left = 6
Height = 23
Top = 28
Top = 30
Width = 277
BorderSpacing.Top = 4
Caption = 'Use UpCase letters for all QSO records'
@ -610,20 +663,20 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 6
Height = 65
Top = 458
Top = 464
Width = 194
BorderSpacing.Top = 6
Caption = 'QSO: tail'
ClientHeight = 47
ClientWidth = 192
TabOrder = 9
TabOrder = 10
object lblCabQsoTail: TLabel
AnchorSideTop.Control = gbCabQsoTail
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = cmbCabTailTxCount
Left = 20
Height = 15
Top = 16
Height = 17
Top = 15
Width = 54
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
@ -663,19 +716,19 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Control = cmbCabContestName
AnchorSideRight.Side = asrBottom
Left = 123
Height = 33
Top = 128
Height = 34
Top = 132
Width = 304
Anchors = [akTop, akLeft, akRight]
TabOrder = 4
TabOrder = 5
end
object lblCabSoapBox: TLabel
AnchorSideLeft.Control = lblCabfileName
AnchorSideTop.Control = edtCabSoapBox
AnchorSideTop.Side = asrCenter
Left = 6
Height = 15
Top = 170
Height = 17
Top = 175
Width = 61
Caption = 'SoapBox:'
ParentColor = False
@ -687,11 +740,11 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Control = cmbCabContestName
AnchorSideRight.Side = asrBottom
Left = 123
Height = 33
Top = 161
Height = 34
Top = 166
Width = 304
Anchors = [akTop, akLeft, akRight]
TabOrder = 5
TabOrder = 6
end
object gbCabLayout: TGroupBox
AnchorSideLeft.Side = asrBottom
@ -701,7 +754,7 @@ object frmCabrilloExport: TfrmCabrilloExport
Left = 336
Height = 65
Hint = 'Save(/Load) all settings to file'
Top = 458
Top = 464
Width = 174
Anchors = [akTop, akRight]
BorderSpacing.Left = 6
@ -710,7 +763,7 @@ object frmCabrilloExport: TfrmCabrilloExport
ClientWidth = 172
ParentShowHint = False
ShowHint = True
TabOrder = 11
TabOrder = 12
object btCabSave: TButton
AnchorSideLeft.Control = gbCabLayout
AnchorSideTop.Control = gbCabLayout
@ -748,7 +801,7 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Control = gbCabLayout
Left = 206
Height = 65
Top = 458
Top = 464
Width = 124
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
@ -756,16 +809,16 @@ object frmCabrilloExport: TfrmCabrilloExport
ClientHeight = 47
ClientWidth = 122
ParentShowHint = False
TabOrder = 10
TabOrder = 11
object edtCabCountC: TEdit
AnchorSideLeft.Control = gbCabCoCount
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = gbCabCoCount
AnchorSideTop.Side = asrCenter
Left = 26
Height = 33
Height = 34
Hint = 'Type prefix for qsos to count'
Top = 7
Top = 6
Width = 70
CharCase = ecUppercase
OnExit = edtCabCountCExit
@ -782,15 +835,16 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = lblCabError
Left = 6
Height = 63
Top = 550
Height = 44
Top = 567
Width = 504
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 15
TabOrder = 16
TabStop = False
Visible = False
end
object btnCabFrmFlt: TButton
@ -801,40 +855,40 @@ object frmCabrilloExport: TfrmCabrilloExport
AnchorSideRight.Side = asrBottom
Left = 435
Height = 25
Top = 70
Top = 74
Width = 75
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'Frm Flt'
OnClick = btnCabFrmFltClick
TabOrder = 16
TabOrder = 3
end
object btnResultFile: TButton
AnchorSideRight.Control = btnCabClose
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = mCabStatistics
Left = 364
Left = 354
Height = 25
Top = 528
Top = 536
Width = 156
Anchors = [akRight, akBottom]
BorderSpacing.Bottom = 2
Caption = 'Open exported file'
OnClick = btnResultFileClick
TabOrder = 17
TabOrder = 14
end
object dlgCabSave: TSaveDialog
Title = 'Save with file name'
DefaultExt = '.cbr'
Filter = 'Cabrillo file|*.cbr'
left = 448
top = 112
Left = 448
Top = 112
end
object dlgCabOpen: TOpenDialog
Title = 'Open file'
DefaultExt = '.templ'
Filter = 'Cabrillo template|*.templ'
left = 448
top = 160
Left = 448
Top = 160
end
end

View File

@ -45,12 +45,14 @@ type
dlgCabSave: TSaveDialog;
edtCabCountC: TEdit;
edtCabCallWdt: TEdit;
edtCabInfoREx1Wdt: TEdit;
edtCabInfoRrstWdt: TEdit;
edtCabInfoSrstWdt: TEdit;
edtCabLocation: TEdit;
edtCabInfoREx2Wdt: TEdit;
edtCabInfoSEx1Wdt: TEdit;
edtCabInfoSEx2Wdt: TEdit;
edtCabFileName: TEdit;
edtCabInfoREx1Wdt: TEdit;
edtCabSoapBox: TEdit;
gbCabInfoRcvd: TGroupBox;
gbCabInfoSent: TGroupBox;
@ -58,6 +60,8 @@ type
gbCabQsoTail: TGroupBox;
gbCabLayout: TGroupBox;
gbCabCoCount: TGroupBox;
lblCabInfoRrst: TLabel;
lblCabInfoSrst: TLabel;
lblCabQsoHeader1: TLabel;
lblCabSoapBox: TLabel;
lblCabQsoHeader: TLabel;
@ -88,9 +92,11 @@ type
procedure edtCabCallWdtExit(Sender: TObject);
procedure edtCabInfoREx2WdtExit(Sender: TObject);
procedure edtCabInfoREx1WdtExit(Sender: TObject);
procedure edtCabInfoRrstWdtExit(Sender: TObject);
procedure edtCabInfoSEx2WdtExit(Sender: TObject);
procedure edtCabInfoSEx1WdtExit(Sender: TObject);
procedure edtCabCountCExit(Sender: TObject);
procedure edtCabInfoSrstWdtExit(Sender: TObject);
procedure FormClose(Sender : TObject; var CloseAction : TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender : TObject);
@ -136,12 +142,14 @@ begin
edtCabCallWdt.Text:= cqrini.ReadString('CabrilloExport','CallsWidth', '13');
chkCabInfoSrst.Checked:= cqrini.ReadBool('CabrilloExport','incRSTs',True);
edtCabInfoSrstWdt.Text := cqrini.ReadString('CabrilloExport','SRSTWidth', '3');
cmbCabInfoSEx1.ItemIndex:= cqrini.ReadInteger('CabrilloExport','StxOrder',0);
edtCabInfoSEx1Wdt.Text:= cqrini.ReadString('CabrilloExport','StxWidth','6');
cmbCabInfoSEx2.ItemIndex := cqrini.ReadInteger('CabrilloExport','StxStringOrder',0);
edtCabInfoSEx2Wdt.Text := cqrini.ReadString('CabrilloExport','StxStringWidth', '6');
chkCabInfoRrst.Checked:= cqrini.ReadBool('CabrilloExport','incRSTr',True);
edtCabInfoRrstWdt.Text := cqrini.ReadString('CabrilloExport','RRSTWidth', '3');
cmbCabInfoREx1.ItemIndex:= cqrini.ReadInteger('CabrilloExport','SrxOrder',0);
edtCabInfoREx1Wdt.Text:= cqrini.ReadString('CabrilloExport','SrxWidth','6');
cmbCabInfoREx2.ItemIndex := cqrini.ReadInteger('CabrilloExport','SrxStringOrder',0);
@ -189,12 +197,14 @@ begin
cqrini.WriteString('CabrilloExport','CallsWidth', edtCabCallWdt.Text);
cqrini.WriteBool('CabrilloExport','incRSTs',chkCabInfoSrst.Checked);
cqrini.WriteString('CabrilloExport','SRSTWidth', edtCabInfoSrstWdt.Text);
cqrini.WriteInteger('CabrilloExport','StxOrder',cmbCabInfoSEx1.ItemIndex);
cqrini.WriteString('CabrilloExport','StxWidth', edtCabInfoSEx1Wdt.Text);
cqrini.WriteInteger('CabrilloExport','StxStringOrder',cmbCabInfoSEx2.ItemIndex);
cqrini.WriteString('CabrilloExport','StxStringWidth', edtCabInfoSEx2Wdt.Text);
cqrini.WriteBool('CabrilloExport','incRSTr',chkCabInfoRrst.Checked);
cqrini.WriteString('CabrilloExport','RRSTWidth', edtCabInfoRrstWdt.Text);
cqrini.WriteInteger('CabrilloExport','SrxOrder',cmbCabInfoREx1.ItemIndex);
cqrini.WriteString('CabrilloExport','SrxWidth', edtCabInfoREx1Wdt.Text);
cqrini.WriteInteger('CabrilloExport','SrxStringOrder',cmbCabInfoREx2.ItemIndex);
@ -291,6 +301,7 @@ end;
procedure TfrmCabrilloExport.btnCabBrowseClick(Sender : TObject);
begin
dlgCabSave.InitialDir:=dmData.UsrHomeDir;
dlgCabSave.DefaultExt:='.cbr';
if dlgCabSave.Execute then
edtCabFileName.Text := dlgCabSave.FileName
end;
@ -391,6 +402,11 @@ Begin
end
end;
procedure TfrmCabrilloExport.edtCabInfoSrstWdtExit(Sender: TObject);
begin
edtCabInfoSrstWdt.Text:=NonZero(edtCabInfoSrstWdt.Text);
end;
procedure TfrmCabrilloExport.edtCabInfoSEx2WdtExit(Sender: TObject);
begin
edtCabInfoSEx2Wdt.Text:=NonZero(edtCabInfoSEx2Wdt.Text);
@ -400,6 +416,12 @@ procedure TfrmCabrilloExport.edtCabInfoREx1WdtExit(Sender: TObject);
begin
edtCabInfoREx1Wdt.Text:=NonZero(edtCabInfoREx1Wdt.Text);
end;
procedure TfrmCabrilloExport.edtCabInfoRrstWdtExit(Sender: TObject);
begin
edtCabInfoRrstWdt.Text:=NonZero(edtCabInfoRrstWdt.Text);
end;
procedure TfrmCabrilloExport.edtCabInfoREx2WdtExit(Sender: TObject);
begin
edtCabInfoREx2Wdt.Text:=NonZero(edtCabInfoREx2Wdt.Text);
@ -520,16 +542,17 @@ begin
try try
AssignFile(r,'/tmp/CabrilloReject.log');
Rewrite(r);
pbCabExport.Max := dmData.qCQRLOG.RecordCount;
dmData.qCQRLOG.Last;
pbCabExport.Max := dmData.qCQRLOG.RecordCount;
while not dmData.qCQRLOG.bof do
begin
tmp:='';
// Check for missing mandatory fields
if (dmData.qCQRLOG.FieldByName('qsodate').AsString = '') then
tmp:=tmp+'Missing qsodate, ';
if (dmData.qCQRLOG.FieldByName('time_on').AsString = '') then
tmp:=tmp+'Missing time_on, ';
if (dmData.qCQRLOG.FieldByName('time_off').AsString = '') then
tmp:=tmp+'Missing time_off, ';
if (dmData.qCQRLOG.FieldByName('callsign').AsString = '') then
tmp:=tmp+'Missing callsign, ';
if (CabrilloBandToFreq(dmData.qCQRLOG.FieldByName('band').AsString) = '') then
@ -617,46 +640,46 @@ begin
tmp:=tmp +
CabrilloMode(dmData.qCQRLOG.FieldByName('mode').AsString)+' '+
dmData.qCQRLOG.FieldByName('qsodate').AsString+' '+
StringReplace(dmData.qCQRLOG.FieldByName('time_on').AsString,':','',[rfReplaceAll, rfIgnoreCase])+' '+
Format('%-'+edtCabCallWdt.Text+'.'+edtCabCallWdt.Text+'s', [mycall]);
StringReplace(dmData.qCQRLOG.FieldByName('time_off').AsString,':','',[rfReplaceAll, rfIgnoreCase])+' '+
Format('%0:-'+edtCabCallWdt.Text+'s', [mycall]);
//end of common header
if chkCabInfoSrst.Checked then tmp:=tmp+' '+ Format('%-3s', [dmData.qCQRLOG.FieldByName('rst_s').AsString]);
if chkCabInfoSrst.Checked then tmp:=tmp+' '+ Format('%0:-'+edtCabInfoSrstWdt.Text+'s', [dmData.qCQRLOG.FieldByName('rst_s').AsString]);
if (cmbCabInfoSEx1.ItemIndex > 0) then
Begin
if (cmbCabInfoSEx1.Text = 'my_name') then
tmp:=tmp+' '+Format('%-'+edtCabInfoSEx1Wdt.Text+'.'+edtCabInfoSEx1Wdt.Text+'s', [myname])
tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx1Wdt.Text+'s', [myname])
else
tmp:=tmp+' '+Format('%-'+edtCabInfoSEx1Wdt.Text+'.'+edtCabInfoSEx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
cmbCabInfoSEx1.Text).AsString]) ;
end;
if (cmbCabInfoSEx2.ItemIndex > 0) then
Begin
if (cmbCabInfoSEx2.Text = 'my_name') then
tmp:=tmp+' '+Format('%-'+edtCabInfoSEx2Wdt.Text+'.'+edtCabInfoSEx2Wdt.Text+'s', [myname])
tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx2Wdt.Text+'s', [myname])
else
tmp:=tmp+' '+Format('%-'+edtCabInfoSEx2Wdt.Text+'.'+edtCabInfoSEx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
tmp:=tmp+' '+Format('%0:-'+edtCabInfoSEx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
cmbCabInfoSEx2.Text).AsString]) ;
end;
//end of info sent
tmp:=tmp+' '+ call;
if chkCabInfoRrst.Checked then tmp:=tmp+' '+ Format('%-3s', [dmData.qCQRLOG.FieldByName('rst_r').AsString]);
if chkCabInfoRrst.Checked then tmp:=tmp+' '+ Format('%0:-'+edtCabInfoRrstWdt.Text+'s', [dmData.qCQRLOG.FieldByName('rst_r').AsString]);
if (cmbCabInfoREx1.ItemIndex > 0) then
Begin
tmp:=tmp+' '+Format('%-'+edtCabInfoREx1Wdt.Text+'.'+edtCabInfoREx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
tmp:=tmp+' '+Format('%0:-'+edtCabInfoREx1Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
cmbCabInfoREx1.Text).AsString]) ;
end;
if (cmbCabInfoREx2.ItemIndex > 0) then
Begin
tmp:=tmp+' '+Format('%-'+edtCabInfoREx2Wdt.Text+'.'+edtCabInfoREx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
tmp:=tmp+' '+Format('%0:-'+edtCabInfoREx2Wdt.Text+'s',[dmData.qCQRLOG.FieldByName(
cmbCabInfoREx2.Text).AsString]) ;
end;
//end of info rcvd
if (cmbCabTailTxCount.Text<>'') then tmp:=tmp+' '+Format('%1s',[ cmbCabTailTxCount.Text]);
if (cmbCabTailTxCount.Text<>'') then tmp:=tmp+' '+Format('%0:1s',[ cmbCabTailTxCount.Text]);
if chkUpCase.Checked then tmp:=UpperCase(tmp);
@ -800,7 +823,11 @@ end;
procedure TfrmCabrilloExport.btCabLoadClick(Sender: TObject);
begin
dlgCabOpen.InitialDir := dmData.HomeDir;
if dlgCabOpen.Execute then loadCabLay(dlgCabOpen.FileName);
if dlgCabOpen.Execute then
if FileExists(dlgCabOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist
loadCabLay(dlgCabOpen.FileName)
else
ShowMessage('File not found!');
end;
procedure TfrmCabrilloExport.saveCabLay(filename:String);
var
@ -816,12 +843,14 @@ begin
filini.WriteString('CabrilloExport','CallsWidth', edtCabCallWdt.Text);
filini.WriteBool('CabrilloExport','incRSTs',chkCabInfoSrst.Checked);
filini.WriteString('CabrilloExport','SRSTWidth', edtCabInfoSrstWdt.Text);
filini.WriteInteger('CabrilloExport','StxOrder',cmbCabInfoSEx1.ItemIndex);
filini.WriteString('CabrilloExport','StxWidth', edtCabInfoSEx1Wdt.Text);
filini.WriteInteger('CabrilloExport','StxStringOrder',cmbCabInfoSEx2.ItemIndex);
filini.WriteString('CabrilloExport','StxStringWidth', edtCabInfoSEx2Wdt.Text);
filini.WriteBool('CabrilloExport','incRSTr',chkCabInfoRrst.Checked);
filini.WriteString('CabrilloExport','RRSTWidth', edtCabInfoRrstWdt.Text);
filini.WriteInteger('CabrilloExport','SrxOrder',cmbCabInfoREx1.ItemIndex);
filini.WriteString('CabrilloExport','SrxWidth', edtCabInfoREx1Wdt.Text);
filini.WriteInteger('CabrilloExport','SrxStringOrder',cmbCabInfoREx2.ItemIndex);
@ -854,12 +883,14 @@ var
edtCabCallWdt.Text:= filini.ReadString('CabrilloExport','CallsWidth', '13');
chkCabInfoSrst.Checked:= filini.ReadBool('CabrilloExport','incRSTs',True);
edtCabInfoSrstWdt.Text := filini.ReadString('CabrilloExport','SRSTWidth', '3');
cmbCabInfoSEx1.ItemIndex:= filini.ReadInteger('CabrilloExport','StxOrder',0);
edtCabInfoSEx1Wdt.Text:= filini.ReadString('CabrilloExport','StxWidth','6');
cmbCabInfoSEx2.ItemIndex := filini.ReadInteger('CabrilloExport','StxStringOrder',0);
edtCabInfoSEx2Wdt.Text := filini.ReadString('CabrilloExport','StxStringWidth', '6');
chkCabInfoRrst.Checked:= filini.ReadBool('CabrilloExport','incRSTr',True);
edtCabInfoRrstWdt.Text := filini.ReadString('CabrilloExport','RRSTWidth', '3');
cmbCabInfoREx1.ItemIndex:= filini.ReadInteger('CabrilloExport','SrxOrder',0);
edtCabInfoREx1Wdt.Text:= filini.ReadString('CabrilloExport','SrxWidth','6');
cmbCabInfoREx2.ItemIndex := filini.ReadInteger('CabrilloExport','SrxStringOrder',0);

View File

@ -42,7 +42,7 @@ object frmChangeFreq: TfrmChangeFreq
Height = 17
Top = 72
Width = 32
Caption = 'RTTY'
Caption = 'DATA'
ParentColor = False
end
object Label5: TLabel
@ -77,7 +77,7 @@ object frmChangeFreq: TfrmChangeFreq
OnKeyPress = ChkKeyPress
TabOrder = 2
end
object edtRTTY: TEdit
object edtData: TEdit
Left = 168
Height = 34
Top = 89

View File

@ -17,7 +17,7 @@ type
btnCancel: TButton;
edtRXOffset : TEdit;
edtCW: TEdit;
edtRTTY: TEdit;
edtData: TEdit;
edtEnd: TEdit;
edtBegin: TEdit;
edtTXOffset : TEdit;
@ -70,10 +70,10 @@ begin
exit
end;
if NOT TryStrToCurr(edtRTTY.Text,f) then
if NOT TryStrToCurr(edtData.Text,f) then
begin
Application.MessageBox('You must enter correct frequency!','Error',mb_OK+mb_IconError);
edtRTTY.SetFocus;
edtData.SetFocus;
exit
end;

View File

@ -118,7 +118,7 @@ begin
cmbStoreZipCode.ItemIndex := SectionExists('ZipCode',Sections);
cmbStoreLoTW.ItemIndex := SectionExists('LoTW',Sections);
cmbStoreCWInterface.ItemIndex := SectionExists('CW',Sections);
cmbStoreCWInterface.ItemIndex := SectionExists('CW1',Sections);
cmbStoreFldigiInterface.ItemIndex := SectionExists('fldigi',Sections);
cmbStoreAutoBackup.ItemIndex := SectionExists('Backup',Sections);
cmbStoreExtViewers.ItemIndex := SectionExists('ExtView',Sections);
@ -146,11 +146,11 @@ begin
if cmbStoreVisColumns.ItemIndex>0 then
Sections := Sections + 'Columns,';
if cmbStoreTRXControl.ItemIndex>0 then
Sections := Sections + 'TRX,TRX1,TRX2,';
Sections := Sections + 'TRX,TRX1,TRX2,TRX3,TRX4,TRX5,TRX6,';
if cmbStoreRotorControl.ItemIndex>0 then
Sections := Sections + 'ROT,ROT1,ROT2,';
if cmbStoreModes.ItemIndex>=0 then
Sections := Sections + 'Band1,Band2,Modes,';
if cmbStoreModes.ItemIndex>0 then
Sections := Sections + 'Band1,Band2,Band3,Band4,Band5,Band6,Modes,';
if cmbStoreExport.ItemIndex>0 then
Sections := Sections + 'Export,';
if cmbStoreCluster.ItemIndex>0 then
@ -168,7 +168,7 @@ begin
if cmbStoreLoTW.ItemIndex>0 then
Sections := Sections + 'LoTW,';
if cmbStoreCWInterface.ItemIndex>0 then
Sections := Sections + 'CW,';
Sections := Sections + 'CW,CW1,CW2,CW3,CW4,CW5,CW6';
if cmbStoreFldigiInterface.ItemIndex>0 then
Sections := Sections + 'fldigi,wsjt,n1mm';
if cmbStoreAutoBackup.ItemIndex>0 then

View File

@ -1,26 +1,26 @@
object frmContest: TfrmContest
Left = 370
Height = 178
Top = 281
Width = 706
Left = 378
Height = 367
Top = 156
Width = 685
HelpType = htKeyword
HelpKeyword = 'help/contest.html'
Caption = 'Contest'
ClientHeight = 178
ClientWidth = 706
ClientHeight = 367
ClientWidth = 685
OnClose = FormClose
OnCreate = FormCreate
OnHide = FormHide
OnKeyDown = FormKeyDown
OnShow = FormShow
LCLVersion = '2.0.12.0'
LCLVersion = '2.2.6.0'
object edtCall: TEdit
AnchorSideLeft.Control = lblContestName
AnchorSideTop.Control = lblCall
AnchorSideTop.Side = asrBottom
Left = 17
Left = 6
Height = 34
Top = 59
Top = 124
Width = 140
AutoSelect = False
CharCase = ecUppercase
@ -29,28 +29,28 @@ object frmContest: TfrmContest
OnExit = edtCallExit
OnKeyDown = edtCallKeyDown
OnKeyPress = edtCallKeyPress
TabOrder = 0
TabOrder = 1
end
object edtRSTs: TEdit
AnchorSideLeft.Control = edtCall
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtCall
Left = 157
Left = 146
Height = 34
Top = 59
Top = 124
Width = 50
MaxLength = 20
OnKeyDown = edtCallKeyDown
TabOrder = 7
TabOrder = 8
end
object edtSTX: TEdit
AnchorSideLeft.Control = edtRSTs
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTs
Left = 207
Left = 196
Height = 34
Hint = 'contest serial number sent, max 6 characters'
Top = 59
Hint = 'Contest serial number sent, max 6 characters'
Top = 124
Width = 50
MaxLength = 6
OnExit = edtSTXExit
@ -58,16 +58,16 @@ object frmContest: TfrmContest
OnKeyPress = edtSTXKeyPress
ParentShowHint = False
ShowHint = True
TabOrder = 8
TabOrder = 15
end
object edtSTXStr: TEdit
AnchorSideLeft.Control = edtSTX
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtSTX
Left = 257
Left = 246
Height = 34
Hint = 'contest exchange message sent, max 50 characters'
Top = 59
Hint = 'Contest exchange message sent, max 50 characters'
Top = 124
Width = 100
MaxLength = 50
OnEnter = edtSTXStrEnter
@ -75,122 +75,131 @@ object frmContest: TfrmContest
OnKeyDown = edtCallKeyDown
ParentShowHint = False
ShowHint = True
TabOrder = 13
TabOrder = 14
end
object edtRSTr: TEdit
AnchorSideLeft.Control = edtSTXStr
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtSTXStr
Left = 373
Left = 362
Height = 34
Top = 59
Top = 124
Width = 50
BorderSpacing.Left = 16
MaxLength = 20
OnEnter = edtRSTrEnter
OnKeyDown = edtCallKeyDown
TabOrder = 1
TabOrder = 2
end
object edtSRX: TEdit
AnchorSideLeft.Control = edtRSTr
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTr
Left = 423
Left = 412
Height = 34
Hint = 'contest serial number received, max 6 characters'
Top = 59
Hint = 'Contest serial number received, max 6 characters'
Top = 124
Width = 50
MaxLength = 6
OnChange = edtSRXChange
OnEnter = edtRSTrEnter
OnExit = edtSRXExit
OnKeyDown = edtCallKeyDown
OnKeyPress = edtSTXKeyPress
ParentShowHint = False
ShowHint = True
TabOrder = 2
TabOrder = 3
end
object btSave: TButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblMSGr
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 609
Left = 588
Height = 30
Top = 42
Top = 107
Width = 80
Anchors = [akTop, akRight]
BorderSpacing.Right = 17
Caption = 'Save QSO'
OnClick = btSaveClick
TabOrder = 4
TabOrder = 5
end
object edtSRXStr: TEdit
AnchorSideLeft.Control = edtSRX
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTr
Left = 473
Left = 462
Height = 34
Hint = 'contest exchange message sent, max 50 characters'
Top = 59
Hint = 'Contest exchange message sent, max 50 characters'
Top = 124
Width = 100
MaxLength = 50
OnChange = edtSRXStrChange
OnEnter = edtRSTrEnter
OnKeyDown = edtCallKeyDown
ParentShowHint = False
ShowHint = True
TabOrder = 3
TabOrder = 4
end
object lblCall: TLabel
AnchorSideLeft.Control = lblContestName
AnchorSideTop.Control = chkTabAll
AnchorSideTop.Control = CQpanel
AnchorSideTop.Side = asrBottom
Left = 17
Left = 6
Height = 17
Top = 42
Top = 107
Width = 25
BorderSpacing.Top = 1
BorderSpacing.Top = 3
Caption = 'Call'
ParentColor = False
end
object lblRSTs: TLabel
AnchorSideLeft.Control = edtRSTs
AnchorSideTop.Control = lblCall
Left = 161
Left = 146
Height = 17
Top = 42
Top = 107
Width = 36
Caption = 'RST s'
ParentColor = False
end
object lblMSGs: TLabel
AnchorSideLeft.Control = edtSTXStr
AnchorSideTop.Control = lblNRs
Left = 257
Left = 246
Height = 17
Top = 42
Top = 107
Width = 41
Caption = 'MSG s'
ParentColor = False
end
object lblRSTr: TLabel
AnchorSideLeft.Control = edtRSTr
AnchorSideTop.Control = lblMSGs
Left = 377
Left = 362
Height = 17
Top = 42
Top = 107
Width = 34
Caption = 'RST r'
ParentColor = False
end
object lblNRr: TLabel
AnchorSideLeft.Control = edtSRX
AnchorSideTop.Control = lblRSTr
Left = 425
Left = 412
Height = 17
Top = 42
Top = 107
Width = 28
Caption = 'NR r'
ParentColor = False
end
object lblMSGr: TLabel
AnchorSideLeft.Control = edtSRXStr
AnchorSideTop.Control = lblNRr
Left = 481
Left = 462
Height = 17
Top = 42
Top = 107
Width = 39
Caption = 'MSG r'
ParentColor = False
@ -198,21 +207,25 @@ object frmContest: TfrmContest
object chkNRInc: TCheckBox
AnchorSideLeft.Control = edtSTX
AnchorSideTop.Control = chkTrueRST
Left = 207
Left = 196
Height = 23
Top = 93
Hint = 'When cheked STX number is created from 001.'#10'Number can be edited in case of wrong entry and counting'#10'increases from number shown when QSO is saved.'
Top = 158
Width = 45
Caption = 'Inc'
OnChange = chkNRIncChange
OnClick = chkNRIncClick
ParentShowHint = False
ShowHint = True
TabOrder = 9
TabStop = False
end
object lblNRs: TLabel
AnchorSideLeft.Control = edtSTX
AnchorSideTop.Control = lblRSTs
Left = 209
Left = 196
Height = 17
Top = 42
Top = 107
Width = 30
Caption = 'NR s'
ParentColor = False
@ -220,72 +233,85 @@ object frmContest: TfrmContest
object chkLoc: TCheckBox
AnchorSideLeft.Control = edtSRXStr
AnchorSideTop.Control = chkNoNr
Left = 473
Left = 462
Height = 23
Top = 93
Hint = 'Several options to choose with right mouse click.'#10'When one of them checked saving QSO will copy '#10'received message to that column of log'#10'.'#10'If you select option, remember also check the chkbox!'#10'.'#10'Received message is, of course, always saved to SRX_String'#10'column too.'
Top = 158
Width = 102
Caption = 'MSG is Grid'
ParentShowHint = False
PopupMenu = popSetMsg
TabOrder = 14
ShowHint = True
TabOrder = 10
TabStop = False
end
object chkSpace: TCheckBox
AnchorSideLeft.Control = lblContestName
AnchorSideTop.Control = edtCall
AnchorSideTop.Side = asrBottom
Left = 17
Left = 6
Height = 23
Top = 93
Hint = 'When checked spacebar works like Tab key.'#10'NOTE: prevents space(s) in MSG received'
Top = 158
Width = 113
Caption = 'SPACE is TAB'
TabOrder = 11
ParentShowHint = False
ShowHint = True
TabOrder = 18
TabStop = False
end
object chkNoNr: TCheckBox
AnchorSideLeft.Control = edtSRX
AnchorSideTop.Control = chkNRInc
Left = 423
Left = 412
Height = 23
Top = 93
Hint = 'When checked Tab skips this column (contest has no serial Nr)'
Top = 158
Width = 44
Caption = 'No'
OnChange = chkNoNrChange
TabOrder = 15
ParentShowHint = False
ShowHint = True
TabOrder = 12
TabStop = False
end
object chkTrueRST: TCheckBox
AnchorSideLeft.Control = edtRSTs
AnchorSideTop.Control = chkSpace
Left = 157
Left = 146
Height = 23
Top = 93
Hint = 'When checked Tab stops to RST(s) allowing entering of true reports'
Top = 158
Width = 46
Caption = 'Tru'
OnChange = chkTrueRSTChange
TabOrder = 12
ParentShowHint = False
ShowHint = True
TabOrder = 13
TabStop = False
end
object btClearQso: TButton
AnchorSideLeft.Control = btSave
AnchorSideTop.Control = btSave
AnchorSideTop.Side = asrBottom
Left = 609
Left = 588
Height = 30
Top = 74
Top = 139
Width = 80
BorderSpacing.Top = 2
Caption = 'Clear QSO'
OnClick = btClearQsoClick
TabOrder = 6
TabOrder = 7
end
object btnHelp: TSpeedButton
AnchorSideTop.Control = Owner
AnchorSideTop.Control = cmbContestName
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 678
Left = 657
Height = 25
Hint = 'Help'
Top = 3
Top = 11
Width = 25
Anchors = [akTop, akRight]
BorderSpacing.Top = 3
@ -329,11 +355,11 @@ object frmContest: TfrmContest
object lblContestName: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbContestName
Left = 17
Left = 6
Height = 17
Top = 1
Top = 6
Width = 91
BorderSpacing.Left = 17
BorderSpacing.Left = 6
Caption = 'Contest name'
ParentColor = False
end
@ -342,16 +368,15 @@ object frmContest: TfrmContest
AnchorSideTop.Control = Owner
AnchorSideRight.Control = edtSRXStr
AnchorSideRight.Side = asrBottom
Left = 141
Left = 130
Height = 34
Hint = 'contestname, choose ADIF contest_id via combobox or type freestyle max 40 characters'
Top = 1
Hint = 'Contestname, choose ADIF contest_id via combobox '#10'or type free text max 40 characters.'#10'Recommended to add contest year(week/month/day) if several'#10'contests are kept in same log. Helps Contest filter usage'#10'.'#10'If contest name combo box has name "Status" view is updated by '#10'CommonStatus rules. User can adjust that view.'#10'There are also predefined strings that cause contest specific '#10'Status displayed'
Top = 6
Width = 432
Anchors = [akTop, akRight]
AutoComplete = True
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending]
BorderSpacing.Left = 30
BorderSpacing.Top = 1
BorderSpacing.Top = 6
ItemHeight = 0
Items.Strings = (
'070-160M-SPRINT'
@ -580,33 +605,42 @@ object frmContest: TfrmContest
'YUDXC'
)
MaxLength = 40
OnExit = cmbContestNameExit
ParentShowHint = False
ShowHint = True
TabOrder = 10
TabOrder = 11
TabStop = False
end
object chkQsp: TCheckBox
AnchorSideLeft.Control = edtSTXStr
AnchorSideTop.Control = chkNRInc
Left = 257
Left = 246
Height = 23
Top = 93
Hint = 'When checked allows circulating STX_String.'#10'I.E. set MSG_s at start, after 1st QSO is saved your MSG_s'#10'changes to MSG_r received from last logged QSO.'
Top = 158
Width = 51
Caption = 'Qsp'
OnChange = chkQspChange
ParentShowHint = False
ShowHint = True
TabOrder = 16
TabStop = False
end
object chkTabAll: TCheckBox
AnchorSideLeft.Control = lblContestName
AnchorSideTop.Control = lblContestName
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbContestName
AnchorSideTop.Side = asrBottom
Left = 17
Left = 6
Height = 23
Top = 18
Hint = 'When checked TAB will move through all columns in order'
Top = 43
Width = 106
BorderSpacing.Left = 6
BorderSpacing.Top = 3
Caption = 'TAB in order'
OnChange = chkTabAllChange
ParentShowHint = False
ShowHint = True
TabOrder = 17
TabStop = False
end
@ -616,8 +650,8 @@ object frmContest: TfrmContest
AnchorSideBottom.Control = Owner
Left = 0
Height = 19
Top = 159
Width = 706
Top = 348
Width = 685
Panels = <
item
Text = '0'
@ -646,11 +680,12 @@ object frmContest: TfrmContest
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbContestName
AnchorSideTop.Side = asrCenter
Left = 591
Height = 1
Top = 18
Width = 1
BorderSpacing.Left = 18
Left = 571
Height = 17
Top = 15
Width = 33
BorderSpacing.Left = 9
Caption = 'WPM'
ParentColor = False
end
object rbDupeCheck: TRadioButton
@ -659,51 +694,60 @@ object frmContest: TfrmContest
AnchorSideTop.Side = asrBottom
Left = 17
Height = 23
Top = 124
Hint = 'Dupe = station already worked in this band.'#10'When selected, with date, duplicate cheking starts from set date.'#10'Date is needed if you have several contests in same log'#10'.'#10'With own log for every contest date is not needed to be set'#10'.'#10'Turns call column text to bold red. If QSO is how ever logged '#10'adds "/D" to RSTsend if "Mark dupe" is cheked.'#10' '
Top = 189
Width = 102
BorderSpacing.Left = 17
BorderSpacing.Top = 8
Caption = 'Dupe check'
Checked = True
TabOrder = 21
ParentShowHint = False
ShowHint = True
TabOrder = 22
TabStop = True
end
object rbNoMode4Dupe: TRadioButton
AnchorSideLeft.Control = btDupChkStart
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbDupeCheck
Left = 156
Left = 144
Height = 23
Top = 124
Hint = 'This selection allows same station to be worked in same band'#10' if QSO mode is different.'#10#10'Otherwise like "Dupe check" selction.'
Top = 189
Width = 122
BorderSpacing.Left = 18
BorderSpacing.Left = 6
Caption = 'NoMode4Dupe'
TabOrder = 19
ParentShowHint = False
ShowHint = True
TabOrder = 20
end
object rbIgnoreDupes: TRadioButton
AnchorSideLeft.Control = rbNoMode4Dupe
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbDupeCheck
Left = 296
Left = 272
Height = 23
Top = 124
Hint = 'No duplicate cheking'
Top = 189
Width = 110
BorderSpacing.Left = 18
BorderSpacing.Left = 6
Caption = 'Ignore dupes'
OnChange = rbIgnoreDupesChange
TabOrder = 20
ParentShowHint = False
ShowHint = True
TabOrder = 21
end
object btClearAll: TButton
AnchorSideLeft.Control = btSave
AnchorSideTop.Control = rbDupeCheck
AnchorSideTop.Side = asrCenter
Left = 609
Left = 588
Height = 30
Top = 120
Top = 185
Width = 80
Caption = 'Clear All'
OnClick = btClearAllClick
TabOrder = 5
TabOrder = 6
TabStop = False
end
object btDupChkStart: TButton
@ -713,29 +757,309 @@ object frmContest: TfrmContest
AnchorSideTop.Side = asrCenter
Left = 122
Height = 33
Hint = 'When using common log, set date of dupe check begin (contest start date)'
Top = 119
Hint = 'When using common log for all contests set date of '#10'dupe check begin (I.E. contest start date)'
Top = 184
Width = 16
AutoSize = True
BorderSpacing.Left = 3
Constraints.MaxHeight = 35
Constraints.MaxWidth = 180
OnClick = btDupChkStartClick
TabOrder = 22
ParentShowHint = False
ShowHint = True
TabOrder = 23
TabStop = False
end
object Label1: TLabel
Left = 270
Height = 1
Top = 150
Width = 1
object chkSP: TCheckBox
AnchorSideLeft.Control = edtSTXStr
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = chkQsp
AnchorSideTop.Side = asrCenter
Left = 346
Height = 23
Hint = 'When cheked form is in Search and Pounce mode where operator'#10'needs to launch all memory contents using function keys (F1-F9)'#10'With CW Messages this means "S&P(default)" set of memories.'#10'.'#10'When NOT checked message F2 is launched when cursor enters to'#10'one of RSTr, NRr or MSGr (F2 must be defined by operator)'#10'In case of duplicate call is found message F3 is launced instead'#10'of F2 when cursor leaves CALL column (F3 must be defined by operator)'#10'When QSO is saved message F4 is lauched. (F4 must be defined by operator)'#10'With CW Messages this means "Run" set of memories.'#10'.'#10'When S&P checkbox changes state also CW message sets are switched.'#10'.'#10'CW messages can be stopped with one 1xESC key as usual.'#10#10'Suggestions for CW "Run" set message macros (NewQSO/File/CW messages):'#10'F1 = cq %mc test (%mc is station call)'#10'F2 = %c %xrs (%c call %xrs sends CALL+ RST+STX+STXStr in short form.)'#10'F3 = %c QSO'#10'F4 = tu %mc test'
Top = 158
Width = 52
Caption = 'S&&P'
OnClick = chkSPClick
ParentShowHint = False
ShowHint = True
TabOrder = 24
TabStop = False
end
object gbStatus: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = rbDupeCheck
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = sbContest
Left = 6
Height = 130
Top = 218
Width = 673
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BorderSpacing.Right = 6
Caption = 'Status'
ClientHeight = 112
ClientWidth = 671
TabOrder = 25
OnClick = gbStatusClick
object mStatus: TMemo
AnchorSideLeft.Control = gbStatus
AnchorSideTop.Control = gbStatus
AnchorSideRight.Control = gbStatus
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = gbStatus
AnchorSideBottom.Side = asrBottom
Left = 3
Height = 91
Hint = 'Shows status of contest.'#10'If contest has any name common status counting is used. That'#10'includes QSO counts for all, dx and own continent with lists of'#10'DX and own continent prefixes.'#10'Also received messages are counted and listed allowing msg'#10'multiplier count.'#10'Use can control these with left click of mouse pointing between'#10'text "Status" and status display area'#10'.'#10'Currently if there are contest names that include "mwc"or "ok1wc"'#10'and "nac" those statuses are counted by MWC or NAC rules'#10'.'#10'Update is done evey time QSO is saved or 2xESC is pressed.'
Top = 18
Width = 665
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 3
BorderSpacing.Top = 18
BorderSpacing.Right = 3
BorderSpacing.Bottom = 3
ParentShowHint = False
ReadOnly = True
ScrollBars = ssAutoBoth
ShowHint = True
TabOrder = 0
TabStop = False
end
end
object chkMarkDupe: TCheckBox
AnchorSideLeft.Control = rbIgnoreDupes
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbDupeCheck
Left = 400
Height = 23
Hint = 'If duplicate QSO is logged adds "/D" to RSTsend when cheked.'
Top = 189
Width = 95
BorderSpacing.Left = 18
Caption = 'Mark dupe'
ParentShowHint = False
ShowHint = True
TabOrder = 26
TabStop = False
end
object chkHint: TCheckBox
AnchorSideLeft.Control = chkTabAll
AnchorSideTop.Control = chkTabAll
AnchorSideTop.Side = asrBottom
Left = 6
Height = 23
Hint = 'Turn hint help texts showing ON/OFF '
Top = 66
Width = 90
Caption = 'Show hint'
Checked = True
OnChange = chkHintChange
ParentShowHint = False
ShowHint = True
State = cbChecked
TabOrder = 27
TabStop = False
end
object CQpanel: TPanel
AnchorSideLeft.Control = cmbContestName
AnchorSideTop.Control = cmbContestName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = cmbContestName
AnchorSideRight.Side = asrBottom
Left = 130
Height = 61
Top = 43
Width = 432
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 3
ClientHeight = 61
ClientWidth = 432
TabOrder = 0
object spCQperiod: TSpinEdit
AnchorSideLeft.Control = lblCQperiod
AnchorSideTop.Control = lblCQperiod
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 7
Height = 34
Hint = 'Timer repeat period for sending F1 (CQ).'#10'Value is milliseconds 5000 -50000 (5 -50 sec)'#10'As there is no indication how long F1 sending'#10'takes value should be adjusted manually.'#10' Set repeats=1, press CQ start and check that'#10' F1 has time to complete+listening time.'#10'CW sending and timer will stop when ESC is '#10'pressed or someting is written to Call column. '
Top = 19
Width = 90
BorderSpacing.Right = 6
Increment = 250
MaxValue = 30000
MinValue = 5000
OnChange = spCQperiodChange
ParentShowHint = False
ShowHint = True
TabStop = False
TabOrder = 1
Value = 5000
end
object spCQrepeat: TSpinEdit
AnchorSideLeft.Control = spCQperiod
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = spCQperiod
Left = 103
Height = 34
Hint = 'Dead operator counter.'#10'How many times CQ (F1) is repeated before repeat stops.'#10'Value 1 - 20 times.'
Top = 19
Width = 90
BorderSpacing.Right = 6
MaxValue = 30
MinValue = 1
ParentShowHint = False
ShowHint = True
TabStop = False
TabOrder = 2
Value = 1
end
object lblCQperiod: TLabel
AnchorSideLeft.Control = CQpanel
AnchorSideTop.Control = CQpanel
Left = 7
Height = 17
Top = 2
Width = 64
BorderSpacing.Left = 6
BorderSpacing.Top = 1
Caption = 'CQ period'
ParentColor = False
end
object lblCQrepeat: TLabel
AnchorSideLeft.Control = spCQperiod
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblCQperiod
Left = 109
Height = 17
Top = 2
Width = 72
BorderSpacing.Left = 12
Caption = 'CQ repeats'
ParentColor = False
end
object btnCQstart: TButton
AnchorSideLeft.Control = spCQrepeat
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = spCQrepeat
AnchorSideTop.Side = asrCenter
AnchorSideRight.Side = asrBottom
Left = 205
Height = 30
Hint = 'Start CQ (F1) timer.'#10'Shorcut key: Shift+F1'#10'Stop with same key, 1xESC or'#10'write to call column.'
Top = 21
Width = 80
BorderSpacing.Left = 12
Caption = 'CQ start'
Font.Color = clGreen
OnClick = btnCQstartClick
ParentFont = False
ParentShowHint = False
ShowHint = True
TabOrder = 0
TabStop = False
end
object lblCqFreq: TLabel
AnchorSideTop.Control = btnCQstart
AnchorSideTop.Side = asrCenter
Left = 297
Height = 1
Hint = 'Shows Frequency last used for CQ calling (F1 memory).'#10'Double click on Frequency or Ctrl+L sets rig to that frequency and mode.'
Top = 36
Width = 1
BorderSpacing.Left = 12
Color = clYellow
ParentColor = False
ParentFont = False
ParentShowHint = False
ShowHint = True
Transparent = False
OnClick = lblCqFreqClick
end
object lblCQLbl: TLabel
AnchorSideLeft.Control = lblCqFreq
AnchorSideTop.Control = lblCQrepeat
Left = 297
Height = 17
Top = 2
Width = 82
Caption = 'Last CQ Freq'
ParentColor = False
end
object lblCqMode: TLabel
AnchorSideLeft.Control = lblCqFreq
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnCQstart
AnchorSideTop.Side = asrCenter
Left = 304
Height = 1
Hint = 'Shows Mode last used for CQ calling (F1 memory).'#10'Double click on mode or Ctrl+L sets rig to that frequency and mode.'
Top = 36
Width = 1
BorderSpacing.Left = 6
Color = clYellow
ParentColor = False
ParentFont = False
ParentShowHint = False
ShowHint = True
Transparent = False
OnClick = lblCqFreqClick
end
end
object lblQSOSince: TLabel
AnchorSideLeft.Control = lblSpeed
AnchorSideTop.Control = chkTabAll
Left = 571
Height = 17
Hint = 'Shows time (MM:SS) since last logged Qso'
Top = 43
Width = 22
Caption = 'QS:'
ParentColor = False
ParentShowHint = False
ShowHint = True
end
object lblRate10: TLabel
AnchorSideLeft.Control = lblQSOSince
AnchorSideTop.Control = chkHint
Left = 571
Height = 17
Hint = 'Total QSO rate / 10 minutes'
Top = 66
Width = 50
AutoSize = False
Caption = 'q/10'
ParentColor = False
ParentShowHint = False
ShowHint = True
end
object lblRate60: TLabel
AnchorSideLeft.Control = lblRate10
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblRate10
Left = 624
Height = 17
Hint = 'Total QSO rate / 1 hour'
Top = 66
Width = 50
AutoSize = False
BorderSpacing.Left = 3
Caption = 'q/60'
ParentColor = False
ParentShowHint = False
ShowHint = True
end
object tmrESC2: TTimer
Enabled = False
OnTimer = tmrESC2Timer
Left = 536
Top = 120
Top = 264
end
object cdDupeDate: TCalendarDialog
Title = 'Set start date'
@ -744,11 +1068,11 @@ object frmContest: TfrmContest
OKCaption = 'OK'
CancelCaption = 'Cancel'
Left = 488
Top = 120
Top = 264
end
object popSetMsg: TPopupMenu
Left = 440
Top = 120
Left = 448
Top = 264
object mnuName: TMenuItem
Caption = 'MSG is Name'
OnClick = mnuNameClick
@ -782,4 +1106,72 @@ object frmContest: TfrmContest
OnClick = mnuCommentClick
end
end
object popCommonStatus: TPopupMenu
Left = 408
Top = 264
object mnuQSOcount: TMenuItem
Caption = 'QSO count'
Checked = True
OnClick = mnuQSOcountClick
end
object mnuDXQSOCount: TMenuItem
Caption = 'DX QSO count'
Checked = True
OnClick = mnuDXQSOCountClick
end
object mnuCountyrCountAll: TMenuItem
Caption = 'Country count all'
Checked = True
OnClick = mnuCountyrCountAllClick
end
object mnuDXCountryCount: TMenuItem
Caption = 'DX country count'
Checked = True
OnClick = mnuDXCountryCountClick
end
object mnuDXCountryList: TMenuItem
Caption = 'DX country list'
Checked = True
OnClick = mnuDXCountryListClick
end
object mnuOwnCountryCount: TMenuItem
Caption = 'Own country count'
Checked = True
OnClick = mnuOwnCountryCountClick
end
object mnuOwnCountryList: TMenuItem
Caption = 'Own country list'
Checked = True
OnClick = mnuOwnCountryListClick
end
object mnuMsgMultipCount: TMenuItem
Caption = 'Msg multip count'
Checked = True
OnClick = mnuMsgMultipCountClick
end
object mnuMsgMultipList: TMenuItem
Caption = 'Msg multip list'
Checked = True
OnClick = mnuMsgMultipListClick
end
object mnuReSetAll: TMenuItem
Caption = 'Re/Set All'
OnClick = mnuReSetAllClick
end
object mnuExit: TMenuItem
Caption = 'Exit (Esc key)'
end
end
object tmrCQ: TTimer
Enabled = False
Interval = 3000
OnTimer = tmrCQTimer
Left = 584
Top = 264
end
object tmrScore: TTimer
OnTimer = tmrScoreTimer
Left = 624
Top = 264
end
end

File diff suppressed because it is too large Load Diff

View File

@ -120,7 +120,7 @@ object frmContestFilter: TfrmContestFilter
OnKeyUp = FormKeyUp
OnShow = FormShow
Position = poMainFormCenter
LCLVersion = '2.0.8.0'
LCLVersion = '2.2.2.0'
object btnOK: TButton
AnchorSideLeft.Control = btnCancel
AnchorSideLeft.Side = asrBottom
@ -183,14 +183,13 @@ object frmContestFilter: TfrmContestFilter
AnchorSideLeft.Control = gbContName
AnchorSideTop.Control = gbContName
Left = 6
Height = 33
Height = 34
Hint = 'Choose contest from logged QSOs'
Top = 0
Width = 506
AutoComplete = True
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending]
BorderSpacing.Left = 6
DropDownCount = 3
ItemHeight = 0
MaxLength = 40
ParentShowHint = False

View File

@ -47,7 +47,7 @@ implementation
{$R *.lfm}
{ TfrmContestFilter }
uses dData, dUtils;
uses dData, dUtils, fContest;
procedure TfrmContestFilter.btnOKClick(Sender: TObject);
begin
@ -83,6 +83,8 @@ procedure TfrmContestFilter.FormShow(Sender: TObject);
begin
dmUtils.LoadFontSettings(self);
if frmContest.Showing and (frmContest.cmbContestName.Text<>'') then
cmbContestName.Text:=frmContest.cmbContestName.Text;
end;
procedure TfrmContestFilter.FormKeyUp(Sender: TObject; var Key: Word;

250
src/fCountyStat.lfm Normal file
View File

@ -0,0 +1,250 @@
object frmCountyStat: TfrmCountyStat
Left = 297
Height = 590
Top = 30
Width = 653
Caption = 'County statistic'
ClientHeight = 590
ClientWidth = 653
OnClose = FormClose
OnShow = FormShow
LCLVersion = '2.2.6.0'
object Panel1: TPanel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 0
Height = 80
Top = 0
Width = 653
Align = alTop
BevelOuter = bvNone
ClientHeight = 80
ClientWidth = 653
TabOrder = 0
object cmbBands: TComboBox
AnchorSideLeft.Control = Label1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
Left = 55
Height = 33
Top = 9
Width = 164
BorderSpacing.Left = 6
BorderSpacing.Top = 9
ItemHeight = 0
OnChange = cmbBandsChange
Style = csDropDownList
TabOrder = 0
end
object Label1: TLabel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = cmbBands
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 17
Width = 37
AutoSize = False
BorderSpacing.Left = 12
Caption = 'Band:'
ParentColor = False
end
object GroupBox1: TGroupBox
AnchorSideLeft.Control = cmbBands
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbBands
Left = 231
Height = 42
Top = 9
Width = 244
BorderSpacing.Left = 12
Caption = ' Confirmed '
ClientHeight = 24
ClientWidth = 242
TabOrder = 1
object chkQSL: TCheckBox
AnchorSideLeft.Control = GroupBox1
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
Left = 6
Height = 23
Top = 1
Width = 51
BorderSpacing.Left = 6
Caption = 'QSL'
OnChange = cmbBandsChange
TabOrder = 0
end
object chkLoTW: TCheckBox
AnchorSideLeft.Control = GroupBox1
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
Left = 90
Height = 23
Top = 1
Width = 62
Caption = 'LoTW'
OnChange = cmbBandsChange
TabOrder = 1
end
object chkeQSL: TCheckBox
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = GroupBox1
AnchorSideRight.Side = asrBottom
Left = 177
Height = 23
Top = 1
Width = 59
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'eQSL'
OnChange = cmbBandsChange
TabOrder = 2
end
end
object pbTot: TProgressBar
AnchorSideLeft.Control = cmbBands
AnchorSideTop.Control = cmbBands
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = cmbBands
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 55
Height = 10
Top = 54
Width = 161
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 12
BorderSpacing.Right = 3
TabOrder = 2
end
object btnRefresh: TButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 485
Height = 33
Top = 14
Width = 156
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Caption = 'Refresh statistic'
OnClick = btnRefreshClick
TabOrder = 3
end
object lblFIlterActive: TLabel
AnchorSideLeft.Control = GroupBox1
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrBottom
Left = 305
Height = 17
Top = 57
Width = 96
BorderSpacing.Top = 6
Caption = 'Filter is active!'
Font.Color = clRed
ParentColor = False
ParentFont = False
Visible = False
end
end
object Panel2: TPanel
AnchorSideLeft.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
Left = 0
Height = 34
Top = 556
Width = 653
Align = alBottom
AutoSize = True
BevelOuter = bvNone
ClientHeight = 34
ClientWidth = 653
TabOrder = 1
object btnClose: TButton
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel2
AnchorSideRight.Side = asrBottom
Left = 551
Height = 33
Top = 1
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Caption = 'Close'
ModalResult = 2
TabOrder = 0
end
object btnSaveTo: TButton
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = btnClose
Left = 449
Height = 33
Top = 1
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
Caption = 'Save to ...'
OnClick = btnSaveToClick
TabOrder = 1
end
end
object IpHtmlPanel1: TIpHtmlPanel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideBottom.Control = Panel2
Left = 0
Height = 476
Top = 80
Width = 653
Align = alClient
BorderWidth = 1
BorderStyle = bsSingle
DataProvider = IpFileDataProvider1
FixedTypeface = 'Courier New'
DefaultTypeFace = 'Sans'
DefaultFontSize = 8
FlagErrors = True
PrintSettings.MarginLeft = 0.5
PrintSettings.MarginTop = 0.5
PrintSettings.MarginRight = 0.5
PrintSettings.MarginBottom = 0.5
PrintSettings.Preview.Left = 320
PrintSettings.Preview.Top = 200
PrintSettings.Preview.Width = 960
PrintSettings.Preview.Height = 600
TabOrder = 2
VLinkColor = clBlue
end
object IpFileDataProvider1: TIpFileDataProvider
Left = 160
Top = 512
end
object dlgSave: TSaveDialog
DefaultExt = '.html'
Filter = 'HTML files|*.html'
Left = 64
Top = 512
end
object tmrBlink: TTimer
Enabled = False
OnTimer = tmrBlinkTimer
OnStartTimer = tmrBlinkStartTimer
OnStopTimer = tmrBlinkStopTimer
Left = 248
Top = 512
end
end

324
src/fCountyStat.pas Normal file
View File

@ -0,0 +1,324 @@
unit fCountyStat;
{$mode objfpc}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls, Grids, ComCtrls, IpHtml, Ipfilebroker, db, BufDataset,
LazFileUtils,Dateutils;
type
{ TfrmCountyStat }
TfrmCountyStat = class(TForm)
btnClose: TButton;
btnRefresh: TButton;
btnSaveTo: TButton;
chkQSL: TCheckBox;
chkLoTW: TCheckBox;
chkeQSL: TCheckBox;
cmbBands: TComboBox;
GroupBox1: TGroupBox;
IpFileDataProvider1: TIpFileDataProvider;
IpHtmlPanel1: TIpHtmlPanel;
Label1: TLabel;
lblFIlterActive: TLabel;
Panel1: TPanel;
Panel2: TPanel;
dlgSave: TSaveDialog;
pbTot: TProgressBar;
tmrBlink: TTimer;
procedure btnRefreshClick(Sender: TObject);
procedure btnSaveToClick(Sender: TObject);
procedure cmbBandsChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormShow(Sender: TObject);
procedure tmrBlinkStartTimer(Sender: TObject);
procedure tmrBlinkStopTimer(Sender: TObject);
procedure tmrBlinkTimer(Sender: TObject);
private
TmpFile : String;
f : TextFile;
procedure WriteHMTLHeader;
public
end;
var
frmCountyStat: TfrmCountyStat;
implementation
{$R *.lfm}
{ TfrmCountyStat }
uses dUtils,dData, uMyIni, uVersion;
procedure TfrmCountyStat.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
dmUtils.SaveForm(frmCountyStat);
cqrini.WriteInteger('CountyStat','Band',cmbBands.ItemIndex);
cqrini.WriteBool('CountyStat','QSL',chkQSL.Checked);
cqrini.WriteBool('CountyStat','LoTW',chkLoTW.Checked);
cqrini.WriteBool('CountyStat','eQSL',chkeQSL.Checked);
DeleteFileUTF8(TmpFile);
DeleteFileUTF8(ExtractFileNameWithoutExt(TmpFile)+'.html')
end;
procedure TfrmCountyStat.btnRefreshClick(Sender: TObject);
var
tmp : String = '';
bnd : String = '';
grb : String = '';
allwkd : longint = 0;
thiswkd : longint =0;
TotPos : longint = 0;
wkd : integer = 0;
cfm : integer = 0;
ll : String = '';
sum_wkd : integer = 0;
sum_cfm : integer = 0;
TableName : String;
begin
tmrBlink.Enabled:=False;
TableName:='cqrlog_main';
try
dmData.Q.Close;
dmData.Q1.Close;
if dmData.trQ.Active then dmData.trQ.Rollback;
if dmData.trQ1.Active then dmData.trQ1.Rollback;
if chkQSL.Checked then
begin
tmp := '(qsl_r = '+QuotedStr('Q')+') or';
grb := ',qsl_r';
end;
if chkLoTW.Checked then
begin
tmp := tmp + ' (lotw_qslr = '+QuotedStr('L')+') or';
grb := grb + ',lotw_qslr'
end;
if chkeQSL.Checked then
begin
tmp := tmp + ' (eqsl_qsl_rcvd = '+QuotedStr('E')+') or';
grb := grb + ',eqsl_qsl_rcvd'
end;
tmp := copy(tmp,1,Length(tmp)-2); //remove "or"
if cmbBands.Text='ALL' then
bnd:=' '
else
bnd:= ' and band='+QuotedStr(cmbBands.Text);
dmData.trQ.StartTransaction;
dmData.trQ1.StartTransaction;
try
if dmData.IsFilter then
begin
try
TableName:='statistic_filter';
dmData.Q.Close;
dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
dmData.Q.Close;
dmData.Q.SQL.Text:='CREATE VIEW '+TableName+' AS '+dmData.IsFilterSQL;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
dmData.Q.Close;
except
on E : EDatabaseError do
Begin
ShowMessage('Can not create filter view!');
Exit;
end;
end;
end;
dmData.Q.SQL.Text := 'select upper(county) as ll FROM '+TableName+' where county <> '+QuotedStr('')+' group by ll';
dmData.Q.Open;
dmData.Q.Last; //this is needed to get proper record count
allwkd:=dmData.Q.RecordCount;
dmData.Q.Close;
dmData.Q.SQL.Text := 'select upper(county) as ll FROM '+TableName+' where county <> '+QuotedStr('')+
bnd+' group by ll';
dmData.Q.Open;
dmData.Q.Last; //this is needed to get proper record count
pbTot.Max:=dmData.Q.RecordCount;
thiswkd:= dmData.Q.RecordCount;
WriteHMTLHeader;
writeln(f,'<table>');
dmData.Q.First;
while not dmData.Q.Eof do
begin
inc(TotPos);
pbTot.Position:=TotPos;
Application.ProcessMessages;
ll := dmData.Q.Fields[0].AsString;
writeln(f,'<tr>'+LineEnding+'<td valign="middle">'+LineEnding+'<font color="black"><b>'+ll+'</b></font>'+LineEnding+'</td>');
writeln(f,'<td align="left">');
writeln(f,'<font color="black">');
dmData.Q1.Close;
dmData.Q1.SQL.Text := 'select count(id_cqrlog_main) FROM '+TableName+' where upper(county)='+
QuotedStr(ll)+bnd;
dmData.Q1.Open;
wkd := dmData.Q1.Fields[0].AsInteger;
sum_wkd := sum_wkd + wkd;
if tmp <> '' then
begin
dmData.Q1.Close;
dmData.Q1.SQL.Text := 'select count(id_cqrlog_main) FROM '+TableName+' where upper(county)='+
QuotedStr(ll)+bnd+
'and ('+tmp+')';
dmData.Q1.Open;
cfm := dmData.Q1.Fields[0].AsInteger;
sum_cfm := sum_cfm + cfm
end;
dmData.Q1.Close;
Writeln(f,'</font>');
Writeln(f,'</td>');
Writeln(f,'<td valign="middle" align="left">');
Writeln(f,'<font color="black">');
Writeln(f,'<b>WKD: ',wkd,'</b><br>');
if tmp<>'' then
Writeln(f,'<font color="black"><b>CFM: ',cfm,'</font></b>');
Writeln(f,'</font>');
Writeln(f,'</td>');
Writeln(f,'</tr>');
dmData.Q.Next;
end;
Writeln(f,'</table>');
Writeln(f,'<hr>');
Writeln(f,'<font color="black">'+LineEnding+'<b>Total:</b><br>');
Writeln(f,'Worked:',sum_wkd,'<br>');
Writeln(f,'Confirmed:',sum_cfm,'<br>');
Writeln(f,'<b>Different counties:</b><br>');
if cmbBands.Text<>'ALL' then Writeln(f,'On this band:',thiswkd,'<br>');
Writeln(f,'On all bands:',allwkd);
Writeln(f,'</font>');
Writeln(f,'</body>');
Writeln(f,'</html>');
CloseFile(f);
if dmData.IsFilter then
begin
try
dmData.Q.Close;
dmData.Q.SQL.Text:='DROP VIEW IF EXISTS '+TableName;
dmData.Q.ExecSQL;
dmData.trQ.Commit;
Finally
end;
end;
finally
dmData.trQ.Rollback;
dmData.trQ1.Rollback
end;
CopyFile(TmpFile,ExtractFileNameWithoutExt(TmpFile)+'.html');
IpHtmlPanel1.OpenURL(expandLocalHtmlFileName(ExtractFileNameWithoutExt(TmpFile)+'.html'))
finally
end
end;
procedure TfrmCountyStat.btnSaveToClick(Sender: TObject);
begin
if dlgSave.Execute then
begin
cqrini.WriteString('CountyStat','Directory',ExtractFilePath(dlgSave.FileName));
CopyFile(TmpFile,dlgSave.FileName)
end
end;
procedure TfrmCountyStat.cmbBandsChange(Sender: TObject);
begin
tmrBlink.Enabled:=True;
pbTot.Position:=0;
end;
procedure TfrmCountyStat.WriteHMTLHeader;
begin
AssignFile(f,TmpFile);
Rewrite(f);
writeln(f,'<html>');
Writeln(f,'<head>');
writeln(f,'<meta http-equiv="content-type" content="text/html; charset=utf-8">');
writeln(f,'<meta name="generator" content="CQRLOG '+cVERSION+', www.cqrlog.com">');
writeln(f,'<title>County statistic ('+cqrini.ReadString('Station','Call','')+')</title>');
writeln(f,'</head>');
writeln(f,'<body>');
Writeln(f,'<font color="black">');
Writeln(f,'<h1>County statistic</h1><br>');
Writeln(f,'Station:'+cqrini.ReadString('Station','Call','')+'; Band: '+cmbBands.Text);
Writeln(f,'</font>');
Writeln(f,'<br>')
end;
procedure TfrmCountyStat.FormShow(Sender: TObject);
begin
TmpFile := GetTempFileNameUTF8(dmData.HomeDir,'county');
dmUtils.LoadForm(frmCountyStat);
dmUtils.FillBandCombo(cmbBands);
cmbBands.Items.Insert(0,'ALL');
if cqrini.ReadInteger('CountyStat','Band',0) > cmbBands.Items.Count-1 then
cmbBands.ItemIndex := 0
else
cmbBands.ItemIndex := cqrini.ReadInteger('CountyStat','Band',0);
chkQSL.Checked := cqrini.ReadBool('CountyStat','QSL',False);
chkLoTW.Checked := cqrini.ReadBool('CountyStat','LoTW',False);
chkeQSL.Checked := cqrini.ReadBool('CountyStat','eQSL',False);
dlgSave.InitialDir := cqrini.ReadString('CountyStat','Directory',dmData.UsrHomeDir);
IpHtmlPanel1.Font.Color := clBlack;
pbTot.Min:=0;
pbTot.Max:=1;
pbTot.Smooth:=True;
pbTot.Step:=1;
pbTot.Enabled:=True;
pbTot.Position:=0;
tmrBlink.Enabled:=False;
lblFilterActive.Visible:= dmData.IsFilter;
cmbBandsChange(nil);
end;
procedure TfrmCountyStat.tmrBlinkStartTimer(Sender: TObject);
begin
btnRefresh.Caption:='Press to';
btnRefresh.Font.Color:=clGreen;
btnRefresh.Repaint;
end;
procedure TfrmCountyStat.tmrBlinkStopTimer(Sender: TObject);
begin
btnRefresh.Caption:='Refresh statistic';
btnRefresh.Font.Color:=clDefault;
btnRefresh.Repaint;
end;
procedure TfrmCountyStat.tmrBlinkTimer(Sender: TObject);
var
C :Tcolor;
T:String;
begin
case odd(SecondOf(Now)) of
True: Begin
C := clGreen;
T :='run statistic'
end;
False: Begin
C := clGreen;
T :='Press to'
end;
end;
btnRefresh.Caption:= T;
btnRefresh.Font.Color:=C;
btnRefresh.Repaint;
end;
end.

View File

@ -317,6 +317,10 @@ begin
end;
procedure TfrmDBConnect.btnNewLogClick(Sender: TObject);
var
db :string;
cnr,nr :integer;
l :TStringList;
begin
frmNewLog := TfrmNewLog.Create(nil);
try
@ -324,15 +328,45 @@ begin
frmNewLog.ShowModal;
if frmNewLog.ModalResult = mrOK then
begin
//if dmData.LogName <> '' then
// dmData.CloseDatabases;
dmData.CreateDatabase(StrToInt(frmNewLog.edtLogNR.Text),
frmNewLog.edtLogName.Text);
UpdateGridFields
end
dmData.CreateDatabase(StrToInt(frmNewLog.edtLogNR.Text),frmNewLog.edtLogName.Text);
UpdateGridFields;
if frmNewLog.edtLogCpyNR.Text<>'' then
Begin
cnr:=StrToInt(frmNewLog.edtLogCpyNR.Text); //this nr log exists and strtoint works: tested in "newlog"
db := dmData.GetProperDBName(cnr);
if dmData.DBName<>'' then
dmData.SaveConfigFile;
dmData.Q.Close;
if dmData.trQ.Active then dmData.trQ.Rollback;
dmData.Q.SQL.Text := 'select config_file from '+db+'.cqrlog_config';
dmData.trQ.StartTransaction;
l := TStringList.Create;
try try
dmData.Q.Open;
l.Text := dmData.Q.Fields[0].AsString;
nr:=StrToInt(frmNewLog.edtLogNR.Text); //this nr log just created strtoint works: tested in "newlog"
db := dmData.GetProperDBName(nr);
dmData.Q.Close;
if dmData.trQ.Active then dmData.trQ.Rollback;
dmData.Q.SQL.Text := 'update '+db+'.cqrlog_config set config_file =:config_file';
dmData.trQ.StartTransaction;
dmData.Q.Params[0].AsString := l.Text;
dmData.Q.ExecSQL
except
dmData.trQ.Rollback
end;
dmData.trQ.Commit;
ShowMessage('Config copied successfully')
finally
dmData.Q.Close;
l.Free
end;
end;
end;
finally
frmNewLog.Free
end
end;
end;
procedure TfrmDBConnect.btnOpenLogClick(Sender: TObject);
@ -456,6 +490,7 @@ procedure TfrmDBConnect.mnuExportClick(Sender: TObject);
var
db : String;
l : TStringList;
n : String;
begin
if dlgSave.Execute then
begin
@ -470,8 +505,11 @@ begin
try
dmData.Q.Open;
l.Text := dmData.Q.Fields[0].AsString;
l.SaveToFile(dlgSave.FileName);
ShowMessage('Config file saved to '+dlgSave.FileName
n:= dlgSave.FileName;
if pos('.INI',UpperCase(n))=0 then
n:=n+'.ini';
l.SaveToFile(n);
ShowMessage('Config file saved to '+n
+#10+#13+#10+#13+'Warning !'+#10+#13+'File may contain passwords'+#10+#13+'in plain text format')
finally
dmData.Q.Close;
@ -487,6 +525,8 @@ var
l : TStringList;
begin
if dlgOpen.Execute then
begin
if FileExists(dlgOpen.FileName) then //with QT5 opendialog user can enter filename that may not exist
begin
db := dmData.GetProperDBName(dmData.qLogList.Fields[0].AsInteger);
dmData.Q.Close;
@ -509,6 +549,9 @@ begin
l.Free
end
end
else
ShowMessage('File not found!');
end
end;
procedure TfrmDBConnect.mnuRepairClick(Sender : TObject);

View File

@ -1,13 +1,13 @@
object frmDXCluster: TfrmDXCluster
Left = 129
Height = 424
Height = 425
Top = 116
Width = 709
HelpType = htKeyword
HelpKeyword = 'help/h21.html#ah19'
ActiveControl = pgDXCluster
Caption = 'DXCluster'
ClientHeight = 424
ClientHeight = 425
ClientWidth = 709
Icon.Data = {
BE0C00000000010001002020000001001800A80C000016000000280000002000
@ -121,10 +121,10 @@ object frmDXCluster: TfrmDXCluster
OnDestroy = FormDestroy
OnKeyUp = FormKeyUp
OnShow = FormShow
LCLVersion = '1.6.4.0'
LCLVersion = '2.2.6.0'
object pgDXCluster: TPageControl
Left = 0
Height = 424
Height = 425
Top = 0
Width = 709
ActivePage = tabTelnet
@ -133,12 +133,12 @@ object frmDXCluster: TfrmDXCluster
TabOrder = 0
object tabWeb: TTabSheet
Caption = 'Web'
ClientHeight = 395
ClientHeight = 394
ClientWidth = 699
object Panel4: TPanel
Left = 0
Height = 36
Top = 380
Top = 358
Width = 699
Align = alBottom
ClientHeight = 36
@ -197,14 +197,13 @@ object frmDXCluster: TfrmDXCluster
end
object pnlWeb: TPanel
Left = 0
Height = 380
Height = 358
Top = 0
Width = 699
Align = alClient
Alignment = taLeftJustify
BevelInner = bvLowered
BevelOuter = bvLowered
Color = clDefault
Font.CharSet = ANSI_CHARSET
Font.Height = 12
Font.Name = 'DejaVu Sans Mono 12'
@ -215,12 +214,12 @@ object frmDXCluster: TfrmDXCluster
end
object tabTelnet: TTabSheet
Caption = 'Telnet'
ClientHeight = 395
ClientHeight = 394
ClientWidth = 699
object Panel1: TPanel
Left = 0
Height = 34
Top = 361
Top = 360
Width = 699
Align = alBottom
BevelOuter = bvNone
@ -229,7 +228,7 @@ object frmDXCluster: TfrmDXCluster
TabOrder = 0
object Label1: TLabel
Left = 6
Height = 15
Height = 17
Top = 11
Width = 71
Caption = 'Command:'
@ -239,7 +238,7 @@ object frmDXCluster: TfrmDXCluster
AnchorSideLeft.Control = Label1
AnchorSideLeft.Side = asrBottom
Left = 79
Height = 32
Height = 34
Top = 3
Width = 266
BorderSpacing.Left = 2
@ -299,7 +298,7 @@ object frmDXCluster: TfrmDXCluster
TabOrder = 1
object edtTelAddress: TEdit
Left = 8
Height = 32
Height = 34
Top = 1
Width = 189
TabOrder = 0
@ -336,14 +335,13 @@ object frmDXCluster: TfrmDXCluster
end
object pnlTelnet: TPanel
Left = 0
Height = 331
Height = 330
Top = 30
Width = 699
Align = alClient
BevelOuter = bvNone
ClientHeight = 331
ClientHeight = 330
ClientWidth = 699
Color = clDefault
ParentColor = False
TabOrder = 2
object pnlChat: TPanel
@ -353,36 +351,286 @@ object frmDXCluster: TfrmDXCluster
Width = 699
Align = alTop
BevelOuter = bvNone
Color = clDefault
ParentColor = False
TabOrder = 0
end
end
end
object tabFkeys: TTabSheet
Caption = 'F-keys'
ClientHeight = 394
ClientWidth = 699
OnShow = tabFkeysShow
object lblF1: TLabel
AnchorSideLeft.Control = tabFkeys
AnchorSideTop.Control = edtF1
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 32
Width = 24
BorderSpacing.Left = 12
BorderSpacing.Top = 12
Caption = 'F1 :'
ParentColor = False
end
object lblF2: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF2
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 66
Width = 24
BorderSpacing.Top = 6
Caption = 'F2 :'
ParentColor = False
end
object lblF3: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF3
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 100
Width = 24
BorderSpacing.Top = 6
Caption = 'F3 :'
ParentColor = False
end
object lblF4: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF4
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 134
Width = 24
BorderSpacing.Top = 6
Caption = 'F4 :'
ParentColor = False
end
object lblF5: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF5
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 168
Width = 24
BorderSpacing.Top = 6
Caption = 'F5 :'
ParentColor = False
end
object lblF6: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF6
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 202
Width = 24
BorderSpacing.Top = 6
Caption = 'F6 :'
ParentColor = False
end
object lblF7: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF7
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 236
Width = 24
BorderSpacing.Top = 6
Caption = 'F7 :'
ParentColor = False
end
object lblF8: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF8
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 270
Width = 24
BorderSpacing.Top = 6
Caption = 'F8 :'
ParentColor = False
end
object lblF9: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF9
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 304
Width = 24
BorderSpacing.Top = 6
Caption = 'F9 :'
ParentColor = False
end
object lblF10: TLabel
AnchorSideLeft.Control = lblF1
AnchorSideTop.Control = edtF10
AnchorSideTop.Side = asrCenter
Left = 12
Height = 17
Top = 338
Width = 32
BorderSpacing.Top = 6
Caption = 'F10 :'
ParentColor = False
end
object edtF1: TEdit
AnchorSideLeft.Control = lblF1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblShift
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 23
Width = 500
BorderSpacing.Left = 12
BorderSpacing.Top = 3
OnExit = edtFExit
TabOrder = 0
end
object edtF2: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF1
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 57
Width = 500
OnExit = edtFExit
TabOrder = 1
end
object edtF3: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF2
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 91
Width = 500
OnExit = edtFExit
TabOrder = 2
end
object edtF4: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF3
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 125
Width = 500
OnExit = edtFExit
TabOrder = 3
end
object edtF5: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF4
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 159
Width = 500
OnExit = edtFExit
TabOrder = 4
end
object edtF6: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF5
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 193
Width = 500
OnExit = edtFExit
TabOrder = 5
end
object edtF7: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF6
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 227
Width = 500
OnExit = edtFExit
TabOrder = 6
end
object edtF8: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF7
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 261
Width = 500
OnExit = edtFExit
TabOrder = 7
end
object edtF9: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF8
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 295
Width = 500
OnExit = edtFExit
TabOrder = 8
end
object edtF10: TEdit
AnchorSideLeft.Control = edtF1
AnchorSideTop.Control = edtF9
AnchorSideTop.Side = asrBottom
Left = 48
Height = 34
Top = 329
Width = 500
TabOrder = 9
end
object lblShift: TLabel
AnchorSideLeft.Control = tabFkeys
AnchorSideTop.Control = tabFkeys
Left = 3
Height = 17
Top = 3
Width = 41
BorderSpacing.Left = 3
BorderSpacing.Top = 3
Caption = 'Shift+'
ParentColor = False
end
end
end
object tmrSpots: TTimer
Enabled = False
Interval = 20000
OnTimer = tmrSpotsTimer
left = 88
top = 122
Left = 440
Top = 368
end
object dlgDXfnt: TFontDialog
MinFontSize = 0
MaxFontSize = 0
left = 136
top = 122
Left = 488
Top = 368
end
object tmrAutoConnect: TTimer
Enabled = False
Interval = 3000
OnTimer = tmrAutoConnectTimer
left = 246
top = 68
Left = 536
Top = 368
end
object popPreferences: TPopupMenu
left = 385
top = 112
Left = 592
Top = 368
object mnuCallalert: TMenuItem
Caption = 'Callsign alert enabled'
Checked = True
@ -428,8 +676,8 @@ object frmDXCluster: TfrmDXCluster
end
end
object acPreferences: TActionList
left = 393
top = 185
Left = 640
Top = 368
object acFont: TAction
Caption = 'Font'
OnExecute = acFontExecute

View File

@ -18,7 +18,7 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, inifiles,
ExtCtrls, ComCtrls, StdCtrls, Buttons, httpsend, uColorMemo,
db, lcltype, Menus, ActnList, Spin, dynlibs, lNetComponents, lnet;
db, lcltype, Menus, ActnList, Spin, Grids, dynlibs, lNetComponents, lnet;
type
{ TfrmDXCluster }
@ -40,8 +40,29 @@ type
btnPreferences : TButton;
dlgDXfnt: TFontDialog;
edtCommand: TEdit;
edtF1: TEdit;
edtF10: TEdit;
edtF2: TEdit;
edtF3: TEdit;
edtF4: TEdit;
edtF5: TEdit;
edtF6: TEdit;
edtF7: TEdit;
edtF8: TEdit;
edtF9: TEdit;
edtTelAddress: TEdit;
Label1: TLabel;
lblShift: TLabel;
lblF1: TLabel;
lblF10: TLabel;
lblF2: TLabel;
lblF3: TLabel;
lblF4: TLabel;
lblF5: TLabel;
lblF6: TLabel;
lblF7: TLabel;
lblF8: TLabel;
lblF9: TLabel;
lblInfo: TLabel;
MenuItem1 : TMenuItem;
mnuSkimQSLCheck: TMenuItem;
@ -62,6 +83,7 @@ type
pnlTelnet: TPanel;
pnlWeb: TPanel;
popPreferences : TPopupMenu;
tabFkeys: TTabSheet;
tabTelnet: TTabSheet;
tabWeb: TTabSheet;
tmrAutoConnect: TTimer;
@ -73,6 +95,8 @@ type
procedure acProgPrefExecute(Sender : TObject);
procedure Button2Click(Sender: TObject);
procedure btnPreferencesClick(Sender : TObject);
procedure edtF2Exit(Sender: TObject);
procedure edtFExit(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnHelpClick(Sender: TObject);
@ -88,6 +112,7 @@ type
procedure mnuCallalertClick(Sender : TObject);
procedure mnuSkimAllowFreqClick(Sender: TObject);
procedure mnuSkimQSLCheckClick(Sender: TObject);
procedure tabFkeysShow(Sender: TObject);
procedure tmrAutoConnectTimer(Sender: TObject);
procedure tmrSpotsTimer(Sender: TObject);
procedure trChatSizeChange(Sender: TObject);
@ -124,6 +149,7 @@ type
gcfgNotShow : String;
gcfgCW : Boolean;
gcfgSSB : Boolean;
gcfgDATA: Boolean;
gcfgEU : Boolean;
gcfgAS : Boolean;
gcfgAF : Boolean;
@ -143,6 +169,7 @@ type
procedure WebDbClick(where:longint;mb:TmouseButton;ms:TShiftState);
procedure TelDbClick(where:longint;mb:TmouseButton;ms:TShiftState);
procedure SpotDbClick(Spot:String);
procedure ConnectToWeb;
procedure ConnectToTelnet;
procedure SynWeb;
@ -154,11 +181,11 @@ type
procedure ChangeCallAlertCaption;
function ShowSpot(spot : String; var sColor : Integer; var Country : String; FromTelnet : Boolean = True) : Boolean;
function GetFreq(spot : String) : String;
function GetCall(spot : String; web : Boolean = False) : String;
function GetSplit(spot : String) :String;
function GetSplit(info : String) :String;
procedure StoreLastCmd(LastCmd:string);
function GetHistCmd:string;
function FontStylesToString(Styles: TFontStyles): string;
function StringToFontStyles(const Styles: string): TFontStyles;
public
ConWeb : Boolean;
ConTelnet : Boolean;
@ -326,7 +353,7 @@ begin
end;
end;
procedure TfrmDXCluster.Button2Click(Sender: TObject);
procedure TfrmDXCluster.Button2Click(Sender: TObject); //this is debugger
var
TelThread : TTelThread = nil;
begin
@ -363,6 +390,25 @@ begin
popPreferences.PopUp(p.x, p.y)
end;
procedure TfrmDXCluster.edtF2Exit(Sender: TObject);
begin
end;
procedure TfrmDXCluster.edtFExit(Sender: TObject);
begin
cqrini.WriteString('DXCluster','F1key',edtF1.Text);
cqrini.WriteString('DXCluster','F2key',edtF2.Text);
cqrini.WriteString('DXCluster','F3key',edtF3.Text);
cqrini.WriteString('DXCluster','F4key',edtF4.Text);
cqrini.WriteString('DXCluster','F5key',edtF5.Text);
cqrini.WriteString('DXCluster','F6key',edtF6.Text);
cqrini.WriteString('DXCluster','F7key',edtF7.Text);
cqrini.WriteString('DXCluster','F8key',edtF8.Text);
cqrini.WriteString('DXCluster','F9key',edtF9.Text);
cqrini.WriteString('DXCluster','F10key',edtF10.Text);
end;
procedure TfrmDXCluster.acProgPrefExecute(Sender : TObject);
begin
cqrini.WriteInteger('Pref', 'ActPageIdx', 10); //set DXCuster tab active. Number may change if preferences page change
@ -372,16 +418,43 @@ end;
procedure TfrmDXCluster.acFontExecute(Sender : TObject);
begin
dlgDXfnt.Font.Name := cqrini.ReadString('DXCluster','Font','DejaVu Sans Mono');
dlgDXfnt.Font.Style := StringToFontStyles(cqrini.ReadString('DXCluster','FontStyle',''));
dlgDXfnt.Font.Size := cqrini.ReadInteger('DXCluster','FontSize',12);
if dlgDXfnt.Execute then
begin
cqrini.WriteString('DXCluster','Font',dlgDXfnt.Font.Name);
cqrini.WriteInteger('DXCluster','FontSize',dlgDXfnt.Font.Size);
cqrini.WriteString('DXCluster','FontStyle',FontStylesToString(dlgDXfnt.Font.Style));
WebSpots.SetFont(dlgDXfnt.Font);
TelSpots.SetFont(dlgDXfnt.Font);
ChatSpots.SetFont(dlgDXfnt.Font)
end
end;
function TfrmDXCluster.FontStylesToString(Styles: TFontStyles): string;
begin
Result := '';
if fsBold in Styles then
Result := Result + 'B';
if fsItalic in Styles then
Result := Result + 'I';
if fsUnderline in Styles then
Result := Result + 'U';
if fsStrikeOut in Styles then
Result := Result + 'S';
end;
function TfrmDXCluster.StringToFontStyles(const Styles: string): TFontStyles;
begin
Result := [];
if Pos('B', UpperCase(Styles)) > 0 then
Include(Result, fsBold);
if Pos('I', UpperCase(Styles)) > 0 then
Include(Result, fsItalic);
if Pos('U', UpperCase(Styles)) > 0 then
Include(Result, fsUnderline);
if Pos('S', UpperCase(Styles)) > 0 then
Include(Result, fsStrikeOut);
end;
procedure TfrmDXCluster.acCallAlertExecute(Sender : TObject);
begin
@ -408,6 +481,7 @@ begin
FirstWebGet := True;
lTelnet := TLTelnetClientComponent.Create(nil);
ReloadDXCPref := True;
tabFkeys.TabVisible:=false;
lTelnet.OnConnect := @lConnect;
lTelnet.OnDisconnect := @lDisconnect;
@ -460,70 +534,85 @@ end;
procedure TfrmDXCluster.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key= VK_ESCAPE) then
if key = VK_ESCAPE then
begin
frmNewQSO.ReturnToNewQSO;
key := 0
end
end;
if (Key >= VK_F1) and (Key <= VK_F10) and (ConTelnet = True) and (Shift = [ssShift]) then
begin
case key of
VK_F1 :Begin
if edtF1.Text<>'' then SendCommand(edtF1.Text);
key := 0
end;
VK_F2 :Begin
if edtF2.Text<>'' then SendCommand(edtF2.Text);
key := 0
end;
VK_F3 :Begin
if edtF3.Text<>'' then SendCommand(edtF3.Text);
key := 0
end;
VK_F4 :Begin
if edtF4.Text<>'' then SendCommand(edtF4.Text);
key := 0
end;
VK_F5 :Begin
if edtF5.Text<>'' then SendCommand(edtF5.Text);
key := 0
end;
VK_F6 :Begin
if edtF6.Text<>'' then SendCommand(edtF6.Text);
key := 0
end;
VK_F7 :Begin
if edtF7.Text<>'' then SendCommand(edtF7.Text);
key := 0
end;
VK_F8 :Begin
if edtF8.Text<>'' then SendCommand(edtF8.Text);
key := 0
end;
VK_F9 :Begin
if edtF9.Text<>'' then SendCommand(edtF9.Text);
key := 0
end;
VK_F10 :Begin
if edtF10.Text<>'' then SendCommand(edtF10.Text);
key := 0
end;
end;
end;
end;
procedure TfrmDXCluster.WebDbClick(where:longint;mb:TmouseButton;ms:TShiftState);
var
spot : String = '';
tmp : Integer = 0;
freq : String = '';
mode : String = '';
call : String = '';
etmp : Extended = 0;
stmp : String = '';
i : Integer = 0;
begin
WebSpots.ReadLine(spot,tmp,tmp,tmp,where);
spot := copy(spot,i+6,Length(spot)-i-5);
spot := Trim(spot);
freq := GetFreq(spot);
call := GetCall(spot,True);
{
Writeln('WebDbClick*****');
Writeln('Spot:',spot);
Writeln('Freq:',freq);
Writeln('Call:',call);
Writeln('***************');
}
if NOT TryStrToFloat(freq,etmp) then
exit;
if (not dmData.BandModFromFreq(freq,mode,stmp)) or (mode='') then
exit;
frmNewQSO.NewQSOFromSpot(call,freq,mode)
SpotDbClick(spot);
end;
procedure TfrmDXCluster.TelDbClick(where:longint;mb:TmouseButton;ms:TShiftState);
var
spot : String = '';
tmp : Integer = 0;
begin
TelSpots.ReadLine(spot,tmp,tmp,tmp,where);
SpotDbClick(spot);
end;
procedure TfrmDXCluster.SpotDbClick(Spot:String);
var
freq : String = '';
mode : String = '';
call : String = '';
info : String = '';
etmp : Extended = 0;
stmp : String = '';
i : Integer = 0;
f : Currency;
begin
TelSpots.ReadLine(spot,tmp,tmp,tmp,where);
if TryStrToCurr(copy(spot,1,Pos(' ',spot)-1),f) then
begin
freq := copy(spot,1,Pos(' ',spot)-1);
call := trim(copy(spot,Pos('.',spot)+2,14))
end
else begin
spot := copy(spot,i+6,Length(spot)-i-5);
spot := Trim(spot);
freq := GetFreq(Spot);
call := GetCall(Spot, ConWeb)
end;
Begin
dmDXCluster.GetSplitSpot(spot,call,freq,info);
{
Writeln('TelDbClick*****');
Writeln('Spot:',spot);
Writeln('Freq:',freq);
Writeln('Call:',call);
@ -537,7 +626,6 @@ begin
frmNewQSO.NewQSOFromSpot(call,freq,mode)
end;
procedure TfrmDXCluster.FormShow(Sender: TObject);
var
f : TFont;
@ -546,6 +634,7 @@ begin
try
f.Name := cqrini.ReadString('DXCluster','Font','DejaVu Sans Mono');
f.Size := cqrini.ReadInteger('DXCluster','FontSize',12);
f.Style := StringToFontStyles(cqrini.ReadString('DXCluster','FontStyle',''));
WebSpots.SetFont(f);
TelSpots.SetFont(f) ;
ChatSpots.SetFont(f)
@ -572,6 +661,8 @@ begin
if cqrini.ReadBool('DXCluster', 'ConAfterRun', False) then
tmrAutoConnect.Enabled := True;
pnlChat.Height := cqrini.ReadInteger('DXCluster','ChatSize',2); //default now 2 = invisible
tabFkeysShow(nil);
end;
procedure TfrmDXCluster.btnClearClick(Sender: TObject);
@ -612,12 +703,15 @@ begin
begin
StopAllConnections;
btnTelConnect.Caption := 'Connect';
tabFkeys.TabVisible:=false;
ConWeb := False;
end
else begin
ConnectToTelnet;
btnTelConnect.Caption := 'Disconnect';
ConTelnet := True;
tabFkeys.TabVisible:=True;
pgDXCluster.ActivePage:=tabTelnet;
if (Sender <> nil) then
edtCommand.SetFocus
end
@ -689,6 +783,20 @@ begin
cqrini.WriteBool('Skimmer', 'QSLEnable', mnuSkimQSLCheck.Checked);
end;
procedure TfrmDXCluster.tabFkeysShow(Sender: TObject);
begin
edtF1.Text:=cqrini.ReadString('DXCluster', 'F1key', '');
edtF2.Text:=cqrini.ReadString('DXCluster', 'F2key', '');
edtF3.Text:=cqrini.ReadString('DXCluster', 'F3key', '');
edtF4.Text:=cqrini.ReadString('DXCluster', 'F4key', '');
edtF5.Text:=cqrini.ReadString('DXCluster', 'F5key', '');
edtF6.Text:=cqrini.ReadString('DXCluster', 'F6key', '');
edtF7.Text:=cqrini.ReadString('DXCluster', 'F7key', '');
edtF8.Text:=cqrini.ReadString('DXCluster', 'F8key', '');
edtF9.Text:=cqrini.ReadString('DXCluster', 'F9key', '');
edtF10.Text:=cqrini.ReadString('DXCluster', 'F10key', '');
end;
procedure TfrmDXCluster.tmrAutoConnectTimer(Sender: TObject);
begin
tmrAutoConnect.Enabled := False;
@ -707,13 +815,13 @@ end;
procedure TfrmDXCluster.lConnect(aSocket: TLSocket);
begin
btnTelConnect.Caption := 'Disconnect';
ConTelnet := True
ConTelnet := True;
end;
procedure TfrmDXCluster.lDisconnect(aSocket: TLSocket);
begin
btnTelConnect.Caption := 'Connect';
ConTelnet := False
ConTelnet := False;
end;
procedure TfrmDXCluster.lReceive(aSocket: TLSocket);
@ -804,7 +912,21 @@ begin
end;
end;
itmp := Pos('DX DE',UpperCase(tmp));
if (itmp > 0) or TryStrToFloat(copy(tmp,1,Pos(' ',tmp)-1),f) then
if (itmp > 0) or (TryStrToFloat(copy(tmp,1,Pos(' ',tmp)-1),f) and (UpperCase(tmp[1])<>'E')) then
{
Chk of tmp[1]<>'E' needed:
sh/he E6
E6 Niue-E6: 16 degs - dist: 9440 mi, 15192 km Reciprocal heading: 352 degs
OH1KH de OH1RCF 1-Apr-2023 1000Z dxspider >
E[number] at beginning of line passes tryStrToFLoat as scientific number expression
and we want to catch only numbers of frequencies in 12345.6 format.
They appear if "sh/dx" command is issued
sh/dx 1
28074.0 JA6GXP 1-Apr-2023 1033Z FT8 -22dB from PM52 814Hz <F4UJU>
OH1KH de OH1RCF 1-Apr-2023 1033Z dxspider >
}
begin
EnterCriticalsection(frmDXCluster.csTelnet);
if dmData.DebugLevel>=1 then Writeln('Enter critical section On Receive');
@ -910,41 +1032,33 @@ begin
if dmData.DebugLevel >=1 then Writeln('Chat sizing Click');
end;
function TfrmDXCluster.GetFreq(spot : String) : String;
function TfrmDXCluster.GetSplit(info : String) : String;
var
tmp : String;
begin
tmp := copy(spot,Pos(' ',spot),Pos('.',spot)+2 - Pos(' ',spot));
Result := trim(tmp)
end;
function TfrmDXCluster.GetSplit(spot : String) : String;
var
tmp : String;
spl : String;
spn : String;
l : Integer;
begin
tmp := copy(spot,34,Length(spot)-34);
//Writeln('tmp: ',tmp);
if Pos('UP',tmp)>0 then begin
spl:= copy(tmp,Pos('UP',tmp),13);
if Pos('UP',info)>0 then
begin
spl:= copy(info,Pos('UP',info),13);
spn:='UP';
for l:=3 to Length(spl) do
if Pos(spl[l],' 0123456789.,-+')>0 then
spn:=spn+spl[l]
else break;
end;
if Pos('DOWN',tmp)>0 then begin
spl:= copy(tmp,Pos('DOWN',tmp),13);
if Pos('DOWN',info)>0 then
begin
spl:= copy(info,Pos('DOWN',info),13);
spn:='DOWN';
for l:=5 to Length(spl) do
if Pos(spl[l],' 0123456789.,-+')>0 then
spn:=spn+spl[l]
else break;
end;
if Pos('QSX',tmp)>0 then begin
spl:= copy(tmp,Pos('QSX',tmp),13);
if Pos('QSX',info)>0 then
begin
spl:= copy(info,Pos('QSX',info),13);
spn:='QSX';
for l:=4 to Length(spl) do
if Pos(spl[l],' 0123456789.,-+')>0 then
@ -954,29 +1068,6 @@ begin
Result := trim(spn)
end;
function TfrmDXCluster.GetCall(spot : String; web : Boolean = False) : String;
var
tmp : String='';
begin
if web then
begin
//Writeln('spot:',spot);
tmp := trim(copy(spot,Pos(' ',spot)+1, Length(spot) -(Pos(' ',spot))));
//Writeln('tmp: ',tmp);
tmp := copy(tmp,Pos(' ',tmp)+1, Length(tmp) -(Pos(' ',tmp)));
//Writeln('tmp: ',tmp);
if Pos(' ',tmp) > 0 then
tmp := trim(copy(tmp,1,Pos(' ',tmp)));
//Writeln('tmp: ',tmp);
end
else begin
tmp := copy(spot,Pos('.',spot)+3,Length(spot)-Pos('.',spot)-1);
tmp := trim(tmp);
tmp := trim(copy(tmp,1,Pos(' ',tmp)))
end;
Result := tmp
end;
procedure TfrmDXCluster.StopAllConnections;
begin
if ConWeb then
@ -995,10 +1086,10 @@ var
kmitocet : Extended = 0.0;
call : String = '';
freq : String = '';
info : String = '';
tmp : Integer = 0;
band : String = '';
mode : String = '';
freeText : String = '';
seznam : TStringList;
i : Integer = 0;
prefix : String = '';
@ -1043,6 +1134,7 @@ var
cfgCW : Boolean;
cfgSSB : Boolean;
cfgDATA: Boolean;
cfgEU : Boolean;
cfgAS : Boolean;
cfgAF : Boolean;
@ -1067,6 +1159,7 @@ begin
iITU := giITU;
cfgCW := gcfgCW;
cfgSSB := gcfgSSB;
cfgDATA:= gcfgDATA;
cfgEU := gcfgEU;
cfgAS := gcfgAS;
cfgNA := gcfgNA;
@ -1089,26 +1182,9 @@ begin
finally
LeaveCriticalSection(csDXCPref)
end;
spot := UpperCase(spot);
i := Pos('DX DE ',spot);
if i > 0 then
spot := copy(spot,i+6,Length(spot)-i-5);
if TryStrToCurr(copy(spot,1,Pos(' ',spot)-1),f) then
begin
freq := copy(spot,1,Pos(' ',spot)-1);
call := trim(copy(spot,Pos('.',spot)+2,14))
end
else begin
freq := GetFreq(Spot);
call := GetCall(Spot, ConWeb)
end;
splitstr := GetSplit(Spot);
dmDXCluster.GetSplitSpot(Spot,call,freq,info);
splitstr := GetSplit(info);
kHz := Freq;
tmp := Pos('.',freq);
if tmp > 0 then
freq[tmp] := FormatSettings.DecimalSeparator;
@ -1180,7 +1256,7 @@ begin
begin
Result := false;
if dmData.DebugLevel >=1 then
Writeln('Cannot show this sport because of settings ...');
Writeln('Cannot show this spot because of Show only spots (band) settings ...');
exit
end;
@ -1196,9 +1272,18 @@ begin
Result := false
end;
if (result = False) then
exit;
if not cfgDATA then
begin
if (mode=cqrini.ReadString('Band'+IntToStr(frmTRXControl.cmbRig.ItemIndex), 'Datamode', 'RTTY')) then
Result := false
end;
if (result = False) then
Begin
if dmData.DebugLevel >=1 then
Writeln('Cannot show this spot because of Show only spots (mode) settings ...');
exit;
end;
if wDXCC = '*' then
begin
if Pos(prefix+';',iDXCC) = 0 then
@ -1345,10 +1430,9 @@ begin
// and connected to telnet cluster
if (dmDXCluster.IsAlertCall(call,band,mode,cqrini.ReadBool('DxCluster', 'AlertRegExp', False))) then
Begin
freeText:= dmDXCluster.GetfreeTextFromSpot('DX de '+spot);
if dmData.DebugLevel >=1 then
Writeln('Spot is:',spot,#$0A,'----Call alerting is: ',call,',',band,',',mode,',',freq,',',freeText,'-----------');
dmDXCluster.RunCallAlertCmd(call,band,mode,freq,freeText);
Writeln('Spot is:',spot,#$0A,'----Call alerting is: ',call,',',band,',',mode,',',freq,',',info,'-----------');
dmDXCluster.RunCallAlertCmd(call,band,mode,freq,info);
call :='';
end;
if dmData.DebugLevel >=1 then
@ -1642,6 +1726,7 @@ begin
giITU := cqrini.ReadString('BandMap','iITU','');
gcfgCW := cqrini.ReadBool('DXCluster','CW',true);
gcfgSSB := cqrini.ReadBool('DXCluster','SSB',True);
gcfgDATA:= cqrini.ReadBool('DXCluster','DATA',True);
gcfgEU := cqrini.ReadBool('BandMap','wEU',True);
gcfgAS := cqrini.ReadBool('BandMap','wAS',True);
gcfgNA := cqrini.ReadBool('BandMap','wNA',True);

View File

@ -9,7 +9,7 @@ object frmDbSqlSel: TfrmDbSqlSel
Color = clWhite
OnClose = FormClose
OnCreate = FormCreate
LCLVersion = '2.2.0.4'
LCLVersion = '2.2.6.0'
object gbLocalUser: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = rbExternal
@ -18,7 +18,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideRight.Side = asrBottom
Left = 6
Height = 89
Top = 176
Top = 177
Width = 429
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
@ -65,9 +65,10 @@ object frmDbSqlSel: TfrmDbSqlSel
Left = 331
Height = 17
Top = 1
Width = 66
Width = 62
Anchors = [akLeft, akBottom]
Caption = 'Password'
ParentColor = False
end
object lblUsername: TLabel
AnchorSideLeft.Control = edtUserName
@ -75,9 +76,10 @@ object frmDbSqlSel: TfrmDbSqlSel
Left = 229
Height = 17
Top = 1
Width = 68
Width = 67
Anchors = [akLeft, akBottom]
Caption = 'Username'
ParentColor = False
end
object lblIp: TLabel
AnchorSideLeft.Control = edtIP
@ -85,9 +87,10 @@ object frmDbSqlSel: TfrmDbSqlSel
Left = 6
Height = 17
Top = 1
Width = 63
Width = 60
Anchors = [akLeft, akBottom]
Caption = 'IP addres'
ParentColor = False
end
object lblPort: TLabel
AnchorSideLeft.Control = edtPort
@ -95,9 +98,10 @@ object frmDbSqlSel: TfrmDbSqlSel
Left = 108
Height = 17
Top = 1
Width = 30
Width = 26
Anchors = [akLeft, akBottom]
Caption = 'Port'
ParentColor = False
end
object edtPort: TEdit
AnchorSideLeft.Control = edtIP
@ -134,13 +138,14 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = pnlWelcome
AnchorSideTop.Side = asrBottom
Left = 34
Left = 21
Height = 34
Top = 43
Width = 372
Top = 44
Width = 398
BorderSpacing.Top = 6
Caption = 'It seems you are trying to run this program for '#10'the first time. Do you want to save your Log data to:'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object rbFolder: TRadioButton
@ -149,14 +154,16 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 89
Width = 288
Hint = 'Log data is saved to ~/.config/cqrlog/database folder. '#10'Access to that data is done by starting a new SQL server thread for that.'#10'Unfortunately using this way to save logs causes most of database '#10'connection problems with CQRLOG.'#10'_______________________________________________'#10'For further information press "Please read"-button'
Top = 90
Width = 284
BorderSpacing.Left = 24
BorderSpacing.Top = 12
Caption = 'your linux user folder (CQRLOG default)'
Checked = True
OnClick = rbFolderClick
ParentShowHint = False
ShowHint = True
TabOrder = 1
TabStop = True
end
@ -166,12 +173,14 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 115
Width = 203
Hint = 'Use SQL server already installed to your machine. Both Mysql or MariDB should work.'#10'CQRLOG tries first create SQL user with proper privileges to use the SQL server'#10'and then set proper values to "Database connection" window.'#10'This is done by ~/create_cqr_user.sh scipt that is tried to run with most common'#10'terminals xterm, gnome-terminal or lxterminal.'#10'If that fails you have to run script manually from your command-line console.'#10'_______________________________________________'#10'For further information press "Please read"-button'
Top = 116
Width = 202
BorderSpacing.Top = 3
Caption = 'local machine''s SQL server'
OnChange = rbLocalChange
ParentShowHint = False
ShowHint = True
TabOrder = 2
TabStop = True
end
@ -181,12 +190,14 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 141
Width = 231
Hint = 'Use SQL server anywhere. Both Mysql or MariDB should work.'#10'You have to define values to connect SQL server by yourself:'#10'Address, port, user and password required to connect to external SQL server.'#10'SQL user and privileges have to be created by SQL server administrator.'#10'Server can exist in your home network or Internet.'#10'With external networks VPN or SSH tunnel is recommended for security reasons.'#10'_______________________________________________'#10'For further information press "Please read"-button'
Top = 142
Width = 226
BorderSpacing.Top = 3
Caption = 'external networked SQL server'
OnChange = rbExternalChange
ParentShowHint = False
ShowHint = True
TabOrder = 3
TabStop = True
end
@ -198,7 +209,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideBottom.Side = asrBottom
Left = 354
Height = 25
Hint = 'Confirm your selection'
Hint = 'Confirm your selection and continue.'#10'______________________________________________________________'#10'If you made wrong selection remove ~/.config/cqrlog folder'#10'(before saving any qsos, all will be deleted if 1st option was used)'#10'and then start Cqrlog again to get back to this screen.'
Top = 269
Width = 75
Anchors = [akRight, akBottom]
@ -206,6 +217,8 @@ object frmDbSqlSel: TfrmDbSqlSel
BorderSpacing.Bottom = 12
Caption = 'OK'
OnClick = btnOKClick
ParentShowHint = False
ShowHint = True
TabOrder = 5
end
object pnlWelcome: TPanel
@ -214,7 +227,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 30
Height = 31
Height = 32
Top = 6
Width = 381
Anchors = [akTop, akLeft, akRight]
@ -222,7 +235,7 @@ object frmDbSqlSel: TfrmDbSqlSel
BorderSpacing.Left = 30
BorderSpacing.Top = 6
BorderSpacing.Right = 30
ClientHeight = 31
ClientHeight = 32
ClientWidth = 381
Color = clWhite
ParentColor = False
@ -232,14 +245,15 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = pnlWelcome
AnchorSideTop.Side = asrCenter
Left = 71
Height = 29
Left = 46
Height = 30
Top = 1
Width = 238
Width = 289
Caption = 'Welcome to CQRLOG'
Font.Color = clOlive
Font.Height = 25
Font.Style = [fsBold, fsItalic]
ParentColor = False
ParentFont = False
end
end
@ -249,7 +263,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideRight.Side = asrBottom
Left = 354
Height = 64
Top = 89
Top = 90
Width = 64
Picture.Data = {
1754506F727461626C654E6574776F726B47726170686963E423000089504E47
@ -551,7 +565,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideBottom.Side = asrBottom
Left = 30
Height = 89
Top = 176
Top = 177
Width = 381
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 30
@ -570,9 +584,10 @@ object frmDbSqlSel: TfrmDbSqlSel
Left = 1
Height = 34
Top = 1
Width = 370
Width = 366
Caption = 'Cqrlog is creatng your first log, it might take some time.'#10'Please be patient!'
Font.Color = clMaroon
ParentColor = False
ParentFont = False
ShowAccelChar = False
WordWrap = True
@ -589,6 +604,7 @@ object frmDbSqlSel: TfrmDbSqlSel
Anchors = [akLeft, akBottom]
BorderSpacing.Left = 6
Font.Color = clRed
ParentColor = False
ParentFont = False
end
object btnHelp: TSpeedButton
@ -596,6 +612,7 @@ object frmDbSqlSel: TfrmDbSqlSel
AnchorSideRight.Control = btnOK
Left = 232
Height = 25
Hint = 'Did you read help of first start ?'#10'___________________'#10'PLEASE DO IT NOW !'
Top = 269
Width = 116
Anchors = [akTop, akRight]

View File

@ -43,7 +43,7 @@ object frmDefaultFreq: TfrmDefaultFreq
Height = 17
Top = 16
Width = 30
Caption = 'RTTY'
Caption = 'DATA'
ParentColor = False
end
object Label7: TLabel

View File

@ -199,6 +199,7 @@ var
message : String;
Operators : TStringList;
OpString : String;
DBRecordCount : integer =0; //holds max record count;
begin
SaveSettings;
date := dmUtils.GetDateTime(0);
@ -269,7 +270,10 @@ begin
try try
dmData.trQ.StartTransaction;
dmData.Q.Open;
dmData.Q.Last; //to get proper count
pbExport.Max := dmData.Q.RecordCount;
DBRecordCount := dmData.Q.RecordCount;
dmData.Q.First;
while not dmData.Q.Eof do
begin
inc(QsoMax);
@ -312,7 +316,7 @@ begin
if (i = 1)
then
startdate := StringReplace(dmData.Q.FieldByName('qsodate').AsString,'-','',[rfReplaceAll, rfIgnoreCase]);
if (i = dmData.Q.RecordCount)
if (i = DBRecordCount)
then
enddate := StringReplace(dmData.Q.FieldByName('qsodate').AsString,'-','',[rfReplaceAll, rfIgnoreCase]);
if length(loc) = 4 then loc := loc +'LL';

View File

@ -63,7 +63,7 @@ var
implementation
{$R *.lfm}
uses dUtils, dData, uMyIni, fQSLExpPref, dDXCC,fMain;
uses dUtils, dData, uMyIni, fQSLExpPref, dDXCC,fMain, dLOgUpload;
{ TfrmExLabelPrint }
procedure TfrmExLabelPrint.edtQSOsToLabelExit(Sender: TObject);
@ -559,6 +559,9 @@ begin
exit
end;
if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then
dmLogUpload.DisableOnlineLogSupport;
FieldCount := GetExpFieldCount;
if dmData.DebugLevel >= 1 then Writeln('Field count: ', FieldCount);
dmData.CreateQSLTmpTable;
@ -643,7 +646,10 @@ begin
dmData.DropQSLTmpTable;
lblProgress.Caption := 'Complete!';
CloseFile(f);
dmData.RefreshMainDatabase()
dmData.RefreshMainDatabase();
if cqrini.ReadBool('OnlineLog','IgnoreQSL',False) then
dmLogUpload.EnableOnlineLogSupport;
end
end;

Some files were not shown because too many files have changed in this diff Show More