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: 4bafbbf35e0fa6
Author: OH1KH <oh1kh@sral.fi> Date: Thu Jan 26 08:53:36 2023 +0200 Merge branch 'fix_RBNmonitor_filter' into loc_testing commit35e0fa64bf
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: 203c07db259c16
Author: OH1KH <oh1kh@sral.fi> Date: Mon Jan 16 10:32:39 2023 +0200 Merge branch 'fix_cabrillo_rst' into loc_testing commitb259c16d56
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: 5bef51868de955
Author: OH1KH <oh1kh@sral.fi> Date: Mon Jan 2 14:22:05 2023 +0200 Made online log Urls defineable commit68de955383
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: 8d7eb9d0124044
Author: OH1KH <oh1kh@sral.fi> Date: Sat Dec 31 13:13:56 2022 +0200 Merge branch 'fix_dxcc_edit_save' into loc_testing commit0124044a45
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: e8bbed77147efd
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 commit7147efd327
Author: OH1KH <oh1kh@sral.fi> Date: Mon Dec 12 20:25:01 2022 +0200 Fixed bug in Fix ( in start initialize) commit23be28db32
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: 12fa61822b8674
Author: OH1KH <oh1kh@sral.fi> Date: Fri Dec 9 14:24:51 2022 +0200 Merge branch 'fix4rigs' into loc_testing commit22b86742b3
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 commit03e196a032
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: f3ebadc258e90e
Author: OH1KH <oh1kh@sral.fi> Date: Sat Dec 3 11:07:14 2022 +0200 Merge branch 'macro_xmr' into loc_testing commit258e90e138
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. commit4f59d7e6c4
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: 22411ec33df9b8
Author: OH1KH <oh1kh@sral.fi> Date: Sat Nov 12 14:15:57 2022 +0200 Merge branch 'changelog_move' into loc_testing commit33df9b8cf4
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: 118ca662a04c27
Author: OH1KH <oh1kh@sral.fi> Date: Thu Nov 10 07:13:19 2022 +0200 Merge branch 'winkey_cmd' into loc_testing commit2a04c27459
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: 078231976c15c6
Author: OH1KH <oh1kh@sral.fi> Date: Wed Nov 2 19:34:05 2022 +0200 Merge branch 'fix_split' into loc_testing commit76c15c6065
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: 5f130dd46d4240
Author: OH1KH <oh1kh@sral.fi> Date: Tue Oct 25 19:50:42 2022 +0300 Merge branch 'fix4rigs' into loc_testing commit46d4240d82
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: 0e2e5a8e63e8e1
Author: OH1KH <oh1kh@sral.fi> Date: Fri Oct 21 16:19:54 2022 +0300 Merge branch 'fix4rigs' into loc_testing commite63e8e1109
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 commit25a8ec3f39
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: 8b79bee8def318
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?) commit8def318afa
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: 6bbc18ab289669
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. commitdf0dff35d9
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 15 13:22:16 2022 +0300 fixes when rig is 'None' commite2f5ca64a9
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 15 10:25:13 2022 +0300 Small fix to help commitaa86ada4d5
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 15 10:15:35 2022 +0300 Fixed preferences.lfm cleanup commitb7a6b918ee
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 15 09:52:16 2022 +0300 cleaned preferences.lfm commitd27f7727cc
Author: OH1KH <oh1kh@sral.fi> Date: Wed Sep 14 18:31:39 2022 +0300 Fixed some help files commit9ef0a20b84
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. commita29e38cbdc
Author: OH1KH <oh1kh@sral.fi> Date: Mon Sep 12 19:11:25 2022 +0300 prefereneces fix. Help image refresh. ToDO: help text fix commit35b878af51
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 commitb756151a6b
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 commitf9f4a4369d
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) commit934694ea63
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 commit1553f48abb
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 8 12:49:22 2022 +0300 CWkeyer selection fixed. Not tested at all yet commit7631a8eed1
Author: OH1KH <oh1kh@sral.fi> Date: Thu Sep 8 11:37:03 2022 +0300 CW interface layout fix commit3d0ea64f5d
Author: OH1KH <oh1kh@sral.fi> Date: Wed Sep 7 13:04:48 2022 +0300 fixed powerbuttons, initial powerON checkbox usage, preferences loading commit5fbd310db3
Author: OH1KH <oh1kh@sral.fi> Date: Wed Sep 7 11:51:30 2022 +0300 fixed errors in preferences/trxcontrol&modes commit9cec135549
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 commit63dac701a5
Author: OH1KH <oh1kh@sral.fi> Date: Tue Sep 6 12:55:56 2022 +0300 added adjustable rig count 1-6. Needs testing still commit5d599f358f
Author: OH1KH <oh1kh@sral.fi> Date: Sun Sep 4 21:22:21 2022 +0300 fixed rig selections, not tested yet! commit058b183166
Author: OH1KH <oh1kh@sral.fi> Date: Sat Sep 3 12:23:47 2022 +0300 fixed rig selection a bit, still needs work commitc079448a1b
Author: OH1KH <oh1kh@sral.fi> Date: Fri Sep 2 17:01:00 2022 +0300 rtty/datamode change done. Still completely untested. Compiles ok. commitd5e27773bb
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 commit89a8eee812
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. commit374624a03b
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 commitd4b5189aa7
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 commit64146a66c1
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 commit1814733715
Author: OH1KH <oh1kh@sral.fi> Date: Thu Aug 25 13:11:13 2022 +0300 Empty rig model will erase whole TRXnr section commita1662e2484
Author: OH1KH <oh1kh@sral.fi> Date: Thu Aug 25 10:54:40 2022 +0300 TRXcontrol rig change works commitb289669d3b
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 commita25ddbe0f4
Author: OH1KH <oh1kh@sral.fi> Date: Tue Aug 23 20:12:47 2022 +0300 Tabulation orders commit011fa17faf
Author: OH1KH <oh1kh@sral.fi> Date: Tue Aug 23 19:45:17 2022 +0300 Load and save works commit8c53ab313a
Author: OH1KH <oh1kh@sral.fi> Date: Tue Aug 23 19:05:40 2022 +0300 added TRX(nr) Load and Save commitbaaeb01174
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: 4bdea6598a8ba5
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: 5d50b82f4d5d1e
Author: OH1KH <oh1kh@sral.fi> Date: Mon Jun 13 08:14:06 2022 +0300 Merge branch 'master' into fix_states commit 72f215a7388302c7b92b40974716c732a46b30db Merge: 42c3977f4d5d1e
Author: OH1KH <oh1kh@sral.fi> Date: Mon Jun 13 08:13:45 2022 +0300 Merge branch 'master' into fix_rtty_data commit 7e49c52e8d309a97101bc3d951ab5d28885445b4 Merge: 69e2379f4d5d1e
Author: OH1KH <oh1kh@sral.fi> Date: Mon Jun 13 08:12:17 2022 +0300 Merge branch 'master' into fix_disable_triggers commit 5d50b8230793a28e9a681b2d32902bde34f9a3a5 Merge: c2d4de66a1c6b4
Author: OH1KH <oh1kh@sral.fi> Date: Wed Jun 8 08:48:06 2022 +0300 Merge branch 'master' into fix_states commit 42c3977c8b30fd3471d56122bf2301108f9e6fac Merge: 86dcbe56a1c6b4
Author: OH1KH <oh1kh@sral.fi> Date: Wed Jun 8 08:47:49 2022 +0300 Merge branch 'master' into fix_rtty_data commit 69e23797ff4f79e66d062b6dacfc3c88a5cc5131 Merge: 3c670316a1c6b4
Author: OH1KH <oh1kh@sral.fi> Date: Wed Jun 8 08:47:33 2022 +0300 Merge branch 'master' into fix_disable_triggers commit c2d4de63c72fef1034be249d1cc1c1464ca906c1 Merge: f21e041823332c
Author: OH1KH <oh1kh@sral.fi> Date: Tue May 31 09:50:22 2022 +0300 Merge branch 'master' into fix_states commit 86dcbe5dab759091192e29bbe3d816cf208ffc1c Merge: 49fd593823332c
Author: OH1KH <oh1kh@sral.fi> Date: Tue May 31 09:50:02 2022 +0300 Merge branch 'master' into fix_rtty_data commit 3c6703147292377c076ad182336b22540195e515 Merge: 981229d823332c
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 commit498fada9f0
Author: OH1KH <oh1kh@sral.fi> Date: Wed Sep 9 17:52:12 2020 +0300 Added Ignore QSL feature to Labelprint and Automark QSL commit7958437f17
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. commita3db065f99
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.
1
Makefile
@ -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)
|
||||
|
10
README.md
@ -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
@ -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
@ -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
BIN
compiled/cqr1.zip
Executable file
BIN
compiled/cqr2.zip
Normal file
BIN
compiled/cqr3.zip
Executable file
BIN
compiled/cqr4.zip
Executable file
BIN
compiled/cqr5.zip
Normal file
BIN
compiled/cqr6.zip
Normal file
BIN
compiled/help.tgz
Normal file
BIN
compiled/newupdate.zip
Executable file
BIN
compiled/setting_rigctld_for_all_programs.pdf
Executable 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
|
||||
|
@ -30,66 +30,103 @@
|
||||
<div style="text-align: left;"><strong>CQRLOG for LINUX by OK2CQR & 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->press TAB->type contest rxnumber->press TAB->type contest message->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>
|
||||
<RST_SENT:3>599<STX:3>001<br>
|
||||
<RST_RCVD:3>599<SRX:3>002<br>
|
||||
<RST_SENT:3>599<STX:3>003<STX_STRING:2>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">
|
||||
|
230
help/h1.html
@ -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 > 0.0 and < 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value > 0 and < 40.
|
||||
<strong>Great circle </strong> Short and Long path line plotting on Grayline map may be adjusted here. Plotting step is decimal degrees > 0.0 and < 40.0. In polar areas where distance/degree is smaller this value is divided by integer divisor value > 0 and < 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)
|
||||
|
@ -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&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
|
||||
|
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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> <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.
|
||||
|
@ -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>
|
||||
|
@ -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
After Width: | Height: | Size: 28 KiB |
BIN
help/img/SquareStat.png
Normal file
After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 84 KiB |
BIN
help/img/contest_cmn.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
help/img/contest_mwc.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
help/img/contest_nac.png
Normal file
After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 64 KiB |
BIN
help/img/h10.png
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 129 KiB |
BIN
help/img/h11.png
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 41 KiB |
BIN
help/img/h11141.png
Normal file
After Width: | Height: | Size: 163 KiB |
BIN
help/img/h11142.png
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
help/img/h11143.png
Normal file
After Width: | Height: | Size: 163 KiB |
BIN
help/img/h11144.png
Normal file
After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 453 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 24 KiB |
BIN
help/img/h14.png
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 117 KiB |
BIN
help/img/h20.png
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 17 KiB |
BIN
help/img/h29.png
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 99 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 62 KiB |
BIN
help/img/h4.png
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 58 KiB |
BIN
help/img/h46.png
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 19 KiB |
BIN
help/img/h4f.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
help/img/h5.png
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 124 KiB |
BIN
help/img/h88.png
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 51 KiB |
BIN
help/img/h95.png
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 102 KiB |
BIN
help/img/h96.png
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 38 KiB |
BIN
help/img/h96a.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 101 KiB |
BIN
help/img/h97.png
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 53 KiB |
BIN
help/img/h9b.png
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 52 KiB |
BIN
help/img/wsjt21b.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
help/img/wsjt37.png
Normal file
After Width: | Height: | Size: 17 KiB |
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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 & 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).
|
||||
|
@ -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&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
@ -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 & 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->press TAB->type contest rxnumber->press TAB->type contest message->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>
|
||||
<RST_SENT:3>599<STX:3>001<br>
|
||||
<RST_RCVD:3>599<SRX:3>002<br>
|
||||
<RST_SENT:3>599<STX:3>003<STX_STRING:2>SA<br>
|
||||
<RST_RCVD:3>599<SRX:3>003<SRX_STRING:2>dd<br>
|
||||
<RST_SENT:3>599<STX:3>002<STX_STRING:2>SA<br>
|
||||
<RST_RCVD:3>599<SRX:3>003<SRX_STRING:2>kb<br>
|
||||
<RST_SENT:3>599<STX:3>001<STX_STRING:2>SA<br>
|
||||
<RST_RCVD:3>599<SRX:3>002<SRX_STRING:2>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
After Width: | Height: | Size: 63 KiB |
BIN
src/contest_cmn.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
src/contest_html_export.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
src/contest_mwc.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
src/contest_nac.png
Normal file
After Width: | Height: | Size: 45 KiB |
@ -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 'Lazarus Run Output' -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 'Lazarus Run Output' -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"/>
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
347
src/dData.lfm
@ -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
|
||||
|
190
src/dData.pas
@ -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;
|
||||
|
@ -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;
|
||||
|
510
src/dUtils.pas
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
||||
|
@ -904,6 +904,7 @@ begin
|
||||
lblCount.Caption :='';
|
||||
lblErrors.Caption := '';
|
||||
Do_Err_Import:=true;
|
||||
lblComplete.Visible := False;
|
||||
end;
|
||||
|
||||
procedure TfrmAdifImport.mnuDeleteClick(Sender: TObject);
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
628
src/fContest.lfm
@ -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
|
||||
|
1039
src/fContest.pas
@ -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
|
||||
|
@ -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
@ -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
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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]
|
||||
|
@ -43,7 +43,7 @@ object frmDefaultFreq: TfrmDefaultFreq
|
||||
Height = 17
|
||||
Top = 16
|
||||
Width = 30
|
||||
Caption = 'RTTY'
|
||||
Caption = 'DATA'
|
||||
ParentColor = False
|
||||
end
|
||||
object Label7: TLabel
|
||||
|
@ -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';
|
||||
|
@ -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;
|
||||
|
||||
|