Compare commits

...

212 Commits

Author SHA1 Message Date
Jordan Sherer 8f8772f1bd Version bump 2018-07-27 16:52:25 -04:00
Jordan Sherer f09132f6b4 Fix beacon for compound calls 2018-07-27 16:52:16 -04:00
Jordan Sherer bf57a67c43 Encoding of beacon messages that consist of compound call + (grid or arbitrary 15 bit number) + a flag (isCQ) 2018-07-27 16:11:11 -04:00
Jordan Sherer 091b3b3ee8 Disabled global keyboard shortcuts... 2018-07-27 14:40:37 -04:00
Jordan Sherer 17033f1044 Automatic reply to AGN queries. Restore last message in the text area menu 2018-07-27 13:53:07 -04:00
Jordan Sherer 7c656fac71 Updated compound callsign parsing in directed messages (use base callsign instead) 2018-07-27 11:28:31 -04:00
Jordan Sherer a6771b81c3 Fixed leading whitespace issue for buffered commands 2018-07-27 10:57:51 -04:00
Jordan Sherer eca184bac6 Version bump 2018-07-27 02:27:50 -04:00
Jordan Sherer 6ad2417804 Remove station from heard list 2018-07-27 02:22:48 -04:00
Jordan Sherer 21e87d8b6f QSY on right click of heard list 2018-07-27 01:43:25 -04:00
Jordan Sherer 52a5650a74 Restore original functionality regarding stations heard 2018-07-27 01:36:55 -04:00
Jordan Sherer 2158722ebc Fixed bug in checksuming of buffered messages 2018-07-27 01:24:38 -04:00
Jordan Sherer bf11d66f60 Dont reset the beacon at a 1 minute interval 2018-07-26 20:51:02 -04:00
Jordan Sherer 371aa1e20c Fixed callsign parsing expression 2018-07-26 20:46:08 -04:00
Jordan Sherer 8348f61a94 Bump date 2018-07-26 17:31:21 -04:00
Jordan Sherer bf28918096 Write current messages to ALL.TXT 2018-07-26 16:30:19 -04:00
Jordan Sherer 571aa6446d Added message alerts 2018-07-26 15:57:19 -04:00
Jordan Sherer 4290dd6e2f Extended charset via escapes. DE added to retransmits 2018-07-26 14:31:28 -04:00
Jordan Sherer de66664635 Added extended alphabet for special characters 2018-07-26 12:47:03 -04:00
Jordan Sherer 9e9c996813 Refactor message buffering for relay 2018-07-25 22:49:19 -04:00
Jordan Sherer f67ea3803d Changed to a better callsign validator expression 2018-07-25 20:24:22 -04:00
Jordan Sherer fa00e0dfd6 Added callsign label to main window 2018-07-25 20:13:23 -04:00
Jordan Sherer ceaa76c497 Experimental single-hop relay working 2018-07-25 17:15:59 -04:00
Jordan Sherer 9c9a5c2d8b Added power reply. Added ack reply 2018-07-25 16:51:47 -04:00
Jordan Sherer d611d83bb9 Fixed J1Y callsign bug. Added power reporting command 2018-07-25 14:46:21 -04:00
Jordan Sherer 253b60217f Added station power to configuration 2018-07-25 11:30:44 -04:00
Jordan Sherer 39a536bb91 Experimental foundation of all or nothing checksummed messages 2018-07-25 09:06:47 -04:00
Jordan Sherer 115a9d65f7 Send data frames after directed. Fix bug with enter key double sending 2018-07-24 23:10:47 -04:00
Jordan Sherer 796920cb6b Better EOT. Fixed bug in enter key press 2018-07-24 22:32:24 -04:00
Jordan Sherer c1c7d85195 UI Tweaks. Remove frequency restriction (causing problems). And keep track of the last message sent for later. 2018-07-24 21:04:04 -04:00
Jordan Sherer c5a6f76b1e Bump version to v0.3.0 2018-07-24 20:42:55 -04:00
Jordan Sherer 5b198351be Send message on enter key press 2018-07-24 17:45:23 -04:00
Jordan Sherer 246d53201c Updated compound call parsing and aliasing 2018-07-24 17:31:06 -04:00
Jordan Sherer 999a239e67 Remove reference to FT8Free 2018-07-24 16:47:14 -04:00
Jordan Sherer f091cb28ef Make sure log window is large enough 2018-07-24 16:47:05 -04:00
Jordan Sherer f415b0c94f Added autoreply button in conjuntion with beacon button 2018-07-24 16:46:04 -04:00
Jordan Sherer 0bf2afa5f8 Proper handling of directed messages for compound calls using an alias scheme 2018-07-24 15:19:02 -04:00
Jordan Sherer 706a9b1ebd Allow stations heard query 2018-07-24 11:11:04 -04:00
Jordan Sherer 4cec8b80a3 Check offsets above and below 5Hz 2018-07-24 09:42:07 -04:00
Jordan Sherer 9e68b8c402 Clear compound call cache on activity clear 2018-07-24 09:23:44 -04:00
Jordan Sherer 478ba82df7 Removed split rig check ignore for split operation 2018-07-24 09:08:53 -04:00
Jordan Sherer 7aef92dd68 Updated call activity once receiving compound callsign 2018-07-24 03:07:36 -04:00
Jordan Sherer 01249bd115 Support compound callsigns 2018-07-24 02:53:01 -04:00
Jordan Sherer 9bee00c5dd Remove directed buttons and put them in the menu 2018-07-24 02:52:12 -04:00
Jordan Sherer b9b274f2d6 Disallow callsigns with both prefixes and suffixes 2018-07-24 02:51:44 -04:00
Jordan Sherer 4a17062487 Added packing of compound callsigns into a dedicated message 2018-07-24 02:47:14 -04:00
Jordan Sherer 1c73ce2c90 Removed extra non-ft8 binaries 2018-07-23 23:56:51 -04:00
Jordan Sherer 07a29c7f1d Refactoring directed frame packing 2018-07-23 17:20:03 -04:00
Jordan Sherer f7a941406c Typing in a callsign not in your heard list recognizes it as a callsign selected 2018-07-23 17:19:26 -04:00
Jordan Sherer adecb88c29 Added callsign prefix packing 2018-07-23 15:28:36 -04:00
Jordan Sherer 857e19ed94 Updated callsign handling
Reducing compound callsigns to their basecall for most commands except CQ and DE (beacon)
2018-07-23 11:45:41 -04:00
Jordan Sherer f47224979e Refactor store freq. Rename to bacon. 2018-07-23 09:09:55 -04:00
Jordan Sherer c0833aa753 Added checksum generation and ACK 2018-07-23 08:51:29 -04:00
Jordan Sherer 20d931a9ca Moved macro button...again. 2018-07-23 08:49:58 -04:00
Jordan Sherer 1b2f8a1c6c Restore audio frequency after responding to allcall or transmitting beacon 2018-07-21 17:50:33 -04:00
Jordan Sherer 95e75741ed Fix bug in scrolling of the main window 2018-07-21 17:32:35 -04:00
Jordan Sherer dc75c08081 Configuration and MainWindow UI tweaks 2018-07-21 17:18:35 -04:00
Jordan Sherer 8c204e317b Fixed beacon postponement 2018-07-21 17:06:17 -04:00
Jordan Sherer a672668c3a Only respond to allcalls once per beacon interval 2018-07-21 16:57:42 -04:00
Jordan Sherer 8638b53e45 Added band activity age in the table 2018-07-21 16:55:04 -04:00
Jordan Sherer 394a6d045f Beacon interval default to 15 min 2018-07-21 16:10:13 -04:00
Jordan Sherer 29bbedcc8f Make sure standard messages are displayed with a space between them. 2018-07-21 15:57:01 -04:00
Jordan Sherer d66b4ffb37 Disable QTC QTH buttons if those messages are empty 2018-07-21 12:37:11 -04:00
Jordan Sherer c0c4693782 Widened the log qso dialog 2018-07-21 03:55:45 -04:00
Jordan Sherer 9223d3da40 Version bump to 0.2.0 2018-07-21 03:52:48 -04:00
Jordan Sherer 83e3f5ddbc SNR button sends a directed SNR message 2018-07-21 03:52:13 -04:00
Jordan Sherer 0f4057aa97 Make sure to clear seen beacon cache when changing bands 2018-07-21 03:45:56 -04:00
Jordan Sherer 591629e369 Disable heard list beaconing for now 2018-07-21 03:33:00 -04:00
Jordan Sherer 4a96ab3b13 Beaconing of heard list 2018-07-21 03:32:07 -04:00
Jordan Sherer e955cff24f Make sure selected call exists before using it 2018-07-21 02:31:30 -04:00
Jordan Sherer fe405cfba8 Added ability to encode power into dbm 2018-07-21 02:18:15 -04:00
Jordan Sherer 92117aa791 Added SNR directed command 2018-07-20 23:17:49 -04:00
Jordan Sherer d4c2d9a871 Log directed FT8Call messages to PSKReporter 2018-07-20 23:09:17 -04:00
Jordan Sherer b2e2b91d31 Refactored get current frequency 2018-07-20 22:17:41 -04:00
Jordan Sherer fa864c50cd Removed CQ DX from allcall 2018-07-20 16:23:48 -04:00
Jordan Sherer 1c6d1babe6 Set the QTH button to drop in the station location if provided 2018-07-20 16:11:21 -04:00
Jordan Sherer ac27d1a9b6 Brighter green for slider 2018-07-20 16:10:59 -04:00
Jordan Sherer 28eb082655 Further fix format of SNR 2018-07-20 16:04:14 -04:00
Jordan Sherer 9a945c156d Proper SNR formatting +00 +30 -09 2018-07-20 11:40:55 -04:00
Jordan Sherer 83c742f7ec Double click band activity now transfers the received message into the directed activity window and further transmissions on the offset will be added to the window automatically 2018-07-20 10:54:00 -04:00
Jordan Sherer 7a788c05c8 Added configuration options for controlling aging of the callsign and band activity windows 2018-07-20 10:13:12 -04:00
Jordan Sherer 7b409a6ff4 Fix varicode bug with empty messages 2018-07-20 09:38:34 -04:00
Jordan Sherer 87a631f5f0 Reorder directed and macro buttons 2018-07-20 09:38:10 -04:00
Jordan Sherer efd6b54ba7 Updated slider handle color 2018-07-20 09:00:36 -04:00
Jordan Sherer 553f2400e5 Updated text decoding to support more commands as well as numerical options for those commands 2018-07-19 23:14:11 -04:00
Jordan Sherer 5c84e79e5b Updated label text for qth message 2018-07-19 10:36:43 -04:00
Jordan Sherer 052b81ec8f Added 73 action and more appropriate all call responses. Added better handling of end of transmissions. 2018-07-19 10:35:00 -04:00
Jordan Sherer 7ecc550bc2 Added station qth to configuration options 2018-07-19 10:34:19 -04:00
Jordan Sherer b8267372e4 Added varicode encoding of messages
What this does is allow us to pack more than 13 characters in a single
transmission frame. Optimized using a Huffman encoding using weights of
alphabetical frequency, this will often allow us to send less than 5 bits
per character.
2018-07-19 03:44:08 -04:00
Jordan Sherer 512dffabf4 Added station message command processing 2018-07-19 02:09:19 -04:00
Jordan Sherer 50a3a56d2d Added station message to configuration 2018-07-19 00:39:31 -04:00
Jordan Sherer deb228948d Added ability to display when we receive the final transmission frame of a message 2018-07-18 16:45:27 -04:00
Jordan Sherer 58032b6ae4 Restrict low offset when not in split mode 2018-07-18 14:26:45 -04:00
Jordan Sherer 7845736c05 Smarter beacon scheduling for when editing a message or have recently transmitted 2018-07-18 09:04:58 -04:00
Jordan Sherer 77eb65d6b3 Display callsign prefix for transmitted directed messages 2018-07-16 09:14:28 -04:00
Jordan Sherer 252c21b818 Bump version to 0.1.1 2018-07-16 12:07:39 +00:00
Jordan Sherer 82c3b23e44 Merge branch 'ft8call-reorg' of https://bitbucket.org/widefido/wsjtx into ft8call-reorg 2018-07-16 11:59:06 +00:00
Jordan Sherer 5764170975 Disabled contest mode message packing which causes crashes when typing R 2018-07-16 11:58:41 +00:00
Jordan Sherer a2c85256e8 Only throttle ALLCALLs 2018-07-15 21:00:12 -04:00
Jordan Sherer 9419383ab0 Fixes for windows 2018-07-15 17:58:16 -04:00
Jordan Sherer 4c63129876 Fixed bug in beacon bumping 2018-07-15 16:48:27 -04:00
Jordan Sherer f2b876df49 Bump version to July 30 2018-07-15 16:12:57 -04:00
Jordan Sherer f229019ef5 Updated buttons while frame count is queued and is transmitting 2018-07-15 15:58:07 -04:00
Jordan Sherer 3260bb7b89 Use standard FT8 packing for standard FT8 messages, but apply a directed header for those messages that _can_ be directed 2018-07-15 15:43:29 -04:00
Jordan Sherer 2832572741 Process directed free text messages. Bump beacon on transmit. 2018-07-15 13:03:16 -04:00
Jordan Sherer 28df33b218 Better parsing of selected callsign. Blur edit box while transmitting 2018-07-15 11:00:57 -04:00
Jordan Sherer 6ee0820659 Disabled colors that are not displayed 2018-07-15 10:22:21 -04:00
Jordan Sherer 2c73ccde9b Huffman frame packing 2018-07-15 09:40:46 -04:00
Jordan Sherer 90ce372081 Added CRC-5 to directed messages to confirm message is valid 2018-07-14 22:05:08 -04:00
Jordan Sherer 15d75f7397 Try not to allocate every time... 2018-07-14 18:10:07 -04:00
Jordan Sherer f47c1a5024 Updated comment 2018-07-14 17:10:59 -04:00
Jordan Sherer c74ed5135b Parse callsigns from standard messages 2018-07-14 17:09:12 -04:00
Jordan Sherer b08ecd21e6 PSKReporter shouldnt include the rigname in the name. Added a cache to prevent allcall overrun 2018-07-14 09:26:39 -04:00
Jordan Sherer 1c98d47718 Bump EOL 2018-07-13 22:26:51 -04:00
Jordan Sherer 46e11f8d00 Complete rename to ft8call executable 2018-07-13 22:22:16 -04:00
Jordan Sherer 1e0a93e076 Update Help menu and Copyrights 2018-07-13 22:13:36 -04:00
Jordan Sherer f77f139abb Fix typo 2018-07-13 22:13:18 -04:00
Jordan Sherer 2ae74d8cde Added grid packing to varicode 2018-07-13 21:59:54 -04:00
Jordan Sherer 369b5fd73a Better beacon scheduling when receiving a directed message 2018-07-13 21:59:44 -04:00
Jordan Sherer 4de968d2f0 Try to prevent false directed decodes 2018-07-13 21:58:43 -04:00
Jordan Sherer 09b12701b5 Updated table call view. Added ALLCALL 2018-07-13 15:45:00 -04:00
Jordan Sherer d00eee440c Fixed accesses of invalid memory 2018-07-13 15:44:48 -04:00
Jordan Sherer c1df21f940 Better QSlider to match systems 2018-07-13 15:09:29 -04:00
Jordan Sherer 9117ad5381 New slider style 2018-07-13 14:43:57 -04:00
Jordan Sherer a96216e2f8 Refactored directed code into decoded text so the rest of the app can use it as is. 2018-07-13 10:32:58 -04:00
Jordan Sherer 4140114d8d Remove revision from PSKReporter report 2018-07-13 09:01:01 -04:00
Jordan Sherer bd34bf104f Bump version 2018-07-13 04:46:02 -04:00
Jordan Sherer 6a265efe48 Added command processing, code cleanup, new parsing of messages to be sent, etc. 2018-07-13 04:44:41 -04:00
Jordan Sherer 983790a3ff Added query toolbar button 2018-07-13 04:43:22 -04:00
Jordan Sherer 43b65d5ca9 Pack and unpack directed message commands naively 2018-07-13 04:42:23 -04:00
Jordan Sherer 8bc61902ac Added a priority queue 2018-07-13 02:44:31 -04:00
Jordan Sherer 4e0326ad6d Added callsign packing 2018-07-13 00:55:48 -04:00
Jordan Sherer 808782b965 Working through huffman interface 2018-07-12 20:31:45 -04:00
Jordan Sherer 707f577f31 Added huffman encoding utility 2018-07-12 18:02:54 -04:00
Jordan Sherer 705244786e Add bits accessor for decodedtext 2018-07-12 16:35:00 -04:00
Jordan Sherer 4e66e92671 Remove debug statement 2018-07-12 16:25:06 -04:00
Jordan Sherer 283e7fae77 Beacon every hour or less 2018-07-12 16:24:42 -04:00
Jordan Sherer 441936111a Output i3bits in FT8 decoder from JT9 2018-07-12 16:19:33 -04:00
Jordan Sherer f81a954d1d Ensure 10Hz offset for FT8 reception 2018-07-12 16:18:54 -04:00
Jordan Sherer 23c1730148 Disabled callsign parsing until we are ready 2018-07-12 15:23:12 -04:00
Jordan Sherer 05257d287f Parse callsigns in QSO and add to call panel 2018-07-12 15:14:41 -04:00
Jordan Sherer 64b5ebbdd2 Updated to refresh rx activity at least once per cycle 2018-07-12 14:15:18 -04:00
Jordan Sherer 91d6836fa5 Updated call activity detail 2018-07-12 10:35:41 -04:00
Jordan Sherer dd3613b214 Added bit packing to varicode 2018-07-12 09:54:56 -04:00
Jordan Sherer c96522c11b Added the start of varicode 2018-07-11 23:09:22 -04:00
Jordan Sherer 564b93f307 Removed unused count function 2018-07-11 22:53:21 -04:00
Jordan Sherer 04eaf61c13 Fixed the size of the top toolbar 2018-07-11 22:31:55 -04:00
Jordan Sherer b800dac9ce Contest should be false 2018-07-11 22:13:53 -04:00
Jordan Sherer 2cb78f5414 Extracted isMyCallIncluded 2018-07-11 10:40:29 -04:00
Jordan Sherer 494459ee11 Extracted isRecentlyDirected 2018-07-11 10:30:20 -04:00
Jordan Sherer 1cddbdf91e Experimenting with age in the band activity window 2018-07-10 22:32:35 -04:00
Jordan Sherer 74ea603801 Added clearAll action 2018-07-10 15:35:05 -04:00
Jordan Sherer 16854627d9 Updated PSKReporter spots to use FT8Call instead of WSJT-X for the application name 2018-07-10 15:23:52 -04:00
Jordan Sherer 495c16892f Bump 2018-07-10 00:56:17 -04:00
Jordan Sherer c596f23a05 Added wsjtx-ft8call as output target 2018-07-09 23:07:31 -04:00
Jordan Sherer b69e042f21 Bump version 2018-07-09 22:02:39 -04:00
Jordan Sherer ec568966c8 Fixed macros menu 2018-07-09 21:49:38 -04:00
Jordan Sherer eb062fb0b8 Macros should be updated more frequently 2018-07-09 20:55:54 -04:00
Jordan Sherer 9907a80136 Activity gui should update every 15 seconds 2018-07-09 20:51:42 -04:00
Jordan Sherer cd9079e7ff Updated directed call cache to be better represent recent directed calls 2018-07-09 17:29:43 -04:00
Jordan Sherer 42a8338d1c Allow transmit within 2 seconds of cycle start 2018-07-09 16:36:56 -04:00
Jordan Sherer f44b1154b7 Added SPOT button to UI 2018-07-09 16:31:37 -04:00
Jordan Sherer 722f2f10ae Fixed spec percent bug. Reduced default controls to nil 2018-07-09 15:34:44 -04:00
Jordan Sherer 2a7f38b187 Better breaking apart messages with newlines. Macros behavior 2018-07-09 15:17:53 -04:00
Jordan Sherer f9ab37530c Only clear activity on actual band change, not freq change 2018-07-09 10:10:04 -04:00
Jordan Sherer 442ff4b21d Fix bug on band change 2018-07-09 10:02:45 -04:00
Jordan Sherer ecacddb165 Updated makefile configs 2018-07-08 12:17:10 -04:00
Jordan Sherer 6aab2276ed Updated QAction for old versions of Qt 2018-07-08 09:29:31 -04:00
Jordan Sherer 5c9f9e8141 Version bump. 2018-07-08 09:25:35 -04:00
Jordan Sherer 60563a7dc3 Fix QAction constructor for old compilers 2018-07-07 22:04:27 -04:00
Jordan Sherer 7255728049 Added distance to the calls list 2018-07-07 22:02:11 -04:00
Jordan Sherer 50094fd8a9 Five minutes is too long. Down to two for activity 2018-07-07 17:15:17 -04:00
Jordan Sherer c45f4c137a Keep band activity around for 5 min 2018-07-07 16:58:09 -04:00
Jordan Sherer 16b46176a6 Only QSY your beacon if the frequency isn't free. Don't break lines in the rx window 2018-07-07 16:56:33 -04:00
Jordan Sherer 0df4bbcd29 Added QTH button 2018-07-07 00:47:17 -04:00
Jordan Sherer 3bbea95955 Add warning and eol message 2018-07-06 22:37:25 -04:00
Jordan Sherer fa0baad9a0 Pin calling activity to the top of the activity window 2018-07-06 22:21:04 -04:00
Jordan Sherer 7b7493d560 Fixed beacon tx display 2018-07-06 22:07:30 -04:00
Jordan Sherer dc6de6d819 Bump version 2018-07-06 20:14:09 -04:00
Jordan Sherer b7a51a5764 Disable a bunch of configuration settings that do not make sense for FT8Call 2018-07-06 20:06:41 -04:00
Jordan Sherer 145bc8d292 Updated configuration for beacon interval 2018-07-06 20:01:38 -04:00
Jordan Sherer f58ce3aec0 Propertly clear the edit widget. Properly space messages in the rx window 2018-07-06 18:25:27 -04:00
Jordan Sherer 27b45a26d9 Clear activity on band change. Scroll rx window 2018-07-06 16:54:26 -04:00
Jordan Sherer 0653f81a0d Smarter beaconing with band space 2018-07-06 16:40:09 -04:00
Jordan Sherer 1134cd5782 Disable activity word wrapping 2018-07-06 16:39:51 -04:00
Jordan Sherer aa1871dc66 Fixed beacon scheduling 2018-07-06 16:19:22 -04:00
Jordan Sherer 56869d16a9 Updated since computation to be accurate 2018-07-06 15:27:26 -04:00
Jordan Sherer ccf00dc460 Simple build script to help deploy linux app images 2018-07-06 15:27:06 -04:00
Jordan Sherer 57ad5fd0bc Compat for older Qt 2018-07-06 07:15:11 +00:00
Jordan Sherer 7d9553dd7c Added make app script 2018-07-06 03:03:02 -04:00
Jordan Sherer cad3f43752 Added version 2018-07-06 02:53:31 -04:00
Jordan Sherer 2605fb1a8f UI Customizations 2018-07-06 02:36:40 -04:00
Jordan Sherer 130b749dfe Disabled splashscreen. Updated application name and window title 2018-07-06 00:10:30 -04:00
Jordan Sherer 04bdf8574a Cache calls for easier display 2018-07-05 15:21:47 -04:00
Jordan Sherer 0dfc805a49 Highlight send button on transmit 2018-07-05 04:56:46 -04:00
Jordan Sherer 022866b52b Complete UI functionality 2018-07-05 04:45:55 -04:00
Jordan Sherer 9ed0fe80d2 UI: TableView customizations, including clear context menu 2018-07-03 18:57:49 -04:00
Jordan Sherer 7837ff5d74 UI: Updated tableview behavior 2018-07-03 15:34:03 -04:00
Jordan Sherer bee42d1762 UI Updates, Text Eliding, CallDetail Grid 2018-07-03 11:38:16 -04:00
Jordan Sherer 26c76662ac Read only edit box while transmitting 2018-07-03 03:29:26 -04:00
Jordan Sherer e3a9762179 Beaconing 2018-07-03 03:21:01 -04:00
Jordan Sherer d048f5a2ab Selection tracking 2018-07-03 02:02:19 -04:00
Jordan Sherer 0a95c79f3a Correct stop behavior when clicking send 2018-07-03 01:17:15 -04:00
Jordan Sherer 762f0fb3e1 Added proper send countdown 2018-07-02 23:03:07 -04:00
Jordan Sherer 812b11a53d Disable tx button 2018-07-02 22:56:51 -04:00
Jordan Sherer c517b555d8 Reorganized message transmission semantics 2018-07-02 22:54:26 -04:00
Jordan Sherer f610e946fc Reorganized the window, added beacon watch, macro buttons, etc 2018-07-02 15:08:26 -04:00
Jordan Sherer cb71c3dcf4 Adding messages to band activity 2018-06-15 10:11:44 -04:00
Jordan Sherer 5c8ff568c3 Updated main ui 2018-03-19 00:05:12 -04:00
Jordan Sherer 87cdc7f7e7 Reorganize main window and style meter 2018-03-10 16:59:09 -05:00
Jordan Sherer e694d862aa Modifying mainwindow to display waterfall and minimal ui 2018-03-09 13:10:19 -05:00
Jordan Sherer 4df7aae11a Merged in the extended free text experiment patch 2018-03-08 17:01:33 -05:00
34 changed files with 11172 additions and 2758 deletions
BIN
View File
Binary file not shown.
+10 -7
View File
@@ -2,13 +2,15 @@
# To pass variables to cpack from cmake, they must be configured
# in this file.
set (CPACK_SET_DESTDIR true)
set (CPACK_PACKAGE_VENDOR "@PROJECT_VENDOR@")
set (CPACK_PACKAGE_CONTACT "@PROJECT_CONTACT@")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "@PROJECT_SUMMARY_DESCRIPTION@")
set (CPACK_RESOURCE_FILE_LICENSE "@PROJECT_SOURCE_DIR@/COPYING")
set (CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set (CPACK_PACKAGE_EXECUTABLES wsjtx "@PROJECT_NAME@")
set (CPACK_CREATE_DESKTOP_LINKS wsjtx)
set (CPACK_PACKAGE_EXECUTABLES ft8call "@PROJECT_NAME@")
set (CPACK_CREATE_DESKTOP_LINKS ft8call)
set (CPACK_STRIP_FILES TRUE)
#
@@ -19,9 +21,10 @@ set (CPACK_STRIP_FILES TRUE)
#set (CPACK_COMPONENT_RUNTIME_DESCRIPTION "@WSJTX_DESCRIPTION_SUMMARY@")
if (CPACK_GENERATOR MATCHES "NSIS")
set (CPACK_SET_DESTDIR FALSE)
set (CPACK_STRIP_FILES FALSE) # breaks Qt packaging on Windows
set (CPACK_NSIS_INSTALL_ROOT "C:\\WSJT")
set (CPACK_NSIS_INSTALL_ROOT "C:\\FT8Call")
# set the install/unistall icon used for the installer itself
# There is a bug in NSI that does not handle full unix paths properly.
@@ -35,13 +38,13 @@ if (CPACK_GENERATOR MATCHES "NSIS")
"@PROJECT_HOMEPAGE@" "@PROJECT_NAME@ Web Site"
)
# Use the icon from wsjtx for add-remove programs
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\wsjtx.exe")
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\ft8call.exe")
set (CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
set (CPACK_NSIS_HELP_LINK "@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@")
set (CPACK_NSIS_URL_INFO_ABOUT "@PROJECT_HOMEPAGE@")
set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "wsjtx.exe")
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "ft8call.exe")
set (CPACK_NSIS_MODIFY_PATH ON)
endif ()
@@ -65,9 +68,9 @@ if ("${CPACK_GENERATOR}" STREQUAL "WIX")
# Reset CPACK_PACKAGE_VERSION to deal with WiX restriction.
# But the file names still use the full CMake_VERSION value:
set (CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-${CPACK_SYSTEM_NAME}")
"${CPACK_PACKAGE_NAME}-@ft8call_VERSION@-${CPACK_SYSTEM_NAME}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-Source")
"${CPACK_PACKAGE_NAME}-@ft8call_VERSION@-Source")
if (NOT CPACK_WIX_SIZEOF_VOID_P)
set (CPACK_WIX_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@")
+25 -24
View File
@@ -22,7 +22,7 @@ Change this to the newest SDK available that you can install on your system (10.
Do not override this if you intend to build an official deployable installer.")
endif (APPLE)
project (wsjtx C CXX Fortran)
project (ft8call C CXX Fortran)
#
# CMake policies
@@ -45,10 +45,10 @@ message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}")
#
# project information
#
set (PROJECT_NAME "WSJT-X")
set (PROJECT_VENDOR "Joe Taylor, K1JT")
set (PROJECT_CONTACT "Joe Taylor <k1jt@arrl.net>")
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2018 by Joe Taylor, K1JT")
set (PROJECT_NAME "FT8Call")
set (PROJECT_VENDOR "Jordan Sherer, KN4CRD")
set (PROJECT_CONTACT "Jordan Sherer <kn4crd@gmail.com>")
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2018 by Joe Taylor, K1JT, (C) 2018 by Jordan Sherer, KN4CRD")
set (PROJECT_HOMEPAGE http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html)
set (PROJECT_MANUAL wsjtx-main)
set (PROJECT_MANUAL_DIRECTORY_URL http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/)
@@ -303,6 +303,7 @@ set (wsjtx_CXXSRCS
astro.cpp
messageaveraging.cpp
WsprTxScheduler.cpp
varicode.cpp
mainwindow.cpp
Configuration.cpp
main.cpp
@@ -1298,7 +1299,7 @@ else (${OPENMP_FOUND} OR APPLE)
endif (${OPENMP_FOUND} OR APPLE)
# build the main application
add_executable (wsjtx MACOSX_BUNDLE
add_executable (ft8call MACOSX_BUNDLE
${wsjtx_CXXSRCS}
${wsjtx_GENUISRCS}
wsjtx.rc
@@ -1307,10 +1308,10 @@ add_executable (wsjtx MACOSX_BUNDLE
)
if (WSJT_CREATE_WINMAIN)
set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON)
set_target_properties (ft8call PROPERTIES WIN32_EXECUTABLE ON)
endif (WSJT_CREATE_WINMAIN)
set_target_properties (wsjtx PROPERTIES
set_target_properties (ft8call PROPERTIES
MACOSX_BUNDLE_INFO_STRING "${WSJTX_DESCRIPTION_SUMMARY}"
MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}"
MACOSX_BUNDLE_BUNDLE_VERSION ${wsjtx_VERSION}
@@ -1321,27 +1322,27 @@ set_target_properties (wsjtx PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx"
)
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
target_include_directories (ft8call PRIVATE ${FFTW3_INCLUDE_DIRS})
if (APPLE)
target_link_libraries (wsjtx wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
target_link_libraries (ft8call wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
else ()
target_link_libraries (wsjtx wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
target_link_libraries (ft8call wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
if (OpenMP_C_FLAGS)
set_target_properties (wsjtx PROPERTIES
set_target_properties (ft8call PROPERTIES
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
LINK_FLAGS "${OpenMP_C_FLAGS}"
)
endif ()
set_target_properties (wsjtx PROPERTIES
set_target_properties (ft8call PROPERTIES
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
)
if (WIN32)
set_target_properties (wsjtx PROPERTIES
set_target_properties (ft8call PROPERTIES
LINK_FLAGS -Wl,--stack,16777216
)
endif ()
endif ()
qt5_use_modules (wsjtx SerialPort) # not sure why the interface link library syntax above doesn't work
qt5_use_modules (ft8call SerialPort) # not sure why the interface link library syntax above doesn't work
# make a library for WSJT-X UDP servers
# add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS})
@@ -1386,18 +1387,18 @@ endif (WSJT_CREATE_WINMAIN)
if (UNIX)
if (NOT WSJT_SKIP_MANPAGES)
add_subdirectory (manpages)
add_dependencies (wsjtx manpages)
add_dependencies (ft8call manpages)
endif (NOT WSJT_SKIP_MANPAGES)
if (NOT APPLE)
add_subdirectory (debian)
add_dependencies (wsjtx debian)
add_dependencies (ft8call debian)
endif (NOT APPLE)
endif (UNIX)
#
# installation
#
install (TARGETS wsjtx
install (TARGETS ft8call
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION . COMPONENT runtime
)
@@ -1487,11 +1488,11 @@ add_custom_target (uninstall
# creates svnversion.h using cmake script
add_custom_target (revisiontag
COMMAND ${CMAKE_COMMAND} -D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D OUTPUT_DIR=${PROJECT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake
COMMENT "Generating Subversion revision information"
VERBATIM
)
# add_custom_target (revisiontag
# COMMAND ${CMAKE_COMMAND} -D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D OUTPUT_DIR=${PROJECT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake
# COMMENT "Generating Subversion revision information"
# VERBATIM
# )
# explicitly say that the wsjt_qt depends on custom target, this is
# done indirectly so that the revisiontag target gets built exactly
# once per build
@@ -1511,7 +1512,7 @@ if (NOT WIN32 AND NOT APPLE)
# install a desktop file so wsjtx appears in the application start
# menu with an icon
install (
FILES wsjtx.desktop message_aggregator.desktop
FILES ft8call.desktop message_aggregator.desktop
DESTINATION share/applications
#COMPONENT runtime
)
+1
View File
@@ -10,6 +10,7 @@ auto CallsignValidator::validate (QString& input, int& pos) const -> State
{
auto match = re_.match (input, 0, QRegularExpression::PartialPreferCompleteMatch);
input = input.toUpper ();
if (input.count(QLatin1Char('/')) > 1) return Invalid;
if (match.hasMatch ()) return Acceptable;
if (!input.size () || match.hasPartialMatch ()) return Intermediate;
pos = input.size ();
+130 -3
View File
@@ -140,6 +140,7 @@
#include <QSettings>
#include <QAudioDeviceInfo>
#include <QAudioInput>
#include <QDebug>
#include <QDialog>
#include <QAction>
#include <QFileDialog>
@@ -160,7 +161,6 @@
#include <QColorDialog>
#include <QSerialPortInfo>
#include <QScopedPointer>
#include <QDebug>
#include "pimpl_impl.hpp"
#include "qt_helpers.hpp"
@@ -181,6 +181,8 @@
#include "MaidenheadLocatorValidator.hpp"
#include "CallsignValidator.hpp"
#include "varicode.h"
#include "ui_Configuration.h"
#include "moc_Configuration.cpp"
@@ -430,6 +432,8 @@ private:
Q_SLOT void on_add_macro_push_button_clicked (bool = false);
Q_SLOT void on_delete_macro_push_button_clicked (bool = false);
Q_SLOT void on_PTT_method_button_group_buttonClicked (int);
Q_SLOT void on_station_message_line_edit_textChanged(QString const&);
Q_SLOT void on_qth_message_line_edit_textChanged(QString const&);
Q_SLOT void on_add_macro_line_edit_editingFinished ();
Q_SLOT void delete_macro ();
void delete_selected_macros (QModelIndexList);
@@ -529,6 +533,11 @@ private:
// configuration fields that we publish
QString my_callsign_;
QString my_grid_;
QString my_station_;
int my_dBm_;
QString my_qth_;
int callsign_aging_;
int activity_aging_;
QColor color_CQ_;
QColor next_color_CQ_;
QColor color_MyCall_;
@@ -548,6 +557,7 @@ private:
bool id_after_73_;
bool tx_QSY_allowed_;
bool spot_to_psk_reporter_;
bool autoreply_off_at_startup_;
bool monitor_off_at_startup_;
bool monitor_last_used_;
bool log_as_RTTY_;
@@ -560,6 +570,7 @@ private:
bool miles_;
bool quick_call_;
bool disable_TX_on_73_;
int beacon_;
int watchdog_;
bool TX_messages_;
bool enable_VHF_features_;
@@ -649,6 +660,15 @@ bool Configuration::spot_to_psk_reporter () const
// rig must be open and working to spot externally
return is_transceiver_online () && m_->spot_to_psk_reporter_;
}
void Configuration::set_spot_to_psk_reporter (bool spot)
{
if(m_->spot_to_psk_reporter_ != spot){
m_->spot_to_psk_reporter_ = spot;
m_->write_settings();
}
}
bool Configuration::autoreply_off_at_startup () const {return m_->autoreply_off_at_startup_;}
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->monitor_last_used_;}
bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
@@ -661,6 +681,7 @@ bool Configuration::clear_DX () const {return m_->clear_DX_;}
bool Configuration::miles () const {return m_->miles_;}
bool Configuration::quick_call () const {return m_->quick_call_;}
bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;}
int Configuration::beacon () const {return m_->beacon_;}
int Configuration::watchdog () const {return m_->watchdog_;}
bool Configuration::TX_messages () const {return m_->TX_messages_;}
bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;}
@@ -807,6 +828,30 @@ QString Configuration::my_grid() const
return the_grid;
}
QString Configuration::my_station() const
{
return m_->my_station_;
}
int Configuration::my_dBm() const {
return m_->my_dBm_;
}
QString Configuration::my_qth() const
{
return m_->my_qth_;
}
int Configuration::callsign_aging() const
{
return m_->callsign_aging_;
}
int Configuration::activity_aging() const
{
return m_->activity_aging_;
}
void Configuration::set_location (QString const& grid_descriptor)
{
// change the dynamic grid
@@ -945,6 +990,8 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
ui_->callsign_line_edit->setValidator (new CallsignValidator {this});
ui_->grid_line_edit->setValidator (new MaidenheadLocatorValidator {this});
ui_->add_macro_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
ui_->station_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
ui_->qth_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
ui_->udp_server_port_spin_box->setMinimum (1);
ui_->udp_server_port_spin_box->setMaximum (std::numeric_limits<port_type>::max ());
@@ -1115,10 +1162,49 @@ void Configuration::impl::initialize_models ()
{
pal.setColor (QPalette::Base, Qt::white);
}
QMap<int, int> dbm2mw = {
{0 , 1},
{3 , 2},
{7 , 5},
{10 , 10},
{13 , 20},
{17 , 50},
{20 , 100},
{23 , 200},
{27 , 500},
{30 , 1000}, // 1W
{33 , 2000}, // 2W
{37 , 5000}, // 5W
{40 , 10000}, // 10W
{43 , 20000}, // 20W
{47 , 50000}, // 50W
{50 , 100000}, // 100W
{53 , 200000}, // 200W
{57 , 500000}, // 500W
{60 , 1000000}, // 1000W
};
ui_->station_power_combo_box->clear();
ui_->station_power_combo_box->addItem(QString(""), -1);
foreach(auto dbm, dbm2mw.keys()){
ui_->station_power_combo_box->addItem(QString("%1 (%2 dBm)").arg(Varicode::formatPWR(dbm)).arg(dbm), dbm);
if(dbm == my_dBm_){
ui_->station_power_combo_box->setCurrentIndex(ui_->station_power_combo_box->count()-1);
}
}
ui_->callsign_line_edit->setPalette (pal);
ui_->grid_line_edit->setPalette (pal);
ui_->callsign_line_edit->setText (my_callsign_);
ui_->grid_line_edit->setText (my_grid_);
ui_->callsign_aging_spin_box->setValue(callsign_aging_);
ui_->activity_aging_spin_box->setValue(activity_aging_);
ui_->station_message_line_edit->setText (my_station_.toUpper());
ui_->qth_message_line_edit->setText (my_qth_.toUpper());
ui_->use_dynamic_grid->setChecked(use_dynamic_grid_);
ui_->labCQ->setStyleSheet(QString("background: %1").arg(color_CQ_.name()));
ui_->labMyCall->setStyleSheet(QString("background: %1").arg(color_MyCall_.name()));
@@ -1137,6 +1223,7 @@ void Configuration::impl::initialize_models ()
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
ui_->tx_QSY_check_box->setChecked (tx_QSY_allowed_);
ui_->psk_reporter_check_box->setChecked (spot_to_psk_reporter_);
ui_->autoreply_off_check_box->setChecked (autoreply_off_at_startup_);
ui_->monitor_off_check_box->setChecked (monitor_off_at_startup_);
ui_->monitor_last_used_check_box->setChecked (monitor_last_used_);
ui_->log_as_RTTY_check_box->setChecked (log_as_RTTY_);
@@ -1149,6 +1236,7 @@ void Configuration::impl::initialize_models ()
ui_->miles_check_box->setChecked (miles_);
ui_->quick_call_check_box->setChecked (quick_call_);
ui_->disable_TX_on_73_check_box->setChecked (disable_TX_on_73_);
ui_->beacon_spin_box->setValue (beacon_);
ui_->tx_watchdog_spin_box->setValue (watchdog_);
ui_->TX_messages_check_box->setChecked (TX_messages_);
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
@@ -1236,6 +1324,11 @@ void Configuration::impl::read_settings ()
my_callsign_ = settings_->value ("MyCall", QString {}).toString ();
my_grid_ = settings_->value ("MyGrid", QString {}).toString ();
my_station_ = settings_->value("MyStation", QString {}).toString();
my_dBm_ = settings_->value("MyPower", -1).toInt();
callsign_aging_ = settings_->value ("CallsignAging", 0).toInt ();
activity_aging_ = settings_->value ("ActivityAging", 2).toInt ();
my_qth_ = settings_->value("MyQTH", QString {}).toString();
next_color_CQ_ = color_CQ_ = settings_->value("colorCQ","#66ff66").toString();
next_color_MyCall_ = color_MyCall_ = settings_->value("colorMyCall","#ff6666").toString();
next_color_TxMsg_ = color_TxMsg_ = settings_->value("colorTxMsg","#ffff00").toString();
@@ -1329,6 +1422,7 @@ void Configuration::impl::read_settings ()
type_2_msg_gen_ = settings_->value ("Type2MsgGen", QVariant::fromValue (Configuration::type_2_msg_3_full)).value<Configuration::Type2MsgGen> ();
autoreply_off_at_startup_ = settings_->value ("AutoreplyOFF", false).toBool ();
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
monitor_last_used_ = settings_->value ("MonitorLastUsed", false).toBool ();
spot_to_psk_reporter_ = settings_->value ("PSKReporter", false).toBool ();
@@ -1336,7 +1430,9 @@ void Configuration::impl::read_settings ()
tx_QSY_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
use_dynamic_grid_ = settings_->value ("AutoGrid", false).toBool ();
macros_.setStringList (settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList ());
auto loadedMacros = settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList();
macros_.setStringList (loadedMacros);
region_ = settings_->value ("Region", QVariant::fromValue (IARURegions::ALL)).value<IARURegions::Region> ();
@@ -1386,7 +1482,8 @@ void Configuration::impl::read_settings ()
miles_ = settings_->value ("Miles", false).toBool ();
quick_call_ = settings_->value ("QuickCall", false).toBool ();
disable_TX_on_73_ = settings_->value ("73TxDisable", false).toBool ();
watchdog_ = settings_->value ("TxWatchdog", 6).toInt ();
beacon_ = settings_->value ("TxBeacon", 15).toInt ();
watchdog_ = settings_->value ("TxWatchdog", 0).toInt ();
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
@@ -1419,6 +1516,11 @@ void Configuration::impl::write_settings ()
settings_->setValue ("MyCall", my_callsign_);
settings_->setValue ("MyGrid", my_grid_);
settings_->setValue ("MyStation", my_station_);
settings_->setValue ("MyPower", my_dBm_);
settings_->setValue ("MyQTH", my_qth_);
settings_->setValue ("CallsignAging", callsign_aging_);
settings_->setValue ("ActivityAging", activity_aging_);
settings_->setValue("colorCQ",color_CQ_);
settings_->setValue("colorMyCall",color_MyCall_);
settings_->setValue("colorTxMsg",color_TxMsg_);
@@ -1457,6 +1559,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
settings_->setValue ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_));
settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_));
settings_->setValue ("AutoreplyOFF", autoreply_off_at_startup_);
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
settings_->setValue ("PSKReporter", spot_to_psk_reporter_);
@@ -1484,6 +1587,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("Miles", miles_);
settings_->setValue ("QuickCall", quick_call_);
settings_->setValue ("73TxDisable", disable_TX_on_73_);
settings_->setValue ("TxBeacon", beacon_);
settings_->setValue ("TxWatchdog", watchdog_);
settings_->setValue ("Tx2QSO", TX_messages_);
settings_->setValue ("CATForceDTR", rig_params_.force_dtr);
@@ -1869,6 +1973,11 @@ void Configuration::impl::accept ()
my_callsign_ = ui_->callsign_line_edit->text ();
my_grid_ = ui_->grid_line_edit->text ();
my_station_ = ui_->station_message_line_edit->text().toUpper();
my_dBm_ = ui_->station_power_combo_box->currentData().toInt();
my_qth_ = ui_->qth_message_line_edit->text().toUpper();
callsign_aging_ = ui_->callsign_aging_spin_box->value();
activity_aging_ = ui_->activity_aging_spin_box->value();
spot_to_psk_reporter_ = ui_->psk_reporter_check_box->isChecked ();
id_interval_ = ui_->CW_id_interval_spin_box->value ();
ntrials_ = ui_->sbNtrials->value ();
@@ -1878,6 +1987,7 @@ void Configuration::impl::accept ()
RxBandwidth_ = ui_->sbBandwidth->value ();
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
tx_QSY_allowed_ = ui_->tx_QSY_check_box->isChecked ();
autoreply_off_at_startup_ = ui_->autoreply_off_check_box->isChecked ();
monitor_off_at_startup_ = ui_->monitor_off_check_box->isChecked ();
monitor_last_used_ = ui_->monitor_last_used_check_box->isChecked ();
type_2_msg_gen_ = static_cast<Type2MsgGen> (ui_->type_2_msg_gen_combo_box->currentIndex ());
@@ -1891,6 +2001,7 @@ void Configuration::impl::accept ()
miles_ = ui_->miles_check_box->isChecked ();
quick_call_ = ui_->quick_call_check_box->isChecked ();
disable_TX_on_73_ = ui_->disable_TX_on_73_check_box->isChecked ();
beacon_ = ui_->beacon_spin_box->value ();
watchdog_ = ui_->tx_watchdog_spin_box->value ();
TX_messages_ = ui_->TX_messages_check_box->isChecked ();
data_mode_ = static_cast<DataMode> (ui_->TX_mode_button_group->checkedId ());
@@ -2151,6 +2262,22 @@ void Configuration::impl::on_sound_output_combo_box_currentTextChanged (QString
default_audio_output_device_selected_ = QAudioDeviceInfo::defaultOutputDevice ().deviceName () == text;
}
void Configuration::impl::on_station_message_line_edit_textChanged(QString const &text)
{
QString upper = text.toUpper();
if(text != upper){
ui_->station_message_line_edit->setText (upper);
}
}
void Configuration::impl::on_qth_message_line_edit_textChanged(QString const &text)
{
QString upper = text.toUpper();
if(text != upper){
ui_->qth_message_line_edit->setText (upper);
}
}
void Configuration::impl::on_add_macro_line_edit_editingFinished ()
{
ui_->add_macro_line_edit->setText (ui_->add_macro_line_edit->text ().toUpper ());
+8
View File
@@ -96,6 +96,11 @@ public:
QString my_callsign () const;
QString my_grid () const;
QString my_station () const;
int my_dBm() const;
int activity_aging() const;
int callsign_aging() const;
QString my_qth () const;
QFont text_font () const;
QFont decoded_text_font () const;
qint32 id_interval () const;
@@ -107,6 +112,8 @@ public:
bool id_after_73 () const;
bool tx_QSY_allowed () const;
bool spot_to_psk_reporter () const;
void set_spot_to_psk_reporter (bool);
bool autoreply_off_at_startup () const;
bool monitor_off_at_startup () const;
bool monitor_last_used () const;
bool log_as_RTTY () const;
@@ -119,6 +126,7 @@ public:
bool miles () const;
bool quick_call () const;
bool disable_TX_on_73 () const;
int beacon () const;
int watchdog () const;
bool TX_messages () const;
bool split_mode () const;
+455 -158
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>534</width>
<height>530</height>
<width>825</width>
<height>688</height>
</rect>
</property>
<property name="windowTitle">
@@ -16,6 +16,9 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTabWidget" name="configuration_tabs">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Select tab to change configuration parameters.</string>
</property>
@@ -117,6 +120,12 @@
<layout class="QFormLayout" name="formLayout_13">
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="text">
<string>Message generation for type 2 compound callsign holders:</string>
</property>
@@ -131,7 +140,10 @@
<item row="0" column="1">
<widget class="QComboBox" name="type_2_msg_gen_combo_box">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&amp;gt;Add-on prefixes and suffixes).&lt;/p&gt;&lt;p&gt;This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.&lt;/p&gt;&lt;p&gt;This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.&lt;/p&gt;&lt;p&gt;Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.&lt;/p&gt;&lt;p&gt;None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -158,6 +170,51 @@
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QFormLayout" name="formLayout_16">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>QTH Message:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="qth_message_line_edit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Station Message:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="station_message_line_edit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Station Power:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="station_power_combo_box"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
@@ -174,18 +231,14 @@
<string>Display</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QCheckBox" name="insert_blank_check_box">
<property name="toolTip">
<string>Include a separator line between periods in the band activity window.</string>
</property>
<property name="text">
<string>&amp;Blank line between decoding periods</string>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
@@ -197,21 +250,11 @@
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="miles_check_box">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Show distance to DX station in miles rather than kilometers.</string>
</property>
@@ -220,8 +263,14 @@
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
@@ -230,50 +279,35 @@
</property>
</widget>
</item>
<item row="0" column="2" rowspan="4">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="font_push_button">
<property name="toolTip">
<string>Set the font characteristics for the application.</string>
</property>
<property name="text">
<string>Font...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="decoded_text_font_push_button">
<property name="toolTip">
<string>Set the font characteristics for the Band Activity and Rx Frequency areas.</string>
</property>
<property name="text">
<string>Decoded Text Font...</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="insert_blank_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Include a separator line between periods in the band activity window.</string>
</property>
<property name="text">
<string>&amp;Blank line between decoding periods</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@@ -289,22 +323,185 @@
<property name="title">
<string>Behavior</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="4" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_12">
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QCheckBox" name="autoreply_off_check_box">
<property name="text">
<string>Autoreply off at startup</string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</widget>
</item>
<item>
<widget class="QCheckBox" name="monitor_off_check_box">
<property name="toolTip">
<string>Don't start decoding until the monitor button is clicked.</string>
</property>
<property name="text">
<string>Mon&amp;itor off at startup</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="monitor_last_used_check_box">
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Monitor returns to last used frequency</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="tx_QSY_check_box">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Allow Tx frequency changes while transmitting</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="single_decode_check_box">
<property name="text">
<string>Single decode</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_155">
<item>
<widget class="QLabel" name="beacon_label_10">
<property name="text">
<string>Remove callsigns from heard list after:</string>
</property>
<property name="buddy">
<cstring>callsign_aging_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="callsign_aging_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes between unattended beacons&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="specialValueText">
<string>Disabled</string>
</property>
<property name="suffix">
<string> minutes</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_156">
<item>
<widget class="QLabel" name="beacon_label_10">
<property name="text">
<string>Remove messages from band activity after:</string>
</property>
<property name="buddy">
<cstring>callsign_aging_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="activity_aging_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes between unattended beacons&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="specialValueText">
<string>Disabled</string>
</property>
<property name="suffix">
<string> minutes</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>2</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<widget class="QLabel" name="beacon_label_10">
<property name="text">
<string>Beacon interval:</string>
</property>
<property name="buddy">
<cstring>callsign_aging_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="beacon_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes between unattended beacons&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> minutes</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>5</number>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QLabel" name="label_10">
<property name="text">
@@ -330,60 +527,22 @@
<string/>
</property>
<property name="value">
<number>6</number>
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="monitor_off_check_box">
<property name="toolTip">
<string>Don't start decoding until the monitor button is clicked.</string>
</property>
<property name="text">
<string>Mon&amp;itor off at startup</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="enable_VHF_features_check_box">
<property name="text">
<string>Enable VHF/UHF/Microwave features</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="decode_at_52s_check_box">
<property name="text">
<string>Decode after EME delay</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="single_decode_check_box">
<property name="text">
<string>Single decode</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="tx_QSY_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Allow Tx frequency changes while transmitting</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QCheckBox" name="CW_id_after_73_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Send a CW ID after every 73 or free text message.</string>
</property>
@@ -392,21 +551,11 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -423,6 +572,9 @@
</item>
<item>
<widget class="QSpinBox" name="CW_id_interval_spin_box">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -439,18 +591,60 @@ quiet period when decoding is done.</string>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="monitor_last_used_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</layout>
<widget class="QCheckBox" name="enable_VHF_features_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="text">
<string>Monitor returns to last used frequency</string>
<string>Enable VHF/UHF/Microwave features</string>
</property>
</widget>
<widget class="QCheckBox" name="decode_at_52s_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="text">
<string>Decode after EME delay</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="quick_call_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Automatic transmission mode.</string>
</property>
@@ -458,9 +652,21 @@ quiet period when decoding is done.</string>
<string>Doubl&amp;e-click on call sets Tx enable</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="disable_TX_on_73_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Turns off automatic transmissions after sending a 73 or any other free
text message.</string>
@@ -469,8 +675,6 @@ text message.</string>
<string>Di&amp;sable Tx after sending 73</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
@@ -1644,6 +1848,12 @@ QListView::item:hover {
<layout class="QGridLayout" name="gridLayout_14">
<item row="0" column="0">
<widget class="QCheckBox" name="prompt_to_log_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message.</string>
</property>
@@ -1691,6 +1901,9 @@ QListView::item:hover {
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="report_in_comments_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Some logging programs will not accept the type of reports
saved by this program.
@@ -1704,6 +1917,9 @@ comments field.</string>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="clear_DX_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Check this option to force the clearing of the DX Call
and DX Grid fields when a 73 or free text message is sent.</string>
@@ -2129,8 +2345,19 @@ Right click for insert and delete options.</string>
</widget>
<widget class="QWidget" name="colors_tab">
<attribute name="title">
<string>Colors</string>
<string>UI</string>
</attribute>
<widget class="QWidget" name="xQ" native="true">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>183</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout_5" rowstretch="1,1,2" columnstretch="1,1,2">
<item row="1" column="1">
<layout class="QGridLayout" name="gridLayout_13">
@@ -2200,6 +2427,9 @@ Right click for insert and delete options.</string>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pbTxMsg">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>140</width>
@@ -2213,6 +2443,9 @@ Right click for insert and delete options.</string>
</item>
<item row="2" column="1">
<widget class="QLabel" name="labTx">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>80</width>
@@ -2232,6 +2465,9 @@ Right click for insert and delete options.</string>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labDXCC">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>80</width>
@@ -2251,6 +2487,9 @@ Right click for insert and delete options.</string>
</item>
<item row="4" column="0">
<widget class="QPushButton" name="pbNewCall">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>140</width>
@@ -2264,6 +2503,9 @@ Right click for insert and delete options.</string>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="pbNewDXCC">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>140</width>
@@ -2277,6 +2519,9 @@ Right click for insert and delete options.</string>
</item>
<item row="4" column="1">
<widget class="QLabel" name="labNewCall">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>80</width>
@@ -2349,6 +2594,52 @@ Right click for insert and delete options.</string>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="font_push_button">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Set the font characteristics for the application.</string>
</property>
<property name="text">
<string>UI Font...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="decoded_text_font_push_button">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Set the font characteristics for the Band Activity and Rx Frequency areas.</string>
</property>
<property name="text">
<string>Message Text Font...</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<widget class="QWidget" name="advanced_tab">
<attribute name="title">
@@ -2357,6 +2648,9 @@ Right click for insert and delete options.</string>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_5">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string>Miscellaneous</string>
</property>
@@ -2455,7 +2749,7 @@ Right click for insert and delete options.</string>
<item row="8" column="0">
<widget class="QCheckBox" name="cbx4ToneSpacing">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -2470,6 +2764,9 @@ Right click for insert and delete options.</string>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User-selectable parameters for JT65 VHF/UHF/Microwave decoding.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -2551,6 +2848,9 @@ Right click for insert and delete options.</string>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_7">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
@@ -2616,7 +2916,6 @@ soundcard changes</string>
<tabstop>use_dynamic_grid</tabstop>
<tabstop>region_combo_box</tabstop>
<tabstop>type_2_msg_gen_combo_box</tabstop>
<tabstop>insert_blank_check_box</tabstop>
<tabstop>miles_check_box</tabstop>
<tabstop>TX_messages_check_box</tabstop>
<tabstop>DXCC_check_box</tabstop>
@@ -2628,8 +2927,6 @@ soundcard changes</string>
<tabstop>tx_watchdog_spin_box</tabstop>
<tabstop>CW_id_after_73_check_box</tabstop>
<tabstop>enable_VHF_features_check_box</tabstop>
<tabstop>tx_QSY_check_box</tabstop>
<tabstop>single_decode_check_box</tabstop>
<tabstop>decode_at_52s_check_box</tabstop>
<tabstop>CW_id_interval_spin_box</tabstop>
<tabstop>rig_combo_box</tabstop>
@@ -2768,12 +3065,12 @@ soundcard changes</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups>
</ui>
+3 -3
View File
@@ -804,9 +804,9 @@ void HamlibTransceiver::do_tx_frequency (Frequency tx, MODE mode, bool no_ignore
if (UNK != mode)
{
auto new_mode = map_mode (mode);
// TRACE_CAT ("HamlibTransceiver", "rig_set_split_freq_mode freq = " << tx
// << " mode = " << rig_strrmode (new_mode));
// error_check (rig_set_split_freq_mode (rig_.data (), RIG_VFO_CURR, tx, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting split TX frequency and mode"));
TRACE_CAT ("HamlibTransceiver", "rig_set_split_freq_mode freq = " << tx
<< " mode = " << rig_strrmode (new_mode));
error_check (rig_set_split_freq_mode (rig_.data (), RIG_VFO_CURR, tx, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting split TX frequency and mode"));
}
else
{
+1 -1
View File
@@ -23,7 +23,7 @@ namespace
"MSK144",
"QRA64",
"FreqCal",
"FT8"
"FT8",
};
std::size_t constexpr mode_names_size = sizeof (mode_names) / sizeof (mode_names[0]);
}
+4 -4
View File
@@ -1,6 +1,6 @@
# Version number components
set (WSJTX_VERSION_MAJOR 1)
set (WSJTX_VERSION_MINOR 9)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 2) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_MAJOR 0)
set (WSJTX_VERSION_MINOR 3)
set (WSJTX_VERSION_PATCH 2)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
+1699
View File
File diff suppressed because it is too large Load Diff
+104 -1
View File
@@ -4,6 +4,8 @@
#include <QRegularExpression>
#include <QDebug>
#include <varicode.h>
extern "C" {
bool stdmsg_(char const * msg, bool contest_mode, char const * mygrid, fortran_charlen_t, fortran_charlen_t);
}
@@ -50,8 +52,109 @@ DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString
, contest_mode_
, grid_c_string.constData ()
, 22, 6);
// We're only going to unpack standard messages for CQs && beacons...
// TODO: jsherer - this is a hack for now...
if(is_standard_){
is_standard_ = QRegularExpression("^(CQ|DE|QRZ)\\s").match(message_).hasMatch();
}
};
}
tryUnpack();
}
DecodedText::DecodedText (QString const& ft8callmessage){
message_ = ft8callmessage;
is_standard_ = false;
tryUnpack();
}
bool DecodedText::tryUnpack(){
if(is_standard_){
return false;
}
bool unpacked = false;
if(!unpacked){
unpacked = tryUnpackCompound();
}
if(!unpacked){
unpacked = tryUnpackDirected();
}
if(!unpacked){
unpacked = tryUnpackData();
}
return unpacked;
}
bool DecodedText::tryUnpackCompound(){
QString m = message().trimmed();
// directed calls will always be 12+ chars and contain no spaces.
if(m.length() < 12 || m.contains(' ')){
return false;
}
QStringList parts = Varicode::unpackCompoundMessage(m, nullptr);
if(parts.isEmpty() || parts.length() < 2){
return false;
}
compound_ = QString("%1/%2").arg(parts.at(0), parts.at(1));
message_ = QString("%1: ").arg(compound_);
return true;
}
bool DecodedText::tryUnpackDirected(){
QString m = message().trimmed();
// directed calls will always be 12+ chars and contain no spaces.
if(m.length() < 12 || m.contains(' ')){
return false;
}
QStringList parts = Varicode::unpackDirectedMessage(m);
if(parts.isEmpty()){
return false;
}
if(parts.length() == 3){
// replace it with the correct unpacked (directed)
message_ = QString("%1: %2%3 ").arg(parts.at(0), parts.at(1), parts.at(2));
} else if(parts.length() == 4){
// replace it with the correct unpacked (directed numeric)
message_ = QString("%1: %2%3 %4 ").arg(parts.at(0), parts.at(1), parts.at(2), parts.at(3));
} else {
// replace it with the correct unpacked (freetext)
message_ = QString(parts.join(""));
}
directed_ = parts;
return true;
}
bool DecodedText::tryUnpackData(){
QString m = message().trimmed();
// data frames calls will always be 12+ chars and contain no spaces.
if(m.length() < 12 || m.contains(' ')){
return false;
}
QString data = Varicode::unpackDataMessage(m);
if(data.isEmpty()){
return false;
}
message_ = data;
return true;
}
QStringList DecodedText::messageWords () const
{
+24 -6
View File
@@ -10,6 +10,7 @@
#define DECODEDTEXT_H
#include <QString>
#include <QStringList>
@@ -30,15 +31,28 @@ class DecodedText
{
public:
explicit DecodedText (QString const& message, bool, QString const& my_grid);
explicit DecodedText (QString const& ft8callmessage);
QString string() const { return string_; };
bool tryUnpack();
bool tryUnpackCompound();
bool tryUnpackDirected();
bool tryUnpackData();
QString compoundCall() const { return compound_; }
bool isCompoundMessage() const { return !compound_.isEmpty(); }
QStringList directedMessage() const { return directed_; }
bool isDirectedMessage() const { return !directed_.isEmpty() && directed_.length() > 2; }
QString string() const { return string_; }
QString message() const { return message_; }
QStringList messageWords () const;
int indexOf(QString s) const { return string_.indexOf(s); };
int indexOf(QString s, int i) const { return string_.indexOf(s,i); };
QString mid(int f, int t) const { return string_.mid(f,t); };
QString left(int i) const { return string_.left(i); };
int indexOf(QString s) const { return string_.indexOf(s); }
int indexOf(QString s, int i) const { return string_.indexOf(s,i); }
QString mid(int f, int t) const { return string_.mid(f,t); }
QString left(int i) const { return string_.left(i); }
void clear() { string_.clear(); };
void clear() { string_.clear(); }
QString CQersCall() const;
@@ -49,6 +63,8 @@ public:
bool isLowConfidence () const;
int frequencyOffset() const; // hertz offset from the tuned dial or rx frequency, aka audio frequency
int snr() const;
bool hasBits() const { return !string_.right(5).trimmed().isEmpty(); }
int bits() const { return string_.right(5).trimmed().toShort(); }
float dt() const;
// find and extract any report. Returns true if this is a standard message
@@ -75,6 +91,8 @@ private:
column_mode = 19,
column_qsoText = 22 };
QString compound_;
QStringList directed_;
QString string_;
int padding_;
bool contest_mode_;
+11
View File
@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=ft8call
Comment=Amateur Radio Weak Signal Operating
Exec=ft8call
Icon=wsjtx_icon
Terminal=false
X-MultipleArgs=false
Type=Application
Categories=AudioVideo;Audio;HamRadio;
StartupNotify=true
+6
View File
@@ -380,6 +380,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(i3bit.eq.1) decoded(57:)=0
call extractmessage174(decoded,message,ncrcflag)
decoded=decoded0
! This needs fixing for messages with i3bit=1:
call genft8(message,mygrid6,bcontest,i3bit,msgsent,msgbits,itone)
if(lsubtract) call subtractft8(dd0,itone,f1,xdt2)
@@ -397,6 +398,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(.not.nagain) xsnr=xsnr2
if(xsnr .lt. -24.0) xsnr=-24.0
if(i3bit.eq.1) then
do i=1,12
i1hiscall(i)=ichar(hiscall12(i:i))
@@ -432,6 +434,10 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
msg37=message//' '
endif
if(i3bit.gt.1) then
msg37(22:22) = char(48 + i3bit)
endif
return
endif
enddo
+3 -1
View File
@@ -423,7 +423,9 @@ subroutine packbits(dbits,nsymd,m0,sym)
itype=1
if(bcontest) then
call to_contest_msg(msg0,msg)
!call to_contest_msg(msg0,msg)
! this causes problems with freetext ala, KN4CRD DE KN4CRD -13 R
msg=msg0
else
msg=msg0
end if
+8 -2
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>377</width>
<height>257</height>
<width>600</width>
<height>285</height>
</rect>
</property>
<property name="sizePolicy">
@@ -16,6 +16,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>0</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QLabel" name="label">
+8 -3
View File
@@ -105,7 +105,8 @@ int main(int argc, char *argv[])
// that GUI has correct l18n
// Override programs executable basename as application name.
a.setApplicationName ("WSJT-X");
//a.setApplicationName ("WSJT-X");
a.setApplicationName("FT8Call");
a.setApplicationVersion (version ());
#if QT_VERSION >= 0x050200
@@ -259,7 +260,7 @@ int main(int argc, char *argv[])
multi_settings.set_common_value (splash_flag_name, false);
splash.close ();
});
splash.show ();
//splash.show ();
a.processEvents ();
}
}
@@ -295,8 +296,12 @@ int main(int argc, char *argv[])
mem_jt9.setKey(a.applicationName ());
if(!mem_jt9.attach()) {
std::cerr << QString("memory attach error: %1").arg(mem_jt9.error()).toLocal8Bit ().data () << std::endl;
if (!mem_jt9.create(sizeof(struct dec_data))) {
splash.hide ();
std::cerr << QString("memory create error: %1").arg(mem_jt9.error()).toLocal8Bit ().data () << std::endl;
MessageBox::critical_message (nullptr, a.translate ("main", "Shared memory error"),
a.translate ("main", "Unable to create shared memory segment"));
throw std::runtime_error {"Shared memory error"};
@@ -324,7 +329,7 @@ int main(int argc, char *argv[])
// run the application UI
MainWindow w(temp_dir, multiple, &multi_settings, &mem_jt9, downSampleFactor, &splash);
w.show();
splash.raise ();
//splash.raise ();
QObject::connect (&a, SIGNAL (lastWindowClosed()), &a, SLOT (quit()));
result = a.exec();
}
+2311 -50
View File
File diff suppressed because it is too large Load Diff
+164
View File
@@ -16,6 +16,7 @@
#include <QProgressDialog>
#include <QAbstractSocket>
#include <QHostAddress>
#include <QPair>
#include <QPointer>
#include <QSet>
#include <QVector>
@@ -37,6 +38,8 @@
#include "astro.h"
#include "MessageBox.hpp"
#include "NetworkAccessManager.hpp"
#include "qorderedmap.h"
#include "varicode.h"
#define NUM_JT4_SYMBOLS 206 //(72+31)*2, embedded sync
#define NUM_JT65_SYMBOLS 126 //63 data + 63 sync
@@ -113,10 +116,22 @@ public slots:
void readFromStdout();
void p1ReadFromStdout();
void setXIT(int n, Frequency base = 0u);
void setFreqForRestore(int freq, bool shouldRestore);
void setFreq4(int rxFreq, int txFreq);
void msgAvgDecode2();
void fastPick(int x0, int x1, int y);
QString lookupCallInCompoundCache(QString const &call);
void clearActivity();
int logRxTxMessageText(QDateTime date, QString text, int freq, bool tx, int block=-1);
void addMessageText(QString text, bool clear=false);
void resetMessage();
void resetMessageUI();
void restoreMessage();
void createMessage(QString const& text);
void createMessageTransmitQueue(QString const& text);
void resetMessageTransmitQueue();
QString popMessageFrame();
protected:
void keyPressEvent (QKeyEvent *) override;
void closeEvent(QCloseEvent *) override;
@@ -132,9 +147,13 @@ private slots:
void on_tx5_currentTextChanged (QString const&);
void on_tx6_editingFinished();
void on_actionSettings_triggered();
void preparePSKReporter();
void on_spotButton_clicked(bool checked);
void on_monitorButton_clicked (bool);
void on_actionAbout_triggered();
void on_autoButton_clicked (bool);
void on_labDialFreq_clicked();
void on_monitorTxButton_clicked();
void on_stopTxButton_clicked();
void on_stopButton_clicked();
void on_actionRelease_Notes_triggered ();
@@ -180,6 +199,10 @@ private slots:
void on_txb5_clicked();
void on_txb5_doubleClicked ();
void on_txb6_clicked();
void on_startTxButton_toggled(bool checked);
void toggleTx(bool start);
void splitAndSendNextMessage();
void on_rbNextFreeTextMsg_toggled (bool status);
void on_lookupButton_clicked();
void on_addButton_clicked();
void on_dxCallEntry_textChanged (QString const&);
@@ -201,8 +224,10 @@ private slots:
void on_actionErase_ALL_TXT_triggered();
void on_actionErase_FoxQSO_txt_triggered();
void on_actionErase_wsjtx_log_adi_triggered();
void startTx();
void startTx2();
void startP1();
void continueTx();
void stopTx();
void stopTx2();
void on_pbCallCQ_clicked();
@@ -213,12 +238,41 @@ private slots:
void on_pbSend73_clicked();
void on_rbGenMsg_clicked(bool checked);
void on_rbFreeText_clicked(bool checked);
void on_clearAction_triggered(QObject * sender);
void on_cqMacroButton_clicked();
void on_qtcMacroButton_clicked();
void on_qthMacroButton_clicked();
void buildQueryMenu(QMenu *);
void on_queryButton_pressed();
void on_macrosMacroButton_pressed();
void on_tableWidgetRXAll_cellClicked(int row, int col);
void on_tableWidgetRXAll_cellDoubleClicked(int row, int col);
void on_tableWidgetRXAll_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_tableWidgetCalls_cellClicked(int row, int col);
void on_tableWidgetCalls_cellDoubleClicked(int row, int col);
void on_tableWidgetCalls_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_freeTextMsg_currentTextChanged (QString const&);
void on_nextFreeTextMsg_currentTextChanged (QString const&);
void on_extFreeTextMsg_currentTextChanged (QString const&);
void on_extFreeTextMsgEdit_currentTextChanged (QString const&);
int currentFreq();
int countFT8MessageFrames(QString const& text);
QPair<QStringList, QStringList> buildFT8MessageFrames(QString const& text);
QString parseFT8Message(QString input, bool *isFree);
bool prepareNextMessageFrame();
bool isFreqOffsetFree(int f, int bw);
int findFreeFreqOffset(int fmin, int fmax, int bw);
void scheduleBacon(bool first=false);
void setBaconTimer(QDateTime timestamp);
void pauseBacon();
void prepareBacon();
QString calculateDistance(QString const& grid);
void on_rptSpinBox_valueChanged(int n);
void killFile();
void on_tuneButton_clicked (bool);
void on_pbR2T_clicked();
void on_pbT2R_clicked();
void on_beaconButton_clicked();
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
, Frequency dial_freq, QString const& mode
, QString const& rpt_sent, QString const& rpt_received
@@ -498,6 +552,7 @@ private:
}
m_QSOProgress;
int m_extFreeTxtPos;
int m_ihsym;
int m_nzap;
int m_npts8;
@@ -545,6 +600,7 @@ private:
QTimer minuteTimer;
QTimer splashTimer;
QTimer p1Timer;
QTimer beaconTimer;
QString m_path;
QString m_baseCall;
@@ -583,6 +639,65 @@ private:
qint32 ncall;
};
struct CallDetail
{
QString call;
QString through;
QString grid;
int freq;
QDateTime utcTimestamp;
int snr;
};
struct CommandDetail
{
QString from;
QString to;
QString cmd;
int freq;
QDateTime utcTimestamp;
int snr;
QString text;
};
struct ActivityDetail
{
bool isFree;
bool isLowConfidence;
bool isCompound;
int bits;
int freq;
QString text;
QDateTime utcTimestamp;
int snr;
};
struct MessageBuffer {
CommandDetail cmd;
QList<ActivityDetail> msgs;
};
bool m_rxDirty;
int m_txFrameCount;
QString m_lastTxMessage;
QDateTime m_lastTxTime;
QQueue<QString> m_txFrameQueue;
QQueue<ActivityDetail> m_rxFrameQueue;
QQueue<CommandDetail> m_rxCommandQueue;
QMap<QString, QString> m_compoundCallCache; // base callsign -> compound callsign
QCache<QString, QDateTime> m_txAllcallCommandCache; // callsign -> last tx
QCache<int, QDateTime> m_rxRecentCache; // freq -> last rx
QCache<int, QDateTime> m_rxDirectedCache; // freq -> last directed rx
QCache<QString, int> m_rxCallCache; // call -> last freq seen
QMap<int, int> m_rxFrameBlockNumbers; // freq -> block
QMap<int, QList<ActivityDetail>> m_bandActivity; // freq -> [(text, last timestamp), ...]
QMap<int, MessageBuffer> m_messageBuffer; // freq -> (cmd, [frames, ...])
QMap<QString, CallDetail> m_callActivity; // call -> (last freq, last timestamp)
QSet<QString> m_callSeenBeacon; // call
int m_previousFreq;
bool m_shouldRestoreFreq;
QMap<QString,FoxQSO> m_foxQSO;
QMap<QString,QString> m_loggedByFox;
@@ -591,6 +706,8 @@ private:
QQueue<QString> m_foxRR73Queue;
QQueue<qint64> m_foxRateQueue;
bool m_nextBeaconPaused = false;
QDateTime m_nextBeacon;
QDateTime m_dateTimeQSOOn;
QDateTime m_dateTimeLastTX;
@@ -646,6 +763,7 @@ private:
void rigFailure (QString const& reason);
void pskSetLocal ();
void pskPost(DecodedText const& decodedtext);
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
void displayDialFrequency ();
void transmitDisplay (bool);
void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0);
@@ -653,6 +771,14 @@ private:
void locationChange(QString const& location);
void replayDecodes ();
void postDecode (bool is_new, QString const& message);
void displayTransmit();
void updateButtonDisplay();
bool isMyCallIncluded(QString const &text);
bool isAllCallIncluded(QString const &text);
QString callsignSelected();
bool isRecentOffset(int offset);
bool isDirectedOffset(int offset);
void displayActivity(bool force=false);
void postWSPRDecode (bool is_new, QStringList message_parts);
void enable_DXCC_entity (bool on);
void switch_mode (Mode);
@@ -700,6 +826,44 @@ private:
void writeFoxQSO(QString msg);
};
class EscapeKeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Escape){
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
};
class EnterKeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return){
emit this->enterKeyPressed(keyEvent, obj);
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
public:
Q_SIGNAL void enterKeyPressed(QKeyEvent *evt, QObject *obj);
};
extern int killbyname(const char* progName);
extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
int minChan[], int maxChan[],
+2027 -375
View File
File diff suppressed because it is too large Load Diff
Executable
+3
View File
@@ -0,0 +1,3 @@
echo make
echo cp wsjtx ft8call
echo linuxdeployqt ./ft8call -appimage -bundle-non-qt-libs -no-strip -no-translations
+8 -4
View File
@@ -57,12 +57,14 @@ void MeterWidget::paintEvent (QPaintEvent * event)
auto const& target = contentsRect ();
QRect r {QPoint {target.left (), static_cast<int> (target.top () + target.height () - m_signal / (double)MAXDB * target.height ())}
, QPoint {target.right (), target.bottom ()}};
p.setBrush (QColor(85,170,85));
//p.setBrush (QColor(85,170,85));
p.setBrush (Qt::green);
if (m_sigPeak > 85) {
p.setBrush(Qt::red);
}
else if (m_noisePeak < 15) {
p.setBrush(QColor(232,81,0));
//p.setBrush(QColor(232,81,0));
p.setBrush(Qt::yellow);
}
p.drawRect (r);
@@ -70,9 +72,11 @@ void MeterWidget::paintEvent (QPaintEvent * event)
{
// Draw peak hold indicator
auto peak = static_cast<int> (target.top () + target.height () - m_noisePeak / (double)MAXDB * target.height ());
p.setBrush (Qt::black);
//p.setBrush (Qt::black);
p.setBrush (Qt::white);
p.translate (target.left (), peak);
p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
//p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
p.drawPolygon (QPolygon { { {target.width (), -4}, {target.width (), 4}, {0, 0} } });
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor
m_line {0},
m_fSample {12000},
m_nsps {6912},
m_Percent2DScreen {30}, //percent of screen used for 2D display
m_Percent2DScreen {0}, //percent of screen used for 2D display
m_Percent2DScreen0 {0},
m_rxFreq {1020},
m_txFreq {0},
+611
View File
@@ -0,0 +1,611 @@
#ifndef ORDEREDMAP_H
#define ORDEREDMAP_H
#include <QtGlobal>
#include <QHash>
#include <QLinkedList>
#include <QList>
#include <QPair>
template <typename Key> inline bool oMHashEqualToKey(const Key &key1, const Key &key2)
{
// Key type must provide '==' operator
return key1 == key2;
}
template <typename Ptr> inline bool oMHashEqualToKey(Ptr *key1, Ptr *key2)
{
Q_ASSERT(sizeof(quintptr) == sizeof(Ptr *));
return quintptr(key1) == quintptr(key2);
}
template <typename Ptr> inline bool oMHashEqualToKey(const Ptr *key1, const Ptr *key2)
{
Q_ASSERT(sizeof(quintptr) == sizeof(const Ptr *));
return quintptr(key1) == quintptr(key2);
}
template <typename Key, typename Value>
class OrderedMap
{
class OMHash;
typedef typename QLinkedList<Key>::iterator QllIterator;
typedef typename QLinkedList<Key>::const_iterator QllConstIterator;
typedef QPair<Value, QllIterator> OMHashValue;
typedef typename OMHash::iterator OMHashIterator;
typedef typename OMHash::const_iterator OMHashConstIterator;
public:
class iterator;
class const_iterator;
typedef typename OrderedMap<Key, Value>::iterator Iterator;
typedef typename OrderedMap<Key, Value>::const_iterator ConstIterator;
explicit OrderedMap();
OrderedMap(const OrderedMap<Key, Value>& other);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
OrderedMap(OrderedMap<Key, Value>&& other);
#endif
void clear();
bool contains(const Key &key) const;
int count() const;
bool empty() const;
iterator insert(const Key &key, const Value &value);
bool isEmpty() const;
QList<Key> keys() const;
int remove(const Key &key);
int size() const;
Value take(const Key &key);
Value value(const Key &key) const;
Value value(const Key &key, const Value &defaultValue) const;
QList<Value> values() const;
OrderedMap<Key, Value> & operator=(const OrderedMap<Key, Value>& other);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
OrderedMap<Key, Value> & operator=(OrderedMap<Key, Value>&& other);
#endif
bool operator==(const OrderedMap<Key, Value> &other) const;
bool operator!=(const OrderedMap<Key, Value> &other) const;
Value& operator[](const Key &key);
const Value operator[](const Key &key) const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
iterator erase(iterator pos);
iterator find(const Key& key);
const_iterator find(const Key& key) const;
class const_iterator;
class iterator
{
QllIterator qllIter;
OMHash *data;
friend class const_iterator;
friend class OrderedMap;
public:
iterator() : data(NULL) {}
iterator(const QllIterator &qllIter, OMHash *data) :
qllIter(qllIter), data(data) {}
const Key & key() const
{
return *qllIter;
}
Value & value() const
{
OMHashIterator hit = data->find(*qllIter);
OMHashValue &pair = hit.value();
return pair.first;
}
Value & operator*() const
{
return value();
}
iterator operator+(int i) const
{
QllIterator q = qllIter;
q += i;
return iterator(q, data);
}
iterator operator-(int i) const
{
return operator +(- i);
}
iterator& operator+=(int i)
{
qllIter += i;
return *this;
}
iterator& operator-=(int i)
{
qllIter -= i;
return *this;
}
iterator& operator++()
{
++qllIter;
return *this;
}
iterator operator++(int)
{
iterator it = *this;
qllIter++;
return it;
}
iterator operator--()
{
--qllIter;
return *this;
}
iterator operator--(int)
{
iterator it = *this;
qllIter--;
return it;
}
bool operator ==(const iterator &other) const
{
return (qllIter == other.qllIter);
}
bool operator !=(const iterator &other) const
{
return (qllIter != other.qllIter);
}
};
class const_iterator
{
QllConstIterator qllConstIter;
const OMHash *data;
public:
const_iterator() : data(NULL) {}
const_iterator(const iterator &i) :
qllConstIter(i.qllIter), data(i.data) {}
const_iterator(const QllConstIterator &qllConstIter, const OMHash* data) :
qllConstIter(qllConstIter), data(data) {}
const Key & key() const
{
return *qllConstIter;
}
const Value & value() const
{
OMHashConstIterator hit = data->find(*qllConstIter);
const OMHashValue &pair = hit.value();
return pair.first;
}
const Value & operator*() const
{
return value();
}
const_iterator operator+(int i) const
{
QllConstIterator q = qllConstIter;
q += i;
return const_iterator(q, data);
}
const_iterator operator-(int i) const
{
return operator +(- i);
}
const_iterator& operator+=(int i)
{
qllConstIter += i;
return *this;
}
const_iterator& operator-=(int i)
{
qllConstIter -= i;
return *this;
}
const_iterator& operator++()
{
++qllConstIter;
return *this;
}
const_iterator operator++(int)
{
const_iterator it = *this;
qllConstIter++;
return it;
}
const_iterator operator--()
{
--qllConstIter;
return *this;
}
const_iterator operator--(int)
{
const_iterator it = *this;
qllConstIter--;
return it;
}
bool operator ==(const const_iterator &other) const
{
return (qllConstIter == other.qllConstIter);
}
bool operator !=(const const_iterator &other) const
{
return (qllConstIter != other.qllConstIter);
}
};
private:
class OMHash : public QHash<Key, OMHashValue >
{
public:
bool operator == (const OMHash &other) const
{
if (size() != other.size()) {
return false;
}
if (QHash<Key, OMHashValue >::operator ==(other)) {
return true;
}
typename QHash<Key, OMHashValue >::const_iterator it1 = this->constBegin();
typename QHash<Key, OMHashValue >::const_iterator it2 = other.constBegin();
while(it1 != this->end()) {
OMHashValue v1 = it1.value();
OMHashValue v2 = it2.value();
if ((v1.first != v2.first) || !oMHashEqualToKey<Key>(it1.key(), it2.key())) {
return false;
}
++it1;
++it2;
}
return true;
}
};
private:
void copy(const OrderedMap<Key, Value> &other);
OMHash data;
QLinkedList<Key> insertOrder;
};
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap() {}
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap(const OrderedMap<Key, Value>& other)
{
copy(other);
}
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap(OrderedMap<Key, Value>&& other)
{
data = std::move(other.data);
insertOrder = std::move(other.insertOrder);
}
#endif
template <typename Key, typename Value>
void OrderedMap<Key, Value>::clear()
{
data.clear();
insertOrder.clear();
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::contains(const Key &key) const
{
return data.contains(key);
}
template <typename Key, typename Value>
int OrderedMap<Key, Value>::count() const
{
return data.count();
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::empty() const
{
return data.empty();
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::insert(const Key &key, const Value &value)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
// New key
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
OMHashValue pair(value, ioIter);
data.insert(key, pair);
return iterator(ioIter, &data);
}
OMHashValue pair = it.value();
// remove old reference
insertOrder.erase(pair.second);
// Add new reference
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
pair.first = value;
pair.second = ioIter;
return iterator(ioIter, &data);
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::isEmpty() const
{
return data.isEmpty();
}
template<typename Key, typename Value>
QList<Key> OrderedMap<Key, Value>::keys() const
{
return QList<Key>::fromStdList(insertOrder.toStdList());
}
template<typename Key, typename Value>
int OrderedMap<Key, Value>::remove(const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
return 0;
}
OMHashValue pair = it.value();
insertOrder.erase(pair.second);
data.erase(it);
return 1;
}
template<typename Key, typename Value>
int OrderedMap<Key, Value>::size() const
{
return data.size();
}
template<typename Key, typename Value>
void OrderedMap<Key, Value>::copy(const OrderedMap<Key, Value> &other)
{
/* Since I'm storing iterators of QLinkedList, I simply cannot make
* a trivial copy of the linked list. This is a limitation due to implicit
* sharing used in Qt containers, due to which iterator active on one
* QLL can change the data of another QLL even after creating a copy.
*
* Because of this, the old iterators have to be invalidated and new ones
* have to be generated.
*/
insertOrder.clear();
// Copy hash
data = other.data;
QllConstIterator cit = other.insertOrder.begin();
for (; cit != other.insertOrder.end(); ++cit) {
Key key = *cit;
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
OMHashIterator it = data.find(key);
(*it).second = ioIter;
}
}
template<typename Key, typename Value>
Value OrderedMap<Key, Value>::take(const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
return Value();
}
OMHashValue pair = it.value();
insertOrder.erase(pair.second);
data.erase(it);
return pair.first;
}
template <typename Key, typename Value>
Value OrderedMap<Key, Value>::value(const Key &key) const
{
return data.value(key).first;
}
template <typename Key, typename Value>
Value OrderedMap<Key, Value>::value(const Key &key, const Value &defaultValue) const
{
OMHashConstIterator it = data.constFind(key);
if (it == data.end()) {
return defaultValue;
}
OMHashValue pair = it.value();
return pair.first;
}
template <typename Key, typename Value>
QList<Value> OrderedMap<Key, Value>::values() const
{
QList<Value> values;
foreach (const Key &key, insertOrder.toStdList()) {
OMHashValue v = data.value(key);
values.append(v.first);
}
return values;
}
template <typename Key, typename Value>
OrderedMap<Key, Value> & OrderedMap<Key, Value>::operator=(const OrderedMap<Key, Value>& other)
{
if (this != &other) {
copy(other);
}
return *this;
}
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
template <typename Key, typename Value>
OrderedMap<Key, Value> & OrderedMap<Key, Value>::operator=(OrderedMap<Key, Value>&& other)
{
if (this != &other) {
data = other.data;
insertOrder = other.insertOrder;
}
return *this;
}
#endif
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::operator==(const OrderedMap<Key, Value> &other) const
{
// 2 Ordered maps are equal if they have the same contents in the same order
return ((data == other.data) && (insertOrder == other.insertOrder));
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::operator!=(const OrderedMap<Key, Value> &other) const
{
return ((data != other.data) || (insertOrder != other.insertOrder));
}
template <typename Key, typename Value>
Value& OrderedMap<Key, Value>::operator[](const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
insert(key, Value());
it = data.find(key);
}
OMHashValue &pair = it.value();
return pair.first;
}
template <typename Key, typename Value>
const Value OrderedMap<Key, Value>::operator[](const Key &key) const
{
return value(key);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::begin()
{
return iterator(insertOrder.begin(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::begin() const
{
return const_iterator(insertOrder.begin(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::end()
{
return iterator(insertOrder.end(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::end() const
{
return const_iterator(insertOrder.end(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::erase(iterator pos)
{
OMHashIterator hit = data.find(*(pos.qllIter));
if (hit == data.end()) {
return pos;
}
data.erase(hit);
QllIterator ioIter = insertOrder.erase(pos.qllIter);
return iterator(ioIter, &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::find(const Key& key)
{
OMHashIterator hit = data.find(key);
if (hit == data.end()) {
return end();
}
return iterator(hit.value().second, &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::find(const Key& key) const
{
OMHashConstIterator hit = data.find(key);
if (hit == data.end()) {
return end();
}
return const_iterator(hit.value().second, &data);
}
#endif // ORDEREDMAP_H
+253
View File
@@ -0,0 +1,253 @@
/****************************************************************************
**
** Copyright (C) 2015 Corentin Chary <corentin.chary@gmail.cm>
**
** This file could be part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QPRIORITY_QUEUE_H
#define QPRIORITY_QUEUE_H
#include <QtCore/qalgorithms.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Core)
template <class T> class QList;
#ifndef QT_NO_STL
#include <queue>
#include <vector>
#else
/* Fallback class used when stl is not available */
template <class T, typename LessThan = qLess < T > >
class QPriorityQueuePrivate {
public:
inline QPriorityQueuePrivate(LessThan l) : lessThan(l), d() {}
inline ~QPriorityQueuePrivate() {}
inline void clear() { return d.clear(); }
inline int size() const { return d.size(); }
inline bool empty() const { return d.empty(); }
inline T &top() { return d.front(); }
void pop();
void push(const T &value);
private:
inline int parent(int i) {
return (i - 1) / 2;
}
inline int leftChild(int i) {
return 2 * i + 1;
}
inline int rightChild(int i) {
return 2 * i + 2;
}
LessThan lessThan;
QList < T > d;
};
#endif
template <class T, typename LessThan = qLess < T > >
class Q_CORE_EXPORT QPriorityQueue
{
public:
inline QPriorityQueue(LessThan l = qLess < T >())
: lessThan(l), d(lessThan) { }
inline QPriorityQueue(const QPriorityQueue<T> &q)
: lessThan(q.lessThan), d(q.d) { }
inline ~QPriorityQueue() { }
QPriorityQueue<T> &operator=(const QPriorityQueue<T> &q) {
d = q.d; return *this;
}
inline int size() const { return d.size(); }
inline bool isEmpty() const { return empty(); }
// like qlist
void clear();
void append(const T &t) { return enqueue(t); }
void append(const QList<T> &t);
T takeFirst() { return dequeue(); }
inline int length() const { return size(); } // Same as count()
inline T& first() { return head(); }
inline const T& first() const { return head(); }
inline void removeFirst() { pop(); }
inline bool startsWith(const T &t) const
{ return !isEmpty() && first() == t; }
// like qqueue
inline void enqueue(const T &t) { push(t); }
inline T dequeue() { T t = d.top(); d.pop(); return t; }
inline T &head() { top(); }
inline const T &head() const { top(); }
// stl compatibility
typedef int size_type;
typedef T value_type;
inline bool empty() const { return d.empty(); }
inline const value_type& top() { Q_ASSERT(!isEmpty()); return d.top(); }
inline void push(const value_type& x) { return d.push(x); }
inline void pop() { Q_ASSERT(!isEmpty()); d.pop(); }
// comfort
inline QPriorityQueue<T> &operator+=(const T &t) {
enqueue(t); return *this;
}
inline QPriorityQueue<T> &operator<< (const T &t) {
enqueue(t); return *this;
}
inline QPriorityQueue<T> &operator>> (T &t) {
t = d.top(); d.pop(); return *this;
}
#ifndef QT_NO_STL
static inline QPriorityQueue<T>fromStdPriorityQueue(
const std::priority_queue<T> &q) {
QPriorityQueue<T> tmp; tmp.d = q; return tmp;
}
inline std::priority_queue<T> toStdPriorityQueue() const {
return d;
}
#endif
private:
LessThan lessThan;
#ifndef QT_NO_STL
std::priority_queue <T, std::vector < T >, LessThan> d;
#else
QPriorityQueuePrivate <T> d;
#endif
};
#ifndef QT_NO_STL
template <typename T, typename LessThan>
Q_INLINE_TEMPLATE void QPriorityQueue<T, LessThan>::clear()
{
d = std::priority_queue<T>(lessThan);
}
#else
template <typename T, typename LessThan>
Q_INLINE_TEMPLATE void QPriorityQueue<T, LessThan>::clear()
{
d.clear();
}
#endif
template <typename T, typename LessThan>
Q_OUTOFLINE_TEMPLATE void QPriorityQueue<T, LessThan>::append(const QList<T> &t)
{
foreach (T & e, t)
push(e);
}
// Re-implement std::priority_queue if STL not available, probably
// less efficient.
#ifdef QT_NO_STL
/*!
* Pop an element from the queue and reorder it using an
* inlined binary heap.
*
* \internal
*/
template <typename T, typename LessThan>
Q_OUTOFLINE_TEMPLATE void QPriorityQueuePrivate<T, LessThan>::pop()
{
int i = 0;
ssize_t size = d.size();;
if(!size)
return;
if(size == 1)
return d.clear();
d[0] = d.takeLast();
while(i < size - 1) {
int left = leftChild(i);
int right = rightChild(i);
bool validLeft = left < size;
bool validRight = right < size;
if(validLeft && lessThan(d.at(i), d.at(left)))
if(validRight && !lessThan(d.at(right), d.at(left))) {
d.swap(i, right);
i = right;
} else {
d.swap(i, left);
i = left;
}
else if(validRight && lessThan(d.at(i), d.at(right))) {
d.swap(i, right);
i = right;
}
else
break;
}
}
/*!
* Push an element with a given priority to the right place.
*
* \internal
*/
template <typename T, typename LessThan>
Q_OUTOFLINE_TEMPLATE void QPriorityQueuePrivate<T, LessThan>::push(const T &value)
{
int i = d.size();
d.append(value);
while(i != 0 && !lessThan(d.at(i), d.at(parent(i)))) {
d.swap(i, parent(i));
i = parent(i);
}
}
#endif
QT_END_NAMESPACE
QT_END_HEADER
#endif // QPRIORITY_QUEUE_H
+6 -56
View File
@@ -5,62 +5,9 @@
#include <QCoreApplication>
#include <QRegularExpression>
#include "svnversion.h"
namespace
{
QString revision_extract_number (QString const& s)
{
QString revision;
// try and match a number
QRegularExpression re {R"(^[$:]\w+: (\d+[^$]*)\$$)"};
auto match = re.match (s);
if (match.hasMatch ())
{
revision = 'r' + match.captured (1);
}
return revision;
}
}
QString revision (QString const& svn_rev_string)
{
QString result;
auto revision_from_svn = revision_extract_number (svn_rev_string);
#if defined (CMAKE_BUILD)
QString svn_info {":Rev: " WSJTX_STRINGIZE (SVNVERSION) " $"};
auto revision_from_svn_info = revision_extract_number (svn_info);
if (!revision_from_svn_info.isEmpty ())
{
// we managed to get the revision number from svn info etc.
result = revision_from_svn_info;
}
else if (!revision_from_svn.isEmpty ())
{
// fall back to revision passed in if any
result = revision_from_svn;
}
else
{
// match anything
QRegularExpression re {R"(^[$:]\w+: ([^$]*)\$$)"};
auto match = re.match (svn_info);
if (match.hasMatch ())
{
result = match.captured (1);
}
}
#else
if (!revision_from_svn.isEmpty ())
{
// not CMake build so all we have is revision passed
result = revision_from_svn;
}
#endif
return result.trimmed ();
return "";
}
QString version (bool include_patch)
@@ -70,19 +17,22 @@ QString version (bool include_patch)
if (include_patch)
{
v += "." WSJTX_STRINGIZE (WSJTX_VERSION_PATCH)
#if 0
# if defined (WSJTX_RC)
+ "-rc" WSJTX_STRINGIZE (WSJTX_RC)
# endif
#endif
;
}
#else
QString v {"Not for Release"};
#endif
return v;
}
QString program_title (QString const& revision)
{
QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()};
return id + " " + revision + " by K1JT";
QString id {"FT8Call de KN4CRD (v%1) a derivative of WSJT-X by K1JT"};
return id.arg(QCoreApplication::applicationVersion ());
}
+8 -1
View File
@@ -44,6 +44,7 @@ protected:
QWidget::paintEvent (event);
QPainter p {this};
p.setPen(Qt::white);
auto const& target = contentsRect ();
QFontMetrics font_metrics {p.font (), this};
auto font_offset = font_metrics.ascent () / 2;
@@ -82,12 +83,18 @@ SignalMeter::SignalMeter (QWidget * parent)
m_meter = new MeterWidget;
m_meter->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Minimum);
inner_layout->addWidget (m_meter);
//inner_layout->addWidget (m_meter);
m_scale = new Scale;
inner_layout->addWidget (m_scale);
// add this second...
inner_layout->addWidget (m_meter);
m_reading = new QLabel(this);
auto p = m_reading->palette();
p.setColor(m_reading->foregroundRole(), Qt::white);
m_reading->setPalette(p);
outer_layout->addLayout (inner_layout);
outer_layout->addWidget (m_reading);
+1117
View File
File diff suppressed because it is too large Load Diff
+99
View File
@@ -0,0 +1,99 @@
#ifndef VARICODE_H
#define VARICODE_H
/**
* (C) 2018 Jordan Sherer <kn4crd@gmail.com> - All Rights Reserved
**/
#include <QBitArray>
#include <QRegularExpression>
#include <QRegExp>
#include <QString>
#include <QVector>
class Varicode
{
public:
enum FrameType{
FT8 = 0, // [000]
FT8Fox = 1, // [001]
FT8Call = 2, // [010]
FT8CallLast = 3, // [011] <- used to indicate last frame in transmission
FT8CallReservedA = 4, // [100]
FT8CallReservedB = 5, // [101]
FT8CallReservedC = 6, // [110]
FT8CallReservedD = 7, // [111]
};
//Varicode();
static QString formatSNR(int snr);
static QString formatPWR(int dbm);
static QString checksum16(QString const &input);
static bool checksum16Valid(QString const &checksum, QString const &input);
static QString checksum32(QString const &input);
static bool checksum32Valid(QString const &checksum, QString const &input);
static QStringList parseCallsigns(QString const &input);
static QStringList parseGrids(QString const &input);
static QList<QVector<bool>> huffEncode(const QMap<QChar, QString> &huff, QString const& text);
static QString huffDecode(const QMap<QChar, QString> &huff, QVector<bool> const& bitvec, int pad=0);
static QString huffUnescape(QString const &input);
static QString huffEscape(QString const &input);
static QSet<QChar> huffValidChars();
static bool huffShouldEscape(QString const &input);
static QVector<bool> bytesToBits(char * bitvec, int n);
static QVector<bool> strToBits(QString const& bitvec);
static QString bitsToStr(QVector<bool> const& bitvec);
static QVector<bool> intToBits(quint64 value, int expected=0);
static quint64 bitsToInt(QVector<bool> const value);
static quint64 bitsToInt(QVector<bool>::ConstIterator start, int n);
static QVector<bool> bitsListToBits(QList<QVector<bool>> &list);
static quint8 unpack5bits(QString const& value);
static QString pack5bits(quint8 packed);
static quint8 unpack6bits(QString const& value);
static QString pack6bits(quint8 packed);
static quint16 unpack16bits(QString const& value);
static QString pack16bits(quint16 packed);
static quint32 unpack32bits(QString const& value);
static QString pack32bits(quint32 packed);
static quint64 unpack64bits(QString const& value);
static QString pack64bits(quint64 packed);
static quint32 packCallsignPrefixSuffix(QString const& value);
static QString unpackCallsignPrefixSuffix(quint32 packed);
static quint32 packCallsign(QString const& value);
static QString unpackCallsign(quint32 value);
static quint16 packGrid(QString const& value);
static QString unpackGrid(quint16 value);
static bool isCommandAllowed(const QString &cmd);
static bool isCommandBuffered(const QString &cmd);
static QString packBeaconMessage(QString const &callsign, QString const &extra, bool isCQ);
static QStringList unpackBeaconMessage(const QString &text, bool *isCQ);
static QString packCompoundMessage(const QString &baseCallsign, const QString &fix, bool isPrefix, quint16 num);
static QStringList unpackCompoundMessage(const QString &text, quint16 *pNum);
static QString packDirectedMessage(QString const& text, QString const& callsign, QString * pCmd, int *n);
static QStringList unpackDirectedMessage(QString const& text);
static QString packDataMessage(QString const& text, QString *out, int *n);
static QString unpackDataMessage(QString const& text);
};
#endif // VARICODE_H
+6 -5
View File
@@ -64,8 +64,8 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
ui->bppSpinBox->setValue(n);
m_nsmo=m_settings->value("SmoothYellow",1).toInt();
ui->smoSpinBox->setValue(m_nsmo);
m_Percent2DScreen=m_settings->value("Percent2D",30).toInt();
m_waterfallAvg = m_settings->value("WaterfallAvg",5).toInt();
m_Percent2DScreen=m_settings->value("Percent2D", 0).toInt();
m_waterfallAvg = m_settings->value("WaterfallAvg", 1).toInt();
ui->waterfallAvgSpinBox->setValue(m_waterfallAvg);
ui->widePlot->setWaterfallAvg(m_waterfallAvg);
ui->widePlot->setCurrent(m_settings->value("Current",false).toBool());
@@ -76,17 +76,18 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
if(ui->widePlot->cumulative()) ui->spec2dComboBox->setCurrentIndex(1);
if(ui->widePlot->linearAvg()) ui->spec2dComboBox->setCurrentIndex(2);
if(ui->widePlot->Reference()) ui->spec2dComboBox->setCurrentIndex(3);
int nbpp=m_settings->value("BinsPerPixel",2).toInt();
int nbpp=m_settings->value("BinsPerPixel", 4).toInt();
ui->widePlot->setBinsPerPixel(nbpp);
ui->sbPercent2dPlot->setValue(m_Percent2DScreen);
ui->widePlot->SetPercent2DScreen(m_Percent2DScreen);
ui->widePlot->setStartFreq(m_settings->value("StartFreq",0).toInt());
ui->fStartSpinBox->setValue(ui->widePlot->startFreq());
m_waterfallPalette=m_settings->value("WaterfallPalette","Default").toString();
m_userPalette = WFPalette {m_settings->value("UserPalette").value<WFPalette::Colours> ()};
m_fMinPerBand = m_settings->value ("FminPerBand").toHash ();
setRxRange ();
ui->controls_widget->setVisible(!m_settings->value("HideControls",false).toBool());
ui->cbControls->setChecked(!m_settings->value("HideControls",false).toBool());
ui->controls_widget->setVisible(!m_settings->value("HideControls", true).toBool());
ui->cbControls->setChecked(!m_settings->value("HideControls", true).toBool());
}
int index=0;
+4 -4
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<width>942</width>
<height>337</height>
</rect>
</property>
@@ -68,7 +68,7 @@
<string>Controls</string>
</property>
<property name="checked">
<bool>true</bool>
<bool>false</bool>
</property>
</widget>
</widget>
@@ -219,7 +219,7 @@
<number>5</number>
</property>
<property name="value">
<number>30</number>
<number>0</number>
</property>
</widget>
</item>
@@ -293,7 +293,7 @@
<number>1</number>
</property>
<property name="value">
<number>2</number>
<number>5</number>
</property>
</widget>
</item>
+7 -2
View File
@@ -67,7 +67,8 @@ SOURCES += \
echoplot.cpp echograph.cpp fastgraph.cpp fastplot.cpp Modes.cpp \
WSPRBandHopping.cpp MessageAggregator.cpp SampleDownloader.cpp qt_helpers.cpp\
MultiSettings.cpp PhaseEqualizationDialog.cpp IARURegions.cpp MessageBox.cpp \
EqualizationToolsDialog.cpp
EqualizationToolsDialog.cpp \
varicode.cpp
HEADERS += qt_helpers.hpp \
pimpl_h.hpp pimpl_impl.hpp \
@@ -83,7 +84,11 @@ HEADERS += qt_helpers.hpp \
logbook/logbook.h logbook/countrydat.h logbook/countriesworked.h logbook/adif.h \
messageaveraging.h echoplot.h echograph.h fastgraph.h fastplot.h Modes.hpp WSPRBandHopping.hpp \
WsprTxScheduler.h SampleDownloader.hpp MultiSettings.hpp PhaseEqualizationDialog.hpp \
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp \
qorderedmap.h \
varicode.h \
qpriorityqueue.h \
crc.h
INCLUDEPATH += qmake_only
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2018-02-02T18:34:55. -->
<!-- Written by QtCreator 3.5.1, 2018-03-10T16:32:07. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>