├── .github ├── auto_assign.yml ├── renovate.json └── workflows │ └── assign_pr.yml ├── .gitignore ├── LICENSE ├── README.md ├── SECURITY.md ├── adif.proto ├── demo ├── README.md ├── adif_pb2.py ├── demo.py └── requirements.txt ├── go ├── README.md ├── adif.pb.go ├── go.mod └── go.sum ├── js ├── README.md ├── adif_pb.d.ts ├── adif_pb.js ├── package-lock.json └── package.json ├── jsonschema ├── Adif.json ├── ContestData.json ├── Credit.json ├── Header.json ├── Propagation.json ├── Qsl.json ├── Qso.json ├── Station.json └── Upload.json └── regenerate.sh /.github/auto_assign.yml: -------------------------------------------------------------------------------- 1 | # Set to true to add reviewers to pull requests 2 | addReviewers: true 3 | 4 | # Set to true to add assignees to pull requests 5 | addAssignees: author 6 | 7 | # A list of reviewers to be added to pull requests (GitHub user name) 8 | reviewers: 9 | - xylo04 10 | 11 | # A number of reviewers added to the pull request 12 | # Set 0 to add all the reviewers (default: 0) 13 | numberOfReviewers: 0 14 | # A list of assignees, overrides reviewers if set 15 | # assignees: 16 | # - assigneeA 17 | 18 | # A number of assignees to add to the pull request 19 | # Set to 0 to add all of the assignees. 20 | # Uses numberOfReviewers if unset. 21 | # numberOfAssignees: 2 22 | 23 | # A list of keywords to be skipped the process that add reviewers if pull requests include it 24 | # skipKeywords: 25 | # - wip 26 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | ":separateMajorReleases", 4 | ":combinePatchMinorReleases", 5 | ":ignoreUnstable", 6 | ":prImmediately", 7 | ":semanticPrefixFixDepsChoreOthers", 8 | ":automergeDisabled", 9 | ":ignoreModulesAndTests", 10 | ":autodetectPinVersions", 11 | ":prHourlyLimit2", 12 | ":prConcurrentLimit20", 13 | "group:monorepos", 14 | "group:recommended", 15 | "helpers:disableTypesNodeMajor" 16 | ], 17 | "schedule": ["after 3am and before 7am on Tuesday"], 18 | "timezone": "America/Denver", 19 | "packageRules": [ 20 | { 21 | "matchUpdateTypes": ["patch", "pin", "digest"], 22 | "automerge": true 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/assign_pr.yml: -------------------------------------------------------------------------------- 1 | name: 'Auto Assign' 2 | on: 3 | pull_request: 4 | types: [opened, ready_for_review] 5 | 6 | jobs: 7 | add-reviewers: 8 | uses: k0swe/.github/.github/workflows/assign_pr.yml@main 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | demo/__pycache__/ 3 | /js/node_modules/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2020 Chris Keller 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ADIF protocol buffer and JSON schema 2 | 3 | This repository is an unofficial extension to the [ADIF](https://www.adif.org/) amateur radio data 4 | interchange specification. 5 | 6 | 7 | 8 | 48 | 99 |
ADIFJSON
  9 | <band:3>20m
 10 | <call:4>KK9A
 11 | <cnty:12>NC, Cabarrus
 12 | <cont:2>NA
 13 | <contest_id:10>CQ-WPX-SSB
 14 | <country:13>United States
 15 | <dxcc:3>291
 16 | <freq:6>14.282
 17 | <gridsquare:6>EM95re
 18 | <lotw_qsl_rcvd:1>Y
 19 | <lotw_qsl_sent:1>Y
 20 | <lotw_qslrdate:8>20200402
 21 | <lotw_qslsdate:8>20200406
 22 | <mode:3>SSB
 23 | <my_city:11>Westminster
 24 | <my_cnty:13>CO, Jefferson
 25 | <my_country:13>United States
 26 | <my_gridsquare:6>DM79lv
 27 | <my_name:20>Christopher C Keller
 28 | <my_state:2>CO
 29 | <name:12>JOHN P BAYNE
 30 | <qrzcom_qso_upload_date:8>20200329
 31 | <qrzcom_qso_upload_status:1>Y
 32 | <qsl_via:6>WD9DZV
 33 | <qso_date:8>20200329
 34 | <qso_date_off:8>20200329
 35 | <qth:7>MIDLAND
 36 | <rst_rcvd:2>59
 37 | <rst_sent:2>59
 38 | <srx:4>1592
 39 | <state:2>NC
 40 | <station_callsign:5>K0SWE
 41 | <stx:1>1
 42 | <time_off:4>0034
 43 | <time_on:4>0034
 44 | <tx_pwr:3>100
 45 | <eor>
 46 | 
47 |
49 | 50 | ``` 51 | { 52 | "loggingStation": { 53 | "stationCall": "K0SWE", 54 | "opName": "Christopher C Keller", 55 | "gridSquare": "DM79lv", 56 | "power": 100.0, 57 | "city": "Westminster", 58 | "county": "CO, Jefferson", 59 | "state": "CO", 60 | "country": "United States", 61 | }, 62 | "contactedStation": { 63 | "stationCall": "KK9A", 64 | "opName": "JOHN P BAYNE", 65 | "gridSquare": "EM95re", 66 | "qslVia": "WD9DZV", 67 | "city": "MIDLAND", 68 | "county": "NC, Cabarrus", 69 | "state": "NC", 70 | "country": "United States", 71 | "dxcc": 291, 72 | "continent": "NA", 73 | }, 74 | "band": "20m", 75 | "freq": 14.282, 76 | "mode": "SSB", 77 | "timeOn": "2020-03-29T00:34:00Z", 78 | "timeOff": "2020-03-29T00:34:00Z", 79 | "rstReceived": "59", 80 | "rstSent": "59", 81 | "contest": { 82 | "contestId": "CQ-WPX-SSB", 83 | "serialSent": "1", 84 | "serialReceived": "1592" 85 | }, 86 | "qrzcom": { 87 | "uploadDate": "2020-03-29T00:00:00Z", 88 | "uploadStatus": "UPLOAD_COMPLETE" 89 | }, 90 | "lotw": { 91 | "sentDate": "2020-04-06T00:00:00Z", 92 | "sentStatus": "Y", 93 | "receivedDate": "2020-04-02T00:00:00Z", 94 | "receivedStatus": "Y" 95 | }, 96 | }, 97 | ``` 98 |
100 | 101 | ## Background 102 | 103 | ADIF is popular among the amateur radio community for transmitting and exchanging information about 104 | on-air contacts, a.k.a. QSOs. It was conceived in 1996 and has evolved over the years in mostly 105 | backward-compatible ways. 106 | 107 | The wire format of the protocol is a bespoke ASCII format based on tags with field width indicators. 108 | While simple to parse, the unique encoding prevents the use of many modern protocol handling tools, 109 | which slows development effort on more modern amateur radio contact logging software. In addition, 110 | ADIF's reliance on ASCII and inability to be modernized for UTF-8 is an eyesore to anyone with 111 | diacritics in their name or location. An extension called ADX attempted to encode ADIF data in XML, 112 | but ADX has not been widely adopted. I speculate this is because ADIF was considered good enough and 113 | ADX didn't add value, but another complaint among developers is that ADX failed to follow XML best 114 | practices. Notably, [it does not respect XML namespaces][1], breaking extensibility. Without wide 115 | adoption from developers, users have had no motivation to entrust their data to ADX. Even if they 116 | cared about an arguably superior wire format, the fear of incompatibility would have discouraged 117 | users from using it. 118 | 119 | [1]: http://tlfabian.blogspot.com/2016/07/musings-on-adif-file-format.html 120 | 121 | ## Why update ADIF? 122 | 123 | ADIF has served the amateur radio community well for several decades. It's the *lingua franca* of 124 | ham logging software and will continue to be for a long time. Even software written against newer 125 | interchange formats will need to speak ADIF for the forseeable future. However, the format is 126 | showing its age and does not mesh well with international user bases, or modern software 127 | development practices and toolchains. Most programming languages now have mature libraries for 128 | handling UTF-8 and JSON data transparently without having to write any custom parsing logic. XML 129 | libraries are similarly widely available, but as noted, most people have already abandoned ADX, and 130 | XML's heyday has passed. 131 | 132 | Beyond just tooling improvements, I assert that semantic improvements can be made to ADIF. Rather 133 | than representing a QSO as a flat set of 153 key/value pairs (some of which have further internal 134 | structure), this is an opportunity to improve the intelligibility of the format for both humans and 135 | computers through nested data types. 136 | 137 | ## Why JSON? Why protobuf? 138 | 139 | Selecting [JSON](https://www.json.org/) as a wire format is an easy choice in today's web-centric 140 | technology space. As RESTful APIs have become the norm for exchanging information between 141 | internet-connected services and their clients, JSON has become the *de facto* standard for these 142 | APIs. [JSON Schema](https://json-schema.org/) is less widely adopted, but it's a convenient way to 143 | formalize the document structure and provide a bootstrap for basic validation in many programming 144 | languages. In this repository, the JSON Schema is derived from the protocol buffer schema. 145 | 146 | I've chosen [protocol buffers](https://developers.google.com/protocol-buffers) as the primary schema 147 | representation because: 148 | 149 | 1. Protobuf is a relatively simple and intuitive schema to read even for the unfamiliar. 150 | 1. Protobuf is programming language neutral and can generate data structures and parsers in many 151 | languages. 152 | 1. Protobuf has a well-defined JSON transformation which eases using JSON as a public wire format. 153 | 1. Protobuf is specifically designed to have a compact and efficient binary wire format, which makes 154 | it simple and fast to share information between components of the same service in e.g. 155 | remote procedure calls (RPCs). 156 | 1. Protobuf messages are extensible which will allow for the inclusion of ADIF's user-defined 157 | fields. 158 | 159 | There are other good data serialization formats with IDLs out there that could do the job like 160 | Apache Thrift or Amazon Ion, but I happen to know protobuf. 161 | 162 | ## Which ADIF fields are included? 163 | 164 | Most of the fields from the ADIF 3.1.1 specification are present in this schema. I did not include 165 | the `INTL` fields because both protobuf and JSON explicitly support UTF-8 strings, making the `INTL` 166 | fields redundant. I did not include deprecated fields. Finally, I omitted `SRX` and `TRX` with the 167 | assertion that all contest serial numbers be stored as strings. You weren't going to do arithmetic 168 | with those serial numbers, and this is simpler for everyone, if marginally less storage efficient. 169 | 170 | Date/times are represented by specialized data types, which means ADIF's `QSO_DATE` is combined with 171 | `TIME_ON`, and similarly `QSO_DATE_OFF` with `TIME_OFF`. 172 | 173 | I have not included most of ADIF's enumerations. Programs using this schema should still respect 174 | those enumerations, but putting those into a codified schema makes it prohibitively difficult to 175 | accommodate e.g. new political boundaries and new operating modes. 176 | 177 | ## Should I use it? 178 | 179 | This is an unofficial extension of ADIF and does not yet have any community support, which is 180 | critical to an interchange format. This is a proposal meant to stimulate a discussion, and I'll use 181 | it internally in my own logging application. 182 | 183 | I don't really expect that protocol buffers will become a popular way for end users to store their 184 | data on disk or even for developers of software to support importing or exporting binary protobufs. 185 | 186 | Perhaps desktop logging software might start using JSON as a disk file format; JSON is both highly 187 | human-readable and highly machine-parsable. However, I think that's questionable for the same reason 188 | that ADX failed; ADIF is good enough and already ubiquitous. 189 | 190 | What I do hope is that amateur radio internet logging services exposing RESTful APIs will consider 191 | using this schema for JSON structure rather than classic ADIF, and that developers find this schema 192 | useful as an internal data representation. 193 | 194 | ## Field mapping 195 | 196 | ADIF QSO field | Protobuf Qso field 197 | ------- | ------ 198 | `A_INDEX` | `propagation.a_index` 199 | `ADDRESS` | `contacted_station.address` 200 | `ADDRESS_INTL` | (obsolete) 201 | `AGE` | `contacted_station.age` 202 | `ANT_AZ` | `logging_station.antenna_azimuth` 203 | `ANT_EL` | `logging_station.antenna_elevation` 204 | `ANT_PATH` | `propagation.ant_path` 205 | `ARRL_SECT` | `contest.arrl_section` 206 | `AWARD_GRANTED` | `award_granted[]` 207 | `AWARD_SUBMITTED` | `award_submitted[]` 208 | `BAND` | `band` 209 | `BAND_RX` | `band_rx` 210 | `CALL` | `contacted_station.station_call` 211 | `CHECK` | `contest.check` 212 | `CLASS` | `contest.class` 213 | `CLUBLOG_QSO_UPLOAD_DATE` | `clublog.upload_date` 214 | `CLUBLOG_QSO_UPLOAD_STATUS` | `clublog.upload_status` 215 | `CNTY` | `contacted_station.county` 216 | `COMMENT` | `comment` 217 | `COMMENT_INTL` | (obsolete) 218 | `CONT` | `contacted_station.continent` 219 | `CONTACTED_OP` | `contacted_station.op_call` 220 | `CONTEST_ID` | `contest.contest_id` 221 | `COUNTRY` | `contacted_station.country` 222 | `COUNTRY_INTL` | (obsolete) 223 | `CQZ` | `contacted_station.cq_zone` 224 | `CREDIT_GRANTED` | `credit_granted[]` 225 | `CREDIT_SUBMITTED` | `credit_submitted[]` 226 | `DARC_DOK` | `contacted_station.darc_dok` 227 | `DISTANCE` | `distance` 228 | `DXCC` | `contacted_station.dxcc` 229 | `EMAIL` | `contacted_station.email` 230 | `EQ_CALL` | `contacted_station.owner_callsign` 231 | `EQSL_QSL_RCVD` | `eqsl.received_status` 232 | `EQSL_QSL_SENT` | `eqsl.sent_status` 233 | `EQSL_QSLRDATE` | `eqsl.received_date` 234 | `EQSL_QSLSDATE` | `eqsl.sent_date` 235 | `FISTS` | `contacted_station.fists` 236 | `FISTS_CC` | `contacted_station.fists_cc` 237 | `FORCE_INIT` | `propagation.force_init` 238 | `FREQ` | `freq` 239 | `FREQ_RX` | `freq_rx` 240 | `GRIDSQUARE` | `contacted_station.grid_square` 241 | `GUEST_OP` | (obsolete) 242 | `HRDLOG_QSO_UPLOAD_DATE` | `hrdlog.upload_date` 243 | `HRDLOG_QSO_UPLOAD_STATUS` | `hrdlog.upload_status` 244 | `IOTA` | `contacted_station.iota` 245 | `IOTA_ISLAND_ID` | `contacted_station.iota_island_id` 246 | `ITUZ` | `contacted_station.itu_zone` 247 | `K_INDEX` | `propagation.k_index` 248 | `LAT` | `contacted_station.latitude` 249 | `LON` | `contacted_station.longitude` 250 | `LOTW_QSL_RCVD` | `lotw.received_status` 251 | `LOTW_QSL_SENT` | `lotw.sent_status` 252 | `LOTW_QSLRDATE` | `lotw.received_date` 253 | `LOTW_QSLSDATE` | `lotw.sent_date` 254 | `MAX_BURSTS` | `propagation.max_bursts` 255 | `MODE` | `mode` 256 | `MS_SHOWER` | `propagation.ms_shower` 257 | `MY_ANTENNA` | `logging_station.antenna` 258 | `MY_ANTENNA_INTL` | (obsolete) 259 | `MY_CITY` | `logging_station.city` 260 | `MY_CITY_INTL` | (obsolete) 261 | `MY_CNTY` | `logging_station.county` 262 | `MY_COUNTRY` | `logging_station.country` 263 | `MY_COUNTRY_INTL` | (obsolete) 264 | `MY_CQ_ZONE` | `logging_station.cq_zone` 265 | `MY_DXCC` | `logging_station.dxcc` 266 | `MY_FISTS` | `logging_station.fists` 267 | `MY_GRIDSQUARE` | `logging_station.grid_square` 268 | `MY_IOTA` | `logging_station.iota` 269 | `MY_IOTA_ISLAND_ID` | `logging_station.iota_island_id` 270 | `MY_ITU_ZONE` | `logging_station.itu_zone` 271 | `MY_LAT` | `logging_station.latitude` 272 | `MY_LON` | `logging_station.longitude` 273 | `MY_NAME` | `logging_station.op_name` 274 | `MY_NAME_INTL` | (obsolete) 275 | `MY_POSTAL_CODE` | `logging_station.postal_code` 276 | `MY_POSTAL_CODE_INTL` | (obsolete) 277 | `MY_RIG` | `logging_station.rig` 278 | `MY_RIG_INTL` | (obsolete) 279 | `MY_SIG` | `logging_station.sig` 280 | `MY_SIG_INFO` | `logging_station.sig_info` 281 | `MY_SIG_INFO_INTL` | (obsolete) 282 | `MY_SIG_INTL` | (obsolete) 283 | `MY_SOTA_REF` | `logging_station.sota_ref` 284 | `MY_STATE` | `logging_station.state` 285 | `MY_STREET` | `logging_station.street` 286 | `MY_STREET_INTL` | (obsolete) 287 | `MY_USACA_COUNTIES` | `logging_station.usaca_counties` 288 | `MY_VUCC_GRIDS` | `logging_station.vucc_grids` 289 | `NAME` | `contacted_station.op_name` 290 | `NAME_INTL` | (obsolete) 291 | `NOTES` | `notes` 292 | `NOTES_INTL` | (obsolete) 293 | `NR_BURSTS` | `propagation.nr_bursts` 294 | `NR_PINGS` | `propagation.nr_pings` 295 | `OPERATOR` | `logging_station.op_call` 296 | `OWNER_CALLSIGN` | `logging_station.owner_call` 297 | `PFX` | `contacted_station.pfx` 298 | `PRECEDENCE` | `contest.precedence` 299 | `PROP_MODE` | `propagation.propagation_mode` 300 | `PUBLIC_KEY` | `public_key` 301 | `QRZCOM_QSO_UPLOAD_DATE` | `qrzcom.upload_date` 302 | `QRZCOM_QSO_UPLOAD_STATUS` | `qrzcom.upload_status` 303 | `QSL_RCVD` | `card.received_status` 304 | `QSL_RCVD_VIA` | `card.received_via` 305 | `QSL_SENT` | `card.sent_status` 306 | `QSL_SENT_VIA` | `card.sent_via` 307 | `QSL_VIA` | `contacted_station.qsl_via` 308 | `QSLMSG` | `card.received_message` 309 | `QSLMSG_INTL` | (obsolete) 310 | `QSLRDATE` | `card.received_date` 311 | `QSLSDATE` | `card.sent_date` 312 | `QSO_COMPLETE` | `complete` 313 | `QSO_DATE` | `time_on` 314 | `QSO_DATE_OFF` | `time_off` 315 | `QSO_RANDOM` | `random` 316 | `QTH` | `contacted_station.city` 317 | `QTH_INTL` | (obsolete) 318 | `REGION` | `contacted_station.region` 319 | `RIG` | `contacted_station.rig` 320 | `RIG_INTL` | (obsolete) 321 | `RST_RCVD` | `rst_received` 322 | `RST_SENT` | `rst_sent` 323 | `RX_PWR` | `contacted_station.power` 324 | `SAT_MODE` | `propagation.sat_mode` 325 | `SAT_NAME` | `propagation.sat_name` 326 | `SFI` | `propagation.solar_flux_index` 327 | `SIG` | `contacted_station.sig` 328 | `SIG_INFO` | `contacted_station.sig_info` 329 | `SIG_INFO_INTL` | (obsolete) 330 | `SIG_INTL` | (obsolete) 331 | `SILENT_KEY` | `contacted_station.silent_key` 332 | `SKCC` | `contacted_station.skcc` 333 | `SOTA_REF` | `contacted_station.sota_ref` 334 | `SRX` | `contest.serial_received` 335 | `SRX_STRING` | `contest.serial_received` 336 | `STATE` | `contacted_station.state` 337 | `STATION_CALLSIGN` | `logging_station.station_call` 338 | `STX` | `contest.serial_sent` 339 | `STX_STRING` | `contest.serial_sent` 340 | `SUBMODE` | `submode` 341 | `SWL` | `swl` 342 | `TEN_TEN` | `contacted_station.ten_ten` 343 | `TIME_OFF` | `time_off` 344 | `TIME_ON` | `time_on` 345 | `TX_PWR` | `logging_station.power` 346 | `UKSMG` | `contacted_station.uksmg` 347 | `USACA_COUNTIES` | `contacted_station.usaca_counties` 348 | `VE_PROV` | (obsolete) 349 | `VUCC_GRIDS` | `contacted_station.vucc_grids` 350 | `WEB` | `contacted_station.web` 351 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | While the repository is still in a pre-release (<1.0) state, only the latest released version is supported. 6 | 7 | ## Reporting a Vulnerability 8 | 9 | Please report vulnerabilities to xylo04@gmail.com. I will respond within 48 hours to discuss mitigation. 10 | -------------------------------------------------------------------------------- /adif.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "google/protobuf/timestamp.proto"; 4 | 5 | // This protocol buffer definition represents amateur radio contacts. It includes the fields defined 6 | // by ADIF v3.1.1 while restructuring them semantically. Developers using this protobuf schema 7 | // should be aware of the field mappings, validation and deprecation policies from the parent 8 | // specification. 9 | package adif; 10 | 11 | option go_package = ".;adifpb"; 12 | 13 | message Adif { 14 | Header header = 1; 15 | repeated Qso qsos = 2; 16 | } 17 | 18 | // metadata about the ADIF content 19 | message Header { 20 | // identifies the version of ADIF used in this file in the format X.Y.Z 21 | string adif_version = 1; 22 | // identifies the UTC date and time that the file was created 23 | google.protobuf.Timestamp created_timestamp = 2; 24 | // identifies the name of the logger, converter, or utility that created or processed this ADIF 25 | // file 26 | string program_id = 3; 27 | // identifies the version of the logger, converter, or utility that created or processed this ADIF 28 | // file 29 | string program_version = 4; 30 | // TODO: protobuf extensions for user defined fields? 31 | } 32 | 33 | // Data about one radio contact 34 | message Qso { 35 | Station logging_station = 1; 36 | Station contacted_station = 2; 37 | Propagation propagation = 3; 38 | // logging station's transmit band 39 | string band = 4; 40 | // in a split frequency QSO, the logging station's receiving band 41 | string band_rx = 5; 42 | // logging station's transmit frequency in Megahertz 43 | double freq = 6; 44 | // in a split frequency QSO, the logging station's receiving frequency in Megahertz 45 | double freq_rx = 7; 46 | // QSO Mode 47 | string mode = 8; 48 | // QSO Submode 49 | string submode = 9; 50 | // the distance between the logging station and the contacted station 51 | uint32 distance_km = 10; 52 | // date and time the QSO started 53 | google.protobuf.Timestamp time_on = 11; 54 | // date and time the QSO ended 55 | google.protobuf.Timestamp time_off = 12; 56 | // indicates whether the QSO was random or scheduled 57 | bool random = 13; 58 | // signal report from the contacted station 59 | string rst_received = 14; 60 | // signal report sent to the contacted station 61 | string rst_sent = 15; 62 | // indicates that the QSO information pertains to an SWL report 63 | bool swl = 16; 64 | // indicates whether the QSO was complete from the perspective of the logging station 65 | string complete = 17; 66 | 67 | // comment field for QSO (recommended use: information of interest to the contacted station's 68 | // operator) 69 | string comment = 18; 70 | // QSO notes (recommended use: information of interest to the logging station's operator) 71 | string notes = 19; 72 | 73 | ContestData contest = 20; 74 | 75 | // TODO: Award message type 76 | // the list of awards submitted to a sponsor 77 | repeated string award_submitted = 21; 78 | // the list of awards granted by a sponsor 79 | repeated string award_granted = 22; 80 | // the list of credits sought for this QSO 81 | repeated Credit credit_submitted = 23; 82 | // the list of credits granted to this QSO 83 | repeated Credit credit_granted = 24; 84 | // public encryption key 85 | string public_key = 25; 86 | 87 | // clublog.org upload status 88 | Upload clublog = 26; 89 | // HRDLog.net upload status 90 | Upload hrdlog = 27; 91 | // QRZ.com upload status 92 | Upload qrzcom = 28; 93 | 94 | // eQSL.cc QSL status 95 | Qsl eqsl = 29; 96 | // ARRL Logbook of the World QSL status 97 | Qsl lotw = 30; 98 | // Physical QSL card status 99 | Qsl card = 31; 100 | 101 | // Application-defined fields. Keys should follow ADIF 3.1.1 IV.A.4, i.e. 102 | // APP_{PROGRAMID}_{FIELDNAME} 103 | map app_defined = 32; 104 | } 105 | 106 | // QSO fields describing one of the stations involved in the contact 107 | message Station { 108 | // operator's callsign 109 | string op_call = 1; 110 | // operator's name 111 | string op_name = 2; 112 | // Maidenhead Grid Square 113 | string grid_square = 3; 114 | // latitude (north positive) 115 | double latitude = 4; 116 | // longitude (east positive) 117 | double longitude = 5; 118 | // transmitter power in watts 119 | double power = 6; 120 | // description of the station's equipment 121 | string rig = 7; 122 | // description of the station antenna 123 | string antenna = 8; 124 | // antenna beam azimuth in degrees 125 | int32 antenna_azimuth = 9; 126 | // antenna beam elevation in degrees 127 | int32 antenna_elevation = 10; 128 | // station owner's callsign 129 | string owner_call = 11; 130 | // callsign used over the air, e.g. a club callsign 131 | string station_call = 12; 132 | // the operator's age in years in the range 0 to 120 (inclusive) 133 | uint32 age = 13; 134 | // indicates that the operator is now a Silent Key 135 | bool silent_key = 14; 136 | // preferred QSL route 137 | string qsl_via = 15; 138 | 139 | // complete mailing address: full name, street address, city, postal code, and country 140 | string address = 16; 141 | // street 142 | string street = 17; 143 | // city 144 | string city = 18; 145 | // postal code 146 | string postal_code = 19; 147 | // Secondary Administrative Subdivision (e.g. US county, JA Gun) 148 | string county = 20; 149 | // the code for the Primary Administrative Subdivision (e.g. US State, JA Island, VE Province) 150 | string state = 21; 151 | // DXCC entity name 152 | string country = 22; 153 | // DXCC Entity Code 154 | uint32 dxcc = 23; 155 | // continent 156 | string continent = 24; 157 | 158 | // email address 159 | string email = 25; 160 | // the station's website URL 161 | string web = 26; 162 | 163 | // CQ Zone in the range 1 to 40 (inclusive) 164 | uint32 cq_zone = 27; 165 | // ITU zone in the range 1 to 90 (inclusive) 166 | uint32 itu_zone = 28; 167 | // DARC DOK (District Location Code) 168 | string darc_dok = 29; 169 | // FISTS CW Club member number 170 | uint32 fists = 30; 171 | // FISTS CW Club Century Certificate (CC) number 172 | uint32 fists_cc = 31; 173 | // IOTA designator, in format CC-XXX 174 | string iota = 32; 175 | // IOTA Island Identifier 176 | uint32 iota_island_id = 33; 177 | // WPX prefix 178 | string pfx = 34; 179 | // WAE or CQ entity contained within a DXCC entity 180 | string region = 35; 181 | // Straight Key Century Club (SKCC) member information 182 | string skcc = 36; 183 | // special interest activity or event 184 | string sig = 37; 185 | // special interest activity or event information 186 | string sig_info = 38; 187 | // International SOTA Reference 188 | string sota_ref = 39; 189 | // Ten-Ten number 190 | uint32 ten_ten = 40; 191 | // two US counties in the case where the logging station is located on a border between two 192 | // counties, representing counties that the contacted station may claim for the CQ Magazine USA-CA 193 | // award program 194 | string usaca_counties = 41; 195 | // UKSMG member number 196 | uint32 uksmg = 42; 197 | // two or four adjacent Maidenhead grid locators, each four characters long, representing the 198 | // logging station's grid squares that the contacted station may claim for the ARRL VUCC award 199 | // program 200 | string vucc_grids = 43; 201 | } 202 | 203 | // QSO fields describing radio propagation conditions 204 | message Propagation { 205 | // QSO propagation mode 206 | string propagation_mode = 1; 207 | // the geomagnetic A index at the time of the QSO in the range 0 to 400 (inclusive) 208 | uint32 a_index = 2; 209 | // the geomagnetic K index at the time of the QSO in the range 0 to 9 (inclusive) 210 | uint32 k_index = 3; 211 | // the solar flux at the time of the QSO in the range 0 to 300 (inclusive). 212 | uint32 solar_flux_index = 4; 213 | // the signal path 214 | string ant_path = 5; 215 | // new EME "initial" 216 | bool force_init = 6; 217 | // maximum length of meteor scatter bursts heard by the logging station, in seconds 218 | uint32 max_bursts = 7; 219 | // For Meteor Scatter QSOs, the name of the meteor shower in progress 220 | string meteor_shower_name = 8; 221 | // the number of meteor scatter bursts heard by the logging stationthe number of meteor scatter 222 | // bursts heard by the logging station 223 | uint32 nr_bursts = 11; 224 | // the number of meteor scatter pings heard by the logging station 225 | uint32 nr_pings = 12; 226 | // satellite mode 227 | string sat_mode = 9; 228 | // name of satellite 229 | string sat_name = 10; 230 | } 231 | 232 | // QSO fields that are relevant to contests only 233 | message ContestData { 234 | // Contest Identifier 235 | string contest_id = 1; 236 | // contest QSO transmitted serial number 237 | string serial_sent = 2; 238 | // contest QSO received serial number 239 | string serial_received = 3; 240 | // ARRL section 241 | string arrl_section = 4; 242 | // contest class (e.g. for ARRL Field Day) 243 | string station_class = 5; 244 | // contest check (e.g. for ARRL Sweepstakes) 245 | string check = 6; 246 | // contest precedence (e.g. for ARRL Sweepstakes) 247 | string precedence = 7; 248 | } 249 | 250 | // data about using this QSO for award credit 251 | message Credit { 252 | string credit = 1; 253 | string qsl_medium = 2; 254 | } 255 | 256 | // data about uploading this QSO to online logbook sites 257 | message Upload { 258 | google.protobuf.Timestamp upload_date = 1; 259 | UploadStatus upload_status = 2; 260 | } 261 | 262 | enum UploadStatus { 263 | UNKNOWN = 0; 264 | // the QSO has been uploaded to, and accepted by, the online service 265 | UPLOAD_COMPLETE = 1; 266 | // do not upload the QSO to the online service 267 | DO_NOT_UPLOAD = 2; 268 | // the QSO has been modified since being uploaded to the online service 269 | MODIFIED_AFTER_UPLOAD = 3; 270 | } 271 | 272 | // QSL data about confirmation of this contact 273 | message Qsl { 274 | // date QSL sent 275 | google.protobuf.Timestamp sent_date = 1; 276 | // QSL sent status 277 | string sent_status = 2; 278 | // if QSL_SENT is set to 'Y', the means by which the QSL was sent by the logging station; 279 | // otherwise, the means by which the logging station intends to convey the QSL 280 | string sent_via = 3; 281 | // date QSL received 282 | google.protobuf.Timestamp received_date = 4; 283 | // QSL received status 284 | string received_status = 5; 285 | // if QSL_RCVD is set to 'Y' or 'V', the means by which the QSL was received by the logging 286 | // station; otherwise, the means by which the logging station requested or intends to request that 287 | // the QSL be conveyed. 288 | string received_via = 6; 289 | // QSL card message 290 | string received_message = 7; 291 | } 292 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # ADIF protobuf demo 2 | 3 | This is a simple python script to demonstrate working with ADIF data in protocol buffers. It 4 | translates a standard ADIF file to the JSON format described in this repository. 5 | 6 | To try it out, make sure you have python3 and pip3 installed, then: 7 | 8 | ```shell script 9 | pip3 install -r requirements.txt 10 | python3 demo.py /path/to/my_log.adi 11 | ``` 12 | -------------------------------------------------------------------------------- /demo/adif_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: adif.proto 4 | 5 | from google.protobuf.internal import enum_type_wrapper 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import message as _message 8 | from google.protobuf import reflection as _reflection 9 | from google.protobuf import symbol_database as _symbol_database 10 | # @@protoc_insertion_point(imports) 11 | 12 | _sym_db = _symbol_database.Default() 13 | 14 | 15 | from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 16 | 17 | 18 | DESCRIPTOR = _descriptor.FileDescriptor( 19 | name='adif.proto', 20 | package='adif', 21 | syntax='proto3', 22 | serialized_options=b'Z\010.;adifpb', 23 | create_key=_descriptor._internal_create_key, 24 | serialized_pb=b'\n\nadif.proto\x12\x04\x61\x64if\x1a\x1fgoogle/protobuf/timestamp.proto\"=\n\x04\x41\x64if\x12\x1c\n\x06header\x18\x01 \x01(\x0b\x32\x0c.adif.Header\x12\x17\n\x04qsos\x18\x02 \x03(\x0b\x32\t.adif.Qso\"\x82\x01\n\x06Header\x12\x14\n\x0c\x61\x64if_version\x18\x01 \x01(\t\x12\x35\n\x11\x63reated_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nprogram_id\x18\x03 \x01(\t\x12\x17\n\x0fprogram_version\x18\x04 \x01(\t\"\x82\x07\n\x03Qso\x12&\n\x0flogging_station\x18\x01 \x01(\x0b\x32\r.adif.Station\x12(\n\x11\x63ontacted_station\x18\x02 \x01(\x0b\x32\r.adif.Station\x12&\n\x0bpropagation\x18\x03 \x01(\x0b\x32\x11.adif.Propagation\x12\x0c\n\x04\x62\x61nd\x18\x04 \x01(\t\x12\x0f\n\x07\x62\x61nd_rx\x18\x05 \x01(\t\x12\x0c\n\x04\x66req\x18\x06 \x01(\x01\x12\x0f\n\x07\x66req_rx\x18\x07 \x01(\x01\x12\x0c\n\x04mode\x18\x08 \x01(\t\x12\x0f\n\x07submode\x18\t \x01(\t\x12\x13\n\x0b\x64istance_km\x18\n \x01(\r\x12+\n\x07time_on\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08time_off\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06random\x18\r \x01(\x08\x12\x14\n\x0crst_received\x18\x0e \x01(\t\x12\x10\n\x08rst_sent\x18\x0f \x01(\t\x12\x0b\n\x03swl\x18\x10 \x01(\x08\x12\x10\n\x08\x63omplete\x18\x11 \x01(\t\x12\x0f\n\x07\x63omment\x18\x12 \x01(\t\x12\r\n\x05notes\x18\x13 \x01(\t\x12\"\n\x07\x63ontest\x18\x14 \x01(\x0b\x32\x11.adif.ContestData\x12\x17\n\x0f\x61ward_submitted\x18\x15 \x03(\t\x12\x15\n\raward_granted\x18\x16 \x03(\t\x12&\n\x10\x63redit_submitted\x18\x17 \x03(\x0b\x32\x0c.adif.Credit\x12$\n\x0e\x63redit_granted\x18\x18 \x03(\x0b\x32\x0c.adif.Credit\x12\x12\n\npublic_key\x18\x19 \x01(\t\x12\x1d\n\x07\x63lublog\x18\x1a \x01(\x0b\x32\x0c.adif.Upload\x12\x1c\n\x06hrdlog\x18\x1b \x01(\x0b\x32\x0c.adif.Upload\x12\x1c\n\x06qrzcom\x18\x1c \x01(\x0b\x32\x0c.adif.Upload\x12\x17\n\x04\x65qsl\x18\x1d \x01(\x0b\x32\t.adif.Qsl\x12\x17\n\x04lotw\x18\x1e \x01(\x0b\x32\t.adif.Qsl\x12\x17\n\x04\x63\x61rd\x18\x1f \x01(\x0b\x32\t.adif.Qsl\x12.\n\x0b\x61pp_defined\x18 \x03(\x0b\x32\x19.adif.Qso.AppDefinedEntry\x1a\x31\n\x0f\x41ppDefinedEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf7\x05\n\x07Station\x12\x0f\n\x07op_call\x18\x01 \x01(\t\x12\x0f\n\x07op_name\x18\x02 \x01(\t\x12\x13\n\x0bgrid_square\x18\x03 \x01(\t\x12\x10\n\x08latitude\x18\x04 \x01(\x01\x12\x11\n\tlongitude\x18\x05 \x01(\x01\x12\r\n\x05power\x18\x06 \x01(\x01\x12\x0b\n\x03rig\x18\x07 \x01(\t\x12\x0f\n\x07\x61ntenna\x18\x08 \x01(\t\x12\x17\n\x0f\x61ntenna_azimuth\x18\t \x01(\x05\x12\x19\n\x11\x61ntenna_elevation\x18\n \x01(\x05\x12\x12\n\nowner_call\x18\x0b \x01(\t\x12\x14\n\x0cstation_call\x18\x0c \x01(\t\x12\x0b\n\x03\x61ge\x18\r \x01(\r\x12\x12\n\nsilent_key\x18\x0e \x01(\x08\x12\x0f\n\x07qsl_via\x18\x0f \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x10 \x01(\t\x12\x0e\n\x06street\x18\x11 \x01(\t\x12\x0c\n\x04\x63ity\x18\x12 \x01(\t\x12\x13\n\x0bpostal_code\x18\x13 \x01(\t\x12\x0e\n\x06\x63ounty\x18\x14 \x01(\t\x12\r\n\x05state\x18\x15 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x16 \x01(\t\x12\x0c\n\x04\x64xcc\x18\x17 \x01(\r\x12\x11\n\tcontinent\x18\x18 \x01(\t\x12\r\n\x05\x65mail\x18\x19 \x01(\t\x12\x0b\n\x03web\x18\x1a \x01(\t\x12\x0f\n\x07\x63q_zone\x18\x1b \x01(\r\x12\x10\n\x08itu_zone\x18\x1c \x01(\r\x12\x10\n\x08\x64\x61rc_dok\x18\x1d \x01(\t\x12\r\n\x05\x66ists\x18\x1e \x01(\r\x12\x10\n\x08\x66ists_cc\x18\x1f \x01(\r\x12\x0c\n\x04iota\x18 \x01(\t\x12\x16\n\x0eiota_island_id\x18! \x01(\r\x12\x0b\n\x03pfx\x18\" \x01(\t\x12\x0e\n\x06region\x18# \x01(\t\x12\x0c\n\x04skcc\x18$ \x01(\t\x12\x0b\n\x03sig\x18% \x01(\t\x12\x10\n\x08sig_info\x18& \x01(\t\x12\x10\n\x08sota_ref\x18\' \x01(\t\x12\x0f\n\x07ten_ten\x18( \x01(\r\x12\x16\n\x0eusaca_counties\x18) \x01(\t\x12\r\n\x05uksmg\x18* \x01(\r\x12\x12\n\nvucc_grids\x18+ \x01(\t\"\x82\x02\n\x0bPropagation\x12\x18\n\x10propagation_mode\x18\x01 \x01(\t\x12\x0f\n\x07\x61_index\x18\x02 \x01(\r\x12\x0f\n\x07k_index\x18\x03 \x01(\r\x12\x18\n\x10solar_flux_index\x18\x04 \x01(\r\x12\x10\n\x08\x61nt_path\x18\x05 \x01(\t\x12\x12\n\nforce_init\x18\x06 \x01(\x08\x12\x12\n\nmax_bursts\x18\x07 \x01(\r\x12\x1a\n\x12meteor_shower_name\x18\x08 \x01(\t\x12\x11\n\tnr_bursts\x18\x0b \x01(\r\x12\x10\n\x08nr_pings\x18\x0c \x01(\r\x12\x10\n\x08sat_mode\x18\t \x01(\t\x12\x10\n\x08sat_name\x18\n \x01(\t\"\x9f\x01\n\x0b\x43ontestData\x12\x12\n\ncontest_id\x18\x01 \x01(\t\x12\x13\n\x0bserial_sent\x18\x02 \x01(\t\x12\x17\n\x0fserial_received\x18\x03 \x01(\t\x12\x14\n\x0c\x61rrl_section\x18\x04 \x01(\t\x12\x15\n\rstation_class\x18\x05 \x01(\t\x12\r\n\x05\x63heck\x18\x06 \x01(\t\x12\x12\n\nprecedence\x18\x07 \x01(\t\",\n\x06\x43redit\x12\x0e\n\x06\x63redit\x18\x01 \x01(\t\x12\x12\n\nqsl_medium\x18\x02 \x01(\t\"d\n\x06Upload\x12/\n\x0bupload_date\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12)\n\rupload_status\x18\x02 \x01(\x0e\x32\x12.adif.UploadStatus\"\xd7\x01\n\x03Qsl\x12-\n\tsent_date\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0bsent_status\x18\x02 \x01(\t\x12\x10\n\x08sent_via\x18\x03 \x01(\t\x12\x31\n\rreceived_date\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x17\n\x0freceived_status\x18\x05 \x01(\t\x12\x14\n\x0creceived_via\x18\x06 \x01(\t\x12\x18\n\x10received_message\x18\x07 \x01(\t*^\n\x0cUploadStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x13\n\x0fUPLOAD_COMPLETE\x10\x01\x12\x11\n\rDO_NOT_UPLOAD\x10\x02\x12\x19\n\x15MODIFIED_AFTER_UPLOAD\x10\x03\x42\nZ\x08.;adifpbb\x06proto3' 25 | , 26 | dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) 27 | 28 | _UPLOADSTATUS = _descriptor.EnumDescriptor( 29 | name='UploadStatus', 30 | full_name='adif.UploadStatus', 31 | filename=None, 32 | file=DESCRIPTOR, 33 | create_key=_descriptor._internal_create_key, 34 | values=[ 35 | _descriptor.EnumValueDescriptor( 36 | name='UNKNOWN', index=0, number=0, 37 | serialized_options=None, 38 | type=None, 39 | create_key=_descriptor._internal_create_key), 40 | _descriptor.EnumValueDescriptor( 41 | name='UPLOAD_COMPLETE', index=1, number=1, 42 | serialized_options=None, 43 | type=None, 44 | create_key=_descriptor._internal_create_key), 45 | _descriptor.EnumValueDescriptor( 46 | name='DO_NOT_UPLOAD', index=2, number=2, 47 | serialized_options=None, 48 | type=None, 49 | create_key=_descriptor._internal_create_key), 50 | _descriptor.EnumValueDescriptor( 51 | name='MODIFIED_AFTER_UPLOAD', index=3, number=3, 52 | serialized_options=None, 53 | type=None, 54 | create_key=_descriptor._internal_create_key), 55 | ], 56 | containing_type=None, 57 | serialized_options=None, 58 | serialized_start=2701, 59 | serialized_end=2795, 60 | ) 61 | _sym_db.RegisterEnumDescriptor(_UPLOADSTATUS) 62 | 63 | UploadStatus = enum_type_wrapper.EnumTypeWrapper(_UPLOADSTATUS) 64 | UNKNOWN = 0 65 | UPLOAD_COMPLETE = 1 66 | DO_NOT_UPLOAD = 2 67 | MODIFIED_AFTER_UPLOAD = 3 68 | 69 | 70 | 71 | _ADIF = _descriptor.Descriptor( 72 | name='Adif', 73 | full_name='adif.Adif', 74 | filename=None, 75 | file=DESCRIPTOR, 76 | containing_type=None, 77 | create_key=_descriptor._internal_create_key, 78 | fields=[ 79 | _descriptor.FieldDescriptor( 80 | name='header', full_name='adif.Adif.header', index=0, 81 | number=1, type=11, cpp_type=10, label=1, 82 | has_default_value=False, default_value=None, 83 | message_type=None, enum_type=None, containing_type=None, 84 | is_extension=False, extension_scope=None, 85 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 86 | _descriptor.FieldDescriptor( 87 | name='qsos', full_name='adif.Adif.qsos', index=1, 88 | number=2, type=11, cpp_type=10, label=3, 89 | has_default_value=False, default_value=[], 90 | message_type=None, enum_type=None, containing_type=None, 91 | is_extension=False, extension_scope=None, 92 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 93 | ], 94 | extensions=[ 95 | ], 96 | nested_types=[], 97 | enum_types=[ 98 | ], 99 | serialized_options=None, 100 | is_extendable=False, 101 | syntax='proto3', 102 | extension_ranges=[], 103 | oneofs=[ 104 | ], 105 | serialized_start=53, 106 | serialized_end=114, 107 | ) 108 | 109 | 110 | _HEADER = _descriptor.Descriptor( 111 | name='Header', 112 | full_name='adif.Header', 113 | filename=None, 114 | file=DESCRIPTOR, 115 | containing_type=None, 116 | create_key=_descriptor._internal_create_key, 117 | fields=[ 118 | _descriptor.FieldDescriptor( 119 | name='adif_version', full_name='adif.Header.adif_version', index=0, 120 | number=1, type=9, cpp_type=9, label=1, 121 | has_default_value=False, default_value=b"".decode('utf-8'), 122 | message_type=None, enum_type=None, containing_type=None, 123 | is_extension=False, extension_scope=None, 124 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 125 | _descriptor.FieldDescriptor( 126 | name='created_timestamp', full_name='adif.Header.created_timestamp', index=1, 127 | number=2, type=11, cpp_type=10, label=1, 128 | has_default_value=False, default_value=None, 129 | message_type=None, enum_type=None, containing_type=None, 130 | is_extension=False, extension_scope=None, 131 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 132 | _descriptor.FieldDescriptor( 133 | name='program_id', full_name='adif.Header.program_id', index=2, 134 | number=3, type=9, cpp_type=9, label=1, 135 | has_default_value=False, default_value=b"".decode('utf-8'), 136 | message_type=None, enum_type=None, containing_type=None, 137 | is_extension=False, extension_scope=None, 138 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 139 | _descriptor.FieldDescriptor( 140 | name='program_version', full_name='adif.Header.program_version', index=3, 141 | number=4, type=9, cpp_type=9, label=1, 142 | has_default_value=False, default_value=b"".decode('utf-8'), 143 | message_type=None, enum_type=None, containing_type=None, 144 | is_extension=False, extension_scope=None, 145 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 146 | ], 147 | extensions=[ 148 | ], 149 | nested_types=[], 150 | enum_types=[ 151 | ], 152 | serialized_options=None, 153 | is_extendable=False, 154 | syntax='proto3', 155 | extension_ranges=[], 156 | oneofs=[ 157 | ], 158 | serialized_start=117, 159 | serialized_end=247, 160 | ) 161 | 162 | 163 | _QSO_APPDEFINEDENTRY = _descriptor.Descriptor( 164 | name='AppDefinedEntry', 165 | full_name='adif.Qso.AppDefinedEntry', 166 | filename=None, 167 | file=DESCRIPTOR, 168 | containing_type=None, 169 | create_key=_descriptor._internal_create_key, 170 | fields=[ 171 | _descriptor.FieldDescriptor( 172 | name='key', full_name='adif.Qso.AppDefinedEntry.key', index=0, 173 | number=1, type=9, cpp_type=9, label=1, 174 | has_default_value=False, default_value=b"".decode('utf-8'), 175 | message_type=None, enum_type=None, containing_type=None, 176 | is_extension=False, extension_scope=None, 177 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 178 | _descriptor.FieldDescriptor( 179 | name='value', full_name='adif.Qso.AppDefinedEntry.value', index=1, 180 | number=2, type=9, cpp_type=9, label=1, 181 | has_default_value=False, default_value=b"".decode('utf-8'), 182 | message_type=None, enum_type=None, containing_type=None, 183 | is_extension=False, extension_scope=None, 184 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 185 | ], 186 | extensions=[ 187 | ], 188 | nested_types=[], 189 | enum_types=[ 190 | ], 191 | serialized_options=b'8\001', 192 | is_extendable=False, 193 | syntax='proto3', 194 | extension_ranges=[], 195 | oneofs=[ 196 | ], 197 | serialized_start=1099, 198 | serialized_end=1148, 199 | ) 200 | 201 | _QSO = _descriptor.Descriptor( 202 | name='Qso', 203 | full_name='adif.Qso', 204 | filename=None, 205 | file=DESCRIPTOR, 206 | containing_type=None, 207 | create_key=_descriptor._internal_create_key, 208 | fields=[ 209 | _descriptor.FieldDescriptor( 210 | name='logging_station', full_name='adif.Qso.logging_station', index=0, 211 | number=1, type=11, cpp_type=10, label=1, 212 | has_default_value=False, default_value=None, 213 | message_type=None, enum_type=None, containing_type=None, 214 | is_extension=False, extension_scope=None, 215 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 216 | _descriptor.FieldDescriptor( 217 | name='contacted_station', full_name='adif.Qso.contacted_station', index=1, 218 | number=2, type=11, cpp_type=10, label=1, 219 | has_default_value=False, default_value=None, 220 | message_type=None, enum_type=None, containing_type=None, 221 | is_extension=False, extension_scope=None, 222 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 223 | _descriptor.FieldDescriptor( 224 | name='propagation', full_name='adif.Qso.propagation', index=2, 225 | number=3, type=11, cpp_type=10, label=1, 226 | has_default_value=False, default_value=None, 227 | message_type=None, enum_type=None, containing_type=None, 228 | is_extension=False, extension_scope=None, 229 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 230 | _descriptor.FieldDescriptor( 231 | name='band', full_name='adif.Qso.band', index=3, 232 | number=4, type=9, cpp_type=9, label=1, 233 | has_default_value=False, default_value=b"".decode('utf-8'), 234 | message_type=None, enum_type=None, containing_type=None, 235 | is_extension=False, extension_scope=None, 236 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 237 | _descriptor.FieldDescriptor( 238 | name='band_rx', full_name='adif.Qso.band_rx', index=4, 239 | number=5, type=9, cpp_type=9, label=1, 240 | has_default_value=False, default_value=b"".decode('utf-8'), 241 | message_type=None, enum_type=None, containing_type=None, 242 | is_extension=False, extension_scope=None, 243 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 244 | _descriptor.FieldDescriptor( 245 | name='freq', full_name='adif.Qso.freq', index=5, 246 | number=6, type=1, cpp_type=5, label=1, 247 | has_default_value=False, default_value=float(0), 248 | message_type=None, enum_type=None, containing_type=None, 249 | is_extension=False, extension_scope=None, 250 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 251 | _descriptor.FieldDescriptor( 252 | name='freq_rx', full_name='adif.Qso.freq_rx', index=6, 253 | number=7, type=1, cpp_type=5, label=1, 254 | has_default_value=False, default_value=float(0), 255 | message_type=None, enum_type=None, containing_type=None, 256 | is_extension=False, extension_scope=None, 257 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 258 | _descriptor.FieldDescriptor( 259 | name='mode', full_name='adif.Qso.mode', index=7, 260 | number=8, type=9, cpp_type=9, label=1, 261 | has_default_value=False, default_value=b"".decode('utf-8'), 262 | message_type=None, enum_type=None, containing_type=None, 263 | is_extension=False, extension_scope=None, 264 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 265 | _descriptor.FieldDescriptor( 266 | name='submode', full_name='adif.Qso.submode', index=8, 267 | number=9, type=9, cpp_type=9, label=1, 268 | has_default_value=False, default_value=b"".decode('utf-8'), 269 | message_type=None, enum_type=None, containing_type=None, 270 | is_extension=False, extension_scope=None, 271 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 272 | _descriptor.FieldDescriptor( 273 | name='distance_km', full_name='adif.Qso.distance_km', index=9, 274 | number=10, type=13, cpp_type=3, label=1, 275 | has_default_value=False, default_value=0, 276 | message_type=None, enum_type=None, containing_type=None, 277 | is_extension=False, extension_scope=None, 278 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 279 | _descriptor.FieldDescriptor( 280 | name='time_on', full_name='adif.Qso.time_on', index=10, 281 | number=11, type=11, cpp_type=10, label=1, 282 | has_default_value=False, default_value=None, 283 | message_type=None, enum_type=None, containing_type=None, 284 | is_extension=False, extension_scope=None, 285 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 286 | _descriptor.FieldDescriptor( 287 | name='time_off', full_name='adif.Qso.time_off', index=11, 288 | number=12, type=11, cpp_type=10, label=1, 289 | has_default_value=False, default_value=None, 290 | message_type=None, enum_type=None, containing_type=None, 291 | is_extension=False, extension_scope=None, 292 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 293 | _descriptor.FieldDescriptor( 294 | name='random', full_name='adif.Qso.random', index=12, 295 | number=13, type=8, cpp_type=7, label=1, 296 | has_default_value=False, default_value=False, 297 | message_type=None, enum_type=None, containing_type=None, 298 | is_extension=False, extension_scope=None, 299 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 300 | _descriptor.FieldDescriptor( 301 | name='rst_received', full_name='adif.Qso.rst_received', index=13, 302 | number=14, type=9, cpp_type=9, label=1, 303 | has_default_value=False, default_value=b"".decode('utf-8'), 304 | message_type=None, enum_type=None, containing_type=None, 305 | is_extension=False, extension_scope=None, 306 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 307 | _descriptor.FieldDescriptor( 308 | name='rst_sent', full_name='adif.Qso.rst_sent', index=14, 309 | number=15, type=9, cpp_type=9, label=1, 310 | has_default_value=False, default_value=b"".decode('utf-8'), 311 | message_type=None, enum_type=None, containing_type=None, 312 | is_extension=False, extension_scope=None, 313 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 314 | _descriptor.FieldDescriptor( 315 | name='swl', full_name='adif.Qso.swl', index=15, 316 | number=16, type=8, cpp_type=7, label=1, 317 | has_default_value=False, default_value=False, 318 | message_type=None, enum_type=None, containing_type=None, 319 | is_extension=False, extension_scope=None, 320 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 321 | _descriptor.FieldDescriptor( 322 | name='complete', full_name='adif.Qso.complete', index=16, 323 | number=17, type=9, cpp_type=9, label=1, 324 | has_default_value=False, default_value=b"".decode('utf-8'), 325 | message_type=None, enum_type=None, containing_type=None, 326 | is_extension=False, extension_scope=None, 327 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 328 | _descriptor.FieldDescriptor( 329 | name='comment', full_name='adif.Qso.comment', index=17, 330 | number=18, type=9, cpp_type=9, label=1, 331 | has_default_value=False, default_value=b"".decode('utf-8'), 332 | message_type=None, enum_type=None, containing_type=None, 333 | is_extension=False, extension_scope=None, 334 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 335 | _descriptor.FieldDescriptor( 336 | name='notes', full_name='adif.Qso.notes', index=18, 337 | number=19, type=9, cpp_type=9, label=1, 338 | has_default_value=False, default_value=b"".decode('utf-8'), 339 | message_type=None, enum_type=None, containing_type=None, 340 | is_extension=False, extension_scope=None, 341 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 342 | _descriptor.FieldDescriptor( 343 | name='contest', full_name='adif.Qso.contest', index=19, 344 | number=20, type=11, cpp_type=10, label=1, 345 | has_default_value=False, default_value=None, 346 | message_type=None, enum_type=None, containing_type=None, 347 | is_extension=False, extension_scope=None, 348 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 349 | _descriptor.FieldDescriptor( 350 | name='award_submitted', full_name='adif.Qso.award_submitted', index=20, 351 | number=21, type=9, cpp_type=9, label=3, 352 | has_default_value=False, default_value=[], 353 | message_type=None, enum_type=None, containing_type=None, 354 | is_extension=False, extension_scope=None, 355 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 356 | _descriptor.FieldDescriptor( 357 | name='award_granted', full_name='adif.Qso.award_granted', index=21, 358 | number=22, type=9, cpp_type=9, label=3, 359 | has_default_value=False, default_value=[], 360 | message_type=None, enum_type=None, containing_type=None, 361 | is_extension=False, extension_scope=None, 362 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 363 | _descriptor.FieldDescriptor( 364 | name='credit_submitted', full_name='adif.Qso.credit_submitted', index=22, 365 | number=23, type=11, cpp_type=10, label=3, 366 | has_default_value=False, default_value=[], 367 | message_type=None, enum_type=None, containing_type=None, 368 | is_extension=False, extension_scope=None, 369 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 370 | _descriptor.FieldDescriptor( 371 | name='credit_granted', full_name='adif.Qso.credit_granted', index=23, 372 | number=24, type=11, cpp_type=10, label=3, 373 | has_default_value=False, default_value=[], 374 | message_type=None, enum_type=None, containing_type=None, 375 | is_extension=False, extension_scope=None, 376 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 377 | _descriptor.FieldDescriptor( 378 | name='public_key', full_name='adif.Qso.public_key', index=24, 379 | number=25, type=9, cpp_type=9, label=1, 380 | has_default_value=False, default_value=b"".decode('utf-8'), 381 | message_type=None, enum_type=None, containing_type=None, 382 | is_extension=False, extension_scope=None, 383 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 384 | _descriptor.FieldDescriptor( 385 | name='clublog', full_name='adif.Qso.clublog', index=25, 386 | number=26, type=11, cpp_type=10, label=1, 387 | has_default_value=False, default_value=None, 388 | message_type=None, enum_type=None, containing_type=None, 389 | is_extension=False, extension_scope=None, 390 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 391 | _descriptor.FieldDescriptor( 392 | name='hrdlog', full_name='adif.Qso.hrdlog', index=26, 393 | number=27, type=11, cpp_type=10, label=1, 394 | has_default_value=False, default_value=None, 395 | message_type=None, enum_type=None, containing_type=None, 396 | is_extension=False, extension_scope=None, 397 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 398 | _descriptor.FieldDescriptor( 399 | name='qrzcom', full_name='adif.Qso.qrzcom', index=27, 400 | number=28, type=11, cpp_type=10, label=1, 401 | has_default_value=False, default_value=None, 402 | message_type=None, enum_type=None, containing_type=None, 403 | is_extension=False, extension_scope=None, 404 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 405 | _descriptor.FieldDescriptor( 406 | name='eqsl', full_name='adif.Qso.eqsl', index=28, 407 | number=29, type=11, cpp_type=10, label=1, 408 | has_default_value=False, default_value=None, 409 | message_type=None, enum_type=None, containing_type=None, 410 | is_extension=False, extension_scope=None, 411 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 412 | _descriptor.FieldDescriptor( 413 | name='lotw', full_name='adif.Qso.lotw', index=29, 414 | number=30, type=11, cpp_type=10, label=1, 415 | has_default_value=False, default_value=None, 416 | message_type=None, enum_type=None, containing_type=None, 417 | is_extension=False, extension_scope=None, 418 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 419 | _descriptor.FieldDescriptor( 420 | name='card', full_name='adif.Qso.card', index=30, 421 | number=31, type=11, cpp_type=10, label=1, 422 | has_default_value=False, default_value=None, 423 | message_type=None, enum_type=None, containing_type=None, 424 | is_extension=False, extension_scope=None, 425 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 426 | _descriptor.FieldDescriptor( 427 | name='app_defined', full_name='adif.Qso.app_defined', index=31, 428 | number=32, type=11, cpp_type=10, label=3, 429 | has_default_value=False, default_value=[], 430 | message_type=None, enum_type=None, containing_type=None, 431 | is_extension=False, extension_scope=None, 432 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 433 | ], 434 | extensions=[ 435 | ], 436 | nested_types=[_QSO_APPDEFINEDENTRY, ], 437 | enum_types=[ 438 | ], 439 | serialized_options=None, 440 | is_extendable=False, 441 | syntax='proto3', 442 | extension_ranges=[], 443 | oneofs=[ 444 | ], 445 | serialized_start=250, 446 | serialized_end=1148, 447 | ) 448 | 449 | 450 | _STATION = _descriptor.Descriptor( 451 | name='Station', 452 | full_name='adif.Station', 453 | filename=None, 454 | file=DESCRIPTOR, 455 | containing_type=None, 456 | create_key=_descriptor._internal_create_key, 457 | fields=[ 458 | _descriptor.FieldDescriptor( 459 | name='op_call', full_name='adif.Station.op_call', index=0, 460 | number=1, type=9, cpp_type=9, label=1, 461 | has_default_value=False, default_value=b"".decode('utf-8'), 462 | message_type=None, enum_type=None, containing_type=None, 463 | is_extension=False, extension_scope=None, 464 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 465 | _descriptor.FieldDescriptor( 466 | name='op_name', full_name='adif.Station.op_name', index=1, 467 | number=2, type=9, cpp_type=9, label=1, 468 | has_default_value=False, default_value=b"".decode('utf-8'), 469 | message_type=None, enum_type=None, containing_type=None, 470 | is_extension=False, extension_scope=None, 471 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 472 | _descriptor.FieldDescriptor( 473 | name='grid_square', full_name='adif.Station.grid_square', index=2, 474 | number=3, type=9, cpp_type=9, label=1, 475 | has_default_value=False, default_value=b"".decode('utf-8'), 476 | message_type=None, enum_type=None, containing_type=None, 477 | is_extension=False, extension_scope=None, 478 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 479 | _descriptor.FieldDescriptor( 480 | name='latitude', full_name='adif.Station.latitude', index=3, 481 | number=4, type=1, cpp_type=5, label=1, 482 | has_default_value=False, default_value=float(0), 483 | message_type=None, enum_type=None, containing_type=None, 484 | is_extension=False, extension_scope=None, 485 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 486 | _descriptor.FieldDescriptor( 487 | name='longitude', full_name='adif.Station.longitude', index=4, 488 | number=5, type=1, cpp_type=5, label=1, 489 | has_default_value=False, default_value=float(0), 490 | message_type=None, enum_type=None, containing_type=None, 491 | is_extension=False, extension_scope=None, 492 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 493 | _descriptor.FieldDescriptor( 494 | name='power', full_name='adif.Station.power', index=5, 495 | number=6, type=1, cpp_type=5, label=1, 496 | has_default_value=False, default_value=float(0), 497 | message_type=None, enum_type=None, containing_type=None, 498 | is_extension=False, extension_scope=None, 499 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 500 | _descriptor.FieldDescriptor( 501 | name='rig', full_name='adif.Station.rig', index=6, 502 | number=7, type=9, cpp_type=9, label=1, 503 | has_default_value=False, default_value=b"".decode('utf-8'), 504 | message_type=None, enum_type=None, containing_type=None, 505 | is_extension=False, extension_scope=None, 506 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 507 | _descriptor.FieldDescriptor( 508 | name='antenna', full_name='adif.Station.antenna', index=7, 509 | number=8, type=9, cpp_type=9, label=1, 510 | has_default_value=False, default_value=b"".decode('utf-8'), 511 | message_type=None, enum_type=None, containing_type=None, 512 | is_extension=False, extension_scope=None, 513 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 514 | _descriptor.FieldDescriptor( 515 | name='antenna_azimuth', full_name='adif.Station.antenna_azimuth', index=8, 516 | number=9, type=5, cpp_type=1, label=1, 517 | has_default_value=False, default_value=0, 518 | message_type=None, enum_type=None, containing_type=None, 519 | is_extension=False, extension_scope=None, 520 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 521 | _descriptor.FieldDescriptor( 522 | name='antenna_elevation', full_name='adif.Station.antenna_elevation', index=9, 523 | number=10, type=5, cpp_type=1, label=1, 524 | has_default_value=False, default_value=0, 525 | message_type=None, enum_type=None, containing_type=None, 526 | is_extension=False, extension_scope=None, 527 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 528 | _descriptor.FieldDescriptor( 529 | name='owner_call', full_name='adif.Station.owner_call', index=10, 530 | number=11, type=9, cpp_type=9, label=1, 531 | has_default_value=False, default_value=b"".decode('utf-8'), 532 | message_type=None, enum_type=None, containing_type=None, 533 | is_extension=False, extension_scope=None, 534 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 535 | _descriptor.FieldDescriptor( 536 | name='station_call', full_name='adif.Station.station_call', index=11, 537 | number=12, type=9, cpp_type=9, label=1, 538 | has_default_value=False, default_value=b"".decode('utf-8'), 539 | message_type=None, enum_type=None, containing_type=None, 540 | is_extension=False, extension_scope=None, 541 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 542 | _descriptor.FieldDescriptor( 543 | name='age', full_name='adif.Station.age', index=12, 544 | number=13, type=13, cpp_type=3, label=1, 545 | has_default_value=False, default_value=0, 546 | message_type=None, enum_type=None, containing_type=None, 547 | is_extension=False, extension_scope=None, 548 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 549 | _descriptor.FieldDescriptor( 550 | name='silent_key', full_name='adif.Station.silent_key', index=13, 551 | number=14, type=8, cpp_type=7, label=1, 552 | has_default_value=False, default_value=False, 553 | message_type=None, enum_type=None, containing_type=None, 554 | is_extension=False, extension_scope=None, 555 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 556 | _descriptor.FieldDescriptor( 557 | name='qsl_via', full_name='adif.Station.qsl_via', index=14, 558 | number=15, type=9, cpp_type=9, label=1, 559 | has_default_value=False, default_value=b"".decode('utf-8'), 560 | message_type=None, enum_type=None, containing_type=None, 561 | is_extension=False, extension_scope=None, 562 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 563 | _descriptor.FieldDescriptor( 564 | name='address', full_name='adif.Station.address', index=15, 565 | number=16, type=9, cpp_type=9, label=1, 566 | has_default_value=False, default_value=b"".decode('utf-8'), 567 | message_type=None, enum_type=None, containing_type=None, 568 | is_extension=False, extension_scope=None, 569 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 570 | _descriptor.FieldDescriptor( 571 | name='street', full_name='adif.Station.street', index=16, 572 | number=17, type=9, cpp_type=9, label=1, 573 | has_default_value=False, default_value=b"".decode('utf-8'), 574 | message_type=None, enum_type=None, containing_type=None, 575 | is_extension=False, extension_scope=None, 576 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 577 | _descriptor.FieldDescriptor( 578 | name='city', full_name='adif.Station.city', index=17, 579 | number=18, type=9, cpp_type=9, label=1, 580 | has_default_value=False, default_value=b"".decode('utf-8'), 581 | message_type=None, enum_type=None, containing_type=None, 582 | is_extension=False, extension_scope=None, 583 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 584 | _descriptor.FieldDescriptor( 585 | name='postal_code', full_name='adif.Station.postal_code', index=18, 586 | number=19, type=9, cpp_type=9, label=1, 587 | has_default_value=False, default_value=b"".decode('utf-8'), 588 | message_type=None, enum_type=None, containing_type=None, 589 | is_extension=False, extension_scope=None, 590 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 591 | _descriptor.FieldDescriptor( 592 | name='county', full_name='adif.Station.county', index=19, 593 | number=20, type=9, cpp_type=9, label=1, 594 | has_default_value=False, default_value=b"".decode('utf-8'), 595 | message_type=None, enum_type=None, containing_type=None, 596 | is_extension=False, extension_scope=None, 597 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 598 | _descriptor.FieldDescriptor( 599 | name='state', full_name='adif.Station.state', index=20, 600 | number=21, type=9, cpp_type=9, label=1, 601 | has_default_value=False, default_value=b"".decode('utf-8'), 602 | message_type=None, enum_type=None, containing_type=None, 603 | is_extension=False, extension_scope=None, 604 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 605 | _descriptor.FieldDescriptor( 606 | name='country', full_name='adif.Station.country', index=21, 607 | number=22, type=9, cpp_type=9, label=1, 608 | has_default_value=False, default_value=b"".decode('utf-8'), 609 | message_type=None, enum_type=None, containing_type=None, 610 | is_extension=False, extension_scope=None, 611 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 612 | _descriptor.FieldDescriptor( 613 | name='dxcc', full_name='adif.Station.dxcc', index=22, 614 | number=23, type=13, cpp_type=3, label=1, 615 | has_default_value=False, default_value=0, 616 | message_type=None, enum_type=None, containing_type=None, 617 | is_extension=False, extension_scope=None, 618 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 619 | _descriptor.FieldDescriptor( 620 | name='continent', full_name='adif.Station.continent', index=23, 621 | number=24, type=9, cpp_type=9, label=1, 622 | has_default_value=False, default_value=b"".decode('utf-8'), 623 | message_type=None, enum_type=None, containing_type=None, 624 | is_extension=False, extension_scope=None, 625 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 626 | _descriptor.FieldDescriptor( 627 | name='email', full_name='adif.Station.email', index=24, 628 | number=25, type=9, cpp_type=9, label=1, 629 | has_default_value=False, default_value=b"".decode('utf-8'), 630 | message_type=None, enum_type=None, containing_type=None, 631 | is_extension=False, extension_scope=None, 632 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 633 | _descriptor.FieldDescriptor( 634 | name='web', full_name='adif.Station.web', index=25, 635 | number=26, type=9, cpp_type=9, label=1, 636 | has_default_value=False, default_value=b"".decode('utf-8'), 637 | message_type=None, enum_type=None, containing_type=None, 638 | is_extension=False, extension_scope=None, 639 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 640 | _descriptor.FieldDescriptor( 641 | name='cq_zone', full_name='adif.Station.cq_zone', index=26, 642 | number=27, type=13, cpp_type=3, label=1, 643 | has_default_value=False, default_value=0, 644 | message_type=None, enum_type=None, containing_type=None, 645 | is_extension=False, extension_scope=None, 646 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 647 | _descriptor.FieldDescriptor( 648 | name='itu_zone', full_name='adif.Station.itu_zone', index=27, 649 | number=28, type=13, cpp_type=3, label=1, 650 | has_default_value=False, default_value=0, 651 | message_type=None, enum_type=None, containing_type=None, 652 | is_extension=False, extension_scope=None, 653 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 654 | _descriptor.FieldDescriptor( 655 | name='darc_dok', full_name='adif.Station.darc_dok', index=28, 656 | number=29, type=9, cpp_type=9, label=1, 657 | has_default_value=False, default_value=b"".decode('utf-8'), 658 | message_type=None, enum_type=None, containing_type=None, 659 | is_extension=False, extension_scope=None, 660 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 661 | _descriptor.FieldDescriptor( 662 | name='fists', full_name='adif.Station.fists', index=29, 663 | number=30, type=13, cpp_type=3, label=1, 664 | has_default_value=False, default_value=0, 665 | message_type=None, enum_type=None, containing_type=None, 666 | is_extension=False, extension_scope=None, 667 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 668 | _descriptor.FieldDescriptor( 669 | name='fists_cc', full_name='adif.Station.fists_cc', index=30, 670 | number=31, type=13, cpp_type=3, label=1, 671 | has_default_value=False, default_value=0, 672 | message_type=None, enum_type=None, containing_type=None, 673 | is_extension=False, extension_scope=None, 674 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 675 | _descriptor.FieldDescriptor( 676 | name='iota', full_name='adif.Station.iota', index=31, 677 | number=32, type=9, cpp_type=9, label=1, 678 | has_default_value=False, default_value=b"".decode('utf-8'), 679 | message_type=None, enum_type=None, containing_type=None, 680 | is_extension=False, extension_scope=None, 681 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 682 | _descriptor.FieldDescriptor( 683 | name='iota_island_id', full_name='adif.Station.iota_island_id', index=32, 684 | number=33, type=13, cpp_type=3, label=1, 685 | has_default_value=False, default_value=0, 686 | message_type=None, enum_type=None, containing_type=None, 687 | is_extension=False, extension_scope=None, 688 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 689 | _descriptor.FieldDescriptor( 690 | name='pfx', full_name='adif.Station.pfx', index=33, 691 | number=34, type=9, cpp_type=9, label=1, 692 | has_default_value=False, default_value=b"".decode('utf-8'), 693 | message_type=None, enum_type=None, containing_type=None, 694 | is_extension=False, extension_scope=None, 695 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 696 | _descriptor.FieldDescriptor( 697 | name='region', full_name='adif.Station.region', index=34, 698 | number=35, type=9, cpp_type=9, label=1, 699 | has_default_value=False, default_value=b"".decode('utf-8'), 700 | message_type=None, enum_type=None, containing_type=None, 701 | is_extension=False, extension_scope=None, 702 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 703 | _descriptor.FieldDescriptor( 704 | name='skcc', full_name='adif.Station.skcc', index=35, 705 | number=36, type=9, cpp_type=9, label=1, 706 | has_default_value=False, default_value=b"".decode('utf-8'), 707 | message_type=None, enum_type=None, containing_type=None, 708 | is_extension=False, extension_scope=None, 709 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 710 | _descriptor.FieldDescriptor( 711 | name='sig', full_name='adif.Station.sig', index=36, 712 | number=37, type=9, cpp_type=9, label=1, 713 | has_default_value=False, default_value=b"".decode('utf-8'), 714 | message_type=None, enum_type=None, containing_type=None, 715 | is_extension=False, extension_scope=None, 716 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 717 | _descriptor.FieldDescriptor( 718 | name='sig_info', full_name='adif.Station.sig_info', index=37, 719 | number=38, type=9, cpp_type=9, label=1, 720 | has_default_value=False, default_value=b"".decode('utf-8'), 721 | message_type=None, enum_type=None, containing_type=None, 722 | is_extension=False, extension_scope=None, 723 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 724 | _descriptor.FieldDescriptor( 725 | name='sota_ref', full_name='adif.Station.sota_ref', index=38, 726 | number=39, type=9, cpp_type=9, label=1, 727 | has_default_value=False, default_value=b"".decode('utf-8'), 728 | message_type=None, enum_type=None, containing_type=None, 729 | is_extension=False, extension_scope=None, 730 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 731 | _descriptor.FieldDescriptor( 732 | name='ten_ten', full_name='adif.Station.ten_ten', index=39, 733 | number=40, type=13, cpp_type=3, label=1, 734 | has_default_value=False, default_value=0, 735 | message_type=None, enum_type=None, containing_type=None, 736 | is_extension=False, extension_scope=None, 737 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 738 | _descriptor.FieldDescriptor( 739 | name='usaca_counties', full_name='adif.Station.usaca_counties', index=40, 740 | number=41, type=9, cpp_type=9, label=1, 741 | has_default_value=False, default_value=b"".decode('utf-8'), 742 | message_type=None, enum_type=None, containing_type=None, 743 | is_extension=False, extension_scope=None, 744 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 745 | _descriptor.FieldDescriptor( 746 | name='uksmg', full_name='adif.Station.uksmg', index=41, 747 | number=42, type=13, cpp_type=3, label=1, 748 | has_default_value=False, default_value=0, 749 | message_type=None, enum_type=None, containing_type=None, 750 | is_extension=False, extension_scope=None, 751 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 752 | _descriptor.FieldDescriptor( 753 | name='vucc_grids', full_name='adif.Station.vucc_grids', index=42, 754 | number=43, type=9, cpp_type=9, label=1, 755 | has_default_value=False, default_value=b"".decode('utf-8'), 756 | message_type=None, enum_type=None, containing_type=None, 757 | is_extension=False, extension_scope=None, 758 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 759 | ], 760 | extensions=[ 761 | ], 762 | nested_types=[], 763 | enum_types=[ 764 | ], 765 | serialized_options=None, 766 | is_extendable=False, 767 | syntax='proto3', 768 | extension_ranges=[], 769 | oneofs=[ 770 | ], 771 | serialized_start=1151, 772 | serialized_end=1910, 773 | ) 774 | 775 | 776 | _PROPAGATION = _descriptor.Descriptor( 777 | name='Propagation', 778 | full_name='adif.Propagation', 779 | filename=None, 780 | file=DESCRIPTOR, 781 | containing_type=None, 782 | create_key=_descriptor._internal_create_key, 783 | fields=[ 784 | _descriptor.FieldDescriptor( 785 | name='propagation_mode', full_name='adif.Propagation.propagation_mode', index=0, 786 | number=1, type=9, cpp_type=9, label=1, 787 | has_default_value=False, default_value=b"".decode('utf-8'), 788 | message_type=None, enum_type=None, containing_type=None, 789 | is_extension=False, extension_scope=None, 790 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 791 | _descriptor.FieldDescriptor( 792 | name='a_index', full_name='adif.Propagation.a_index', index=1, 793 | number=2, type=13, cpp_type=3, label=1, 794 | has_default_value=False, default_value=0, 795 | message_type=None, enum_type=None, containing_type=None, 796 | is_extension=False, extension_scope=None, 797 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 798 | _descriptor.FieldDescriptor( 799 | name='k_index', full_name='adif.Propagation.k_index', index=2, 800 | number=3, type=13, cpp_type=3, label=1, 801 | has_default_value=False, default_value=0, 802 | message_type=None, enum_type=None, containing_type=None, 803 | is_extension=False, extension_scope=None, 804 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 805 | _descriptor.FieldDescriptor( 806 | name='solar_flux_index', full_name='adif.Propagation.solar_flux_index', index=3, 807 | number=4, type=13, cpp_type=3, label=1, 808 | has_default_value=False, default_value=0, 809 | message_type=None, enum_type=None, containing_type=None, 810 | is_extension=False, extension_scope=None, 811 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 812 | _descriptor.FieldDescriptor( 813 | name='ant_path', full_name='adif.Propagation.ant_path', index=4, 814 | number=5, type=9, cpp_type=9, label=1, 815 | has_default_value=False, default_value=b"".decode('utf-8'), 816 | message_type=None, enum_type=None, containing_type=None, 817 | is_extension=False, extension_scope=None, 818 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 819 | _descriptor.FieldDescriptor( 820 | name='force_init', full_name='adif.Propagation.force_init', index=5, 821 | number=6, type=8, cpp_type=7, label=1, 822 | has_default_value=False, default_value=False, 823 | message_type=None, enum_type=None, containing_type=None, 824 | is_extension=False, extension_scope=None, 825 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 826 | _descriptor.FieldDescriptor( 827 | name='max_bursts', full_name='adif.Propagation.max_bursts', index=6, 828 | number=7, type=13, cpp_type=3, label=1, 829 | has_default_value=False, default_value=0, 830 | message_type=None, enum_type=None, containing_type=None, 831 | is_extension=False, extension_scope=None, 832 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 833 | _descriptor.FieldDescriptor( 834 | name='meteor_shower_name', full_name='adif.Propagation.meteor_shower_name', index=7, 835 | number=8, type=9, cpp_type=9, label=1, 836 | has_default_value=False, default_value=b"".decode('utf-8'), 837 | message_type=None, enum_type=None, containing_type=None, 838 | is_extension=False, extension_scope=None, 839 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 840 | _descriptor.FieldDescriptor( 841 | name='nr_bursts', full_name='adif.Propagation.nr_bursts', index=8, 842 | number=11, type=13, cpp_type=3, label=1, 843 | has_default_value=False, default_value=0, 844 | message_type=None, enum_type=None, containing_type=None, 845 | is_extension=False, extension_scope=None, 846 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 847 | _descriptor.FieldDescriptor( 848 | name='nr_pings', full_name='adif.Propagation.nr_pings', index=9, 849 | number=12, type=13, cpp_type=3, label=1, 850 | has_default_value=False, default_value=0, 851 | message_type=None, enum_type=None, containing_type=None, 852 | is_extension=False, extension_scope=None, 853 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 854 | _descriptor.FieldDescriptor( 855 | name='sat_mode', full_name='adif.Propagation.sat_mode', index=10, 856 | number=9, type=9, cpp_type=9, label=1, 857 | has_default_value=False, default_value=b"".decode('utf-8'), 858 | message_type=None, enum_type=None, containing_type=None, 859 | is_extension=False, extension_scope=None, 860 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 861 | _descriptor.FieldDescriptor( 862 | name='sat_name', full_name='adif.Propagation.sat_name', index=11, 863 | number=10, type=9, cpp_type=9, label=1, 864 | has_default_value=False, default_value=b"".decode('utf-8'), 865 | message_type=None, enum_type=None, containing_type=None, 866 | is_extension=False, extension_scope=None, 867 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 868 | ], 869 | extensions=[ 870 | ], 871 | nested_types=[], 872 | enum_types=[ 873 | ], 874 | serialized_options=None, 875 | is_extendable=False, 876 | syntax='proto3', 877 | extension_ranges=[], 878 | oneofs=[ 879 | ], 880 | serialized_start=1913, 881 | serialized_end=2171, 882 | ) 883 | 884 | 885 | _CONTESTDATA = _descriptor.Descriptor( 886 | name='ContestData', 887 | full_name='adif.ContestData', 888 | filename=None, 889 | file=DESCRIPTOR, 890 | containing_type=None, 891 | create_key=_descriptor._internal_create_key, 892 | fields=[ 893 | _descriptor.FieldDescriptor( 894 | name='contest_id', full_name='adif.ContestData.contest_id', index=0, 895 | number=1, type=9, cpp_type=9, label=1, 896 | has_default_value=False, default_value=b"".decode('utf-8'), 897 | message_type=None, enum_type=None, containing_type=None, 898 | is_extension=False, extension_scope=None, 899 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 900 | _descriptor.FieldDescriptor( 901 | name='serial_sent', full_name='adif.ContestData.serial_sent', index=1, 902 | number=2, type=9, cpp_type=9, label=1, 903 | has_default_value=False, default_value=b"".decode('utf-8'), 904 | message_type=None, enum_type=None, containing_type=None, 905 | is_extension=False, extension_scope=None, 906 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 907 | _descriptor.FieldDescriptor( 908 | name='serial_received', full_name='adif.ContestData.serial_received', index=2, 909 | number=3, type=9, cpp_type=9, label=1, 910 | has_default_value=False, default_value=b"".decode('utf-8'), 911 | message_type=None, enum_type=None, containing_type=None, 912 | is_extension=False, extension_scope=None, 913 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 914 | _descriptor.FieldDescriptor( 915 | name='arrl_section', full_name='adif.ContestData.arrl_section', index=3, 916 | number=4, type=9, cpp_type=9, label=1, 917 | has_default_value=False, default_value=b"".decode('utf-8'), 918 | message_type=None, enum_type=None, containing_type=None, 919 | is_extension=False, extension_scope=None, 920 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 921 | _descriptor.FieldDescriptor( 922 | name='station_class', full_name='adif.ContestData.station_class', index=4, 923 | number=5, type=9, cpp_type=9, label=1, 924 | has_default_value=False, default_value=b"".decode('utf-8'), 925 | message_type=None, enum_type=None, containing_type=None, 926 | is_extension=False, extension_scope=None, 927 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 928 | _descriptor.FieldDescriptor( 929 | name='check', full_name='adif.ContestData.check', index=5, 930 | number=6, type=9, cpp_type=9, label=1, 931 | has_default_value=False, default_value=b"".decode('utf-8'), 932 | message_type=None, enum_type=None, containing_type=None, 933 | is_extension=False, extension_scope=None, 934 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 935 | _descriptor.FieldDescriptor( 936 | name='precedence', full_name='adif.ContestData.precedence', index=6, 937 | number=7, type=9, cpp_type=9, label=1, 938 | has_default_value=False, default_value=b"".decode('utf-8'), 939 | message_type=None, enum_type=None, containing_type=None, 940 | is_extension=False, extension_scope=None, 941 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 942 | ], 943 | extensions=[ 944 | ], 945 | nested_types=[], 946 | enum_types=[ 947 | ], 948 | serialized_options=None, 949 | is_extendable=False, 950 | syntax='proto3', 951 | extension_ranges=[], 952 | oneofs=[ 953 | ], 954 | serialized_start=2174, 955 | serialized_end=2333, 956 | ) 957 | 958 | 959 | _CREDIT = _descriptor.Descriptor( 960 | name='Credit', 961 | full_name='adif.Credit', 962 | filename=None, 963 | file=DESCRIPTOR, 964 | containing_type=None, 965 | create_key=_descriptor._internal_create_key, 966 | fields=[ 967 | _descriptor.FieldDescriptor( 968 | name='credit', full_name='adif.Credit.credit', index=0, 969 | number=1, type=9, cpp_type=9, label=1, 970 | has_default_value=False, default_value=b"".decode('utf-8'), 971 | message_type=None, enum_type=None, containing_type=None, 972 | is_extension=False, extension_scope=None, 973 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 974 | _descriptor.FieldDescriptor( 975 | name='qsl_medium', full_name='adif.Credit.qsl_medium', index=1, 976 | number=2, type=9, cpp_type=9, label=1, 977 | has_default_value=False, default_value=b"".decode('utf-8'), 978 | message_type=None, enum_type=None, containing_type=None, 979 | is_extension=False, extension_scope=None, 980 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 981 | ], 982 | extensions=[ 983 | ], 984 | nested_types=[], 985 | enum_types=[ 986 | ], 987 | serialized_options=None, 988 | is_extendable=False, 989 | syntax='proto3', 990 | extension_ranges=[], 991 | oneofs=[ 992 | ], 993 | serialized_start=2335, 994 | serialized_end=2379, 995 | ) 996 | 997 | 998 | _UPLOAD = _descriptor.Descriptor( 999 | name='Upload', 1000 | full_name='adif.Upload', 1001 | filename=None, 1002 | file=DESCRIPTOR, 1003 | containing_type=None, 1004 | create_key=_descriptor._internal_create_key, 1005 | fields=[ 1006 | _descriptor.FieldDescriptor( 1007 | name='upload_date', full_name='adif.Upload.upload_date', index=0, 1008 | number=1, type=11, cpp_type=10, label=1, 1009 | has_default_value=False, default_value=None, 1010 | message_type=None, enum_type=None, containing_type=None, 1011 | is_extension=False, extension_scope=None, 1012 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1013 | _descriptor.FieldDescriptor( 1014 | name='upload_status', full_name='adif.Upload.upload_status', index=1, 1015 | number=2, type=14, cpp_type=8, label=1, 1016 | has_default_value=False, default_value=0, 1017 | message_type=None, enum_type=None, containing_type=None, 1018 | is_extension=False, extension_scope=None, 1019 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1020 | ], 1021 | extensions=[ 1022 | ], 1023 | nested_types=[], 1024 | enum_types=[ 1025 | ], 1026 | serialized_options=None, 1027 | is_extendable=False, 1028 | syntax='proto3', 1029 | extension_ranges=[], 1030 | oneofs=[ 1031 | ], 1032 | serialized_start=2381, 1033 | serialized_end=2481, 1034 | ) 1035 | 1036 | 1037 | _QSL = _descriptor.Descriptor( 1038 | name='Qsl', 1039 | full_name='adif.Qsl', 1040 | filename=None, 1041 | file=DESCRIPTOR, 1042 | containing_type=None, 1043 | create_key=_descriptor._internal_create_key, 1044 | fields=[ 1045 | _descriptor.FieldDescriptor( 1046 | name='sent_date', full_name='adif.Qsl.sent_date', index=0, 1047 | number=1, type=11, cpp_type=10, label=1, 1048 | has_default_value=False, default_value=None, 1049 | message_type=None, enum_type=None, containing_type=None, 1050 | is_extension=False, extension_scope=None, 1051 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1052 | _descriptor.FieldDescriptor( 1053 | name='sent_status', full_name='adif.Qsl.sent_status', index=1, 1054 | number=2, type=9, cpp_type=9, label=1, 1055 | has_default_value=False, default_value=b"".decode('utf-8'), 1056 | message_type=None, enum_type=None, containing_type=None, 1057 | is_extension=False, extension_scope=None, 1058 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1059 | _descriptor.FieldDescriptor( 1060 | name='sent_via', full_name='adif.Qsl.sent_via', index=2, 1061 | number=3, type=9, cpp_type=9, label=1, 1062 | has_default_value=False, default_value=b"".decode('utf-8'), 1063 | message_type=None, enum_type=None, containing_type=None, 1064 | is_extension=False, extension_scope=None, 1065 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1066 | _descriptor.FieldDescriptor( 1067 | name='received_date', full_name='adif.Qsl.received_date', index=3, 1068 | number=4, type=11, cpp_type=10, label=1, 1069 | has_default_value=False, default_value=None, 1070 | message_type=None, enum_type=None, containing_type=None, 1071 | is_extension=False, extension_scope=None, 1072 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1073 | _descriptor.FieldDescriptor( 1074 | name='received_status', full_name='adif.Qsl.received_status', index=4, 1075 | number=5, type=9, cpp_type=9, label=1, 1076 | has_default_value=False, default_value=b"".decode('utf-8'), 1077 | message_type=None, enum_type=None, containing_type=None, 1078 | is_extension=False, extension_scope=None, 1079 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1080 | _descriptor.FieldDescriptor( 1081 | name='received_via', full_name='adif.Qsl.received_via', index=5, 1082 | number=6, type=9, cpp_type=9, label=1, 1083 | has_default_value=False, default_value=b"".decode('utf-8'), 1084 | message_type=None, enum_type=None, containing_type=None, 1085 | is_extension=False, extension_scope=None, 1086 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1087 | _descriptor.FieldDescriptor( 1088 | name='received_message', full_name='adif.Qsl.received_message', index=6, 1089 | number=7, type=9, cpp_type=9, label=1, 1090 | has_default_value=False, default_value=b"".decode('utf-8'), 1091 | message_type=None, enum_type=None, containing_type=None, 1092 | is_extension=False, extension_scope=None, 1093 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 1094 | ], 1095 | extensions=[ 1096 | ], 1097 | nested_types=[], 1098 | enum_types=[ 1099 | ], 1100 | serialized_options=None, 1101 | is_extendable=False, 1102 | syntax='proto3', 1103 | extension_ranges=[], 1104 | oneofs=[ 1105 | ], 1106 | serialized_start=2484, 1107 | serialized_end=2699, 1108 | ) 1109 | 1110 | _ADIF.fields_by_name['header'].message_type = _HEADER 1111 | _ADIF.fields_by_name['qsos'].message_type = _QSO 1112 | _HEADER.fields_by_name['created_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1113 | _QSO_APPDEFINEDENTRY.containing_type = _QSO 1114 | _QSO.fields_by_name['logging_station'].message_type = _STATION 1115 | _QSO.fields_by_name['contacted_station'].message_type = _STATION 1116 | _QSO.fields_by_name['propagation'].message_type = _PROPAGATION 1117 | _QSO.fields_by_name['time_on'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1118 | _QSO.fields_by_name['time_off'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1119 | _QSO.fields_by_name['contest'].message_type = _CONTESTDATA 1120 | _QSO.fields_by_name['credit_submitted'].message_type = _CREDIT 1121 | _QSO.fields_by_name['credit_granted'].message_type = _CREDIT 1122 | _QSO.fields_by_name['clublog'].message_type = _UPLOAD 1123 | _QSO.fields_by_name['hrdlog'].message_type = _UPLOAD 1124 | _QSO.fields_by_name['qrzcom'].message_type = _UPLOAD 1125 | _QSO.fields_by_name['eqsl'].message_type = _QSL 1126 | _QSO.fields_by_name['lotw'].message_type = _QSL 1127 | _QSO.fields_by_name['card'].message_type = _QSL 1128 | _QSO.fields_by_name['app_defined'].message_type = _QSO_APPDEFINEDENTRY 1129 | _UPLOAD.fields_by_name['upload_date'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1130 | _UPLOAD.fields_by_name['upload_status'].enum_type = _UPLOADSTATUS 1131 | _QSL.fields_by_name['sent_date'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1132 | _QSL.fields_by_name['received_date'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP 1133 | DESCRIPTOR.message_types_by_name['Adif'] = _ADIF 1134 | DESCRIPTOR.message_types_by_name['Header'] = _HEADER 1135 | DESCRIPTOR.message_types_by_name['Qso'] = _QSO 1136 | DESCRIPTOR.message_types_by_name['Station'] = _STATION 1137 | DESCRIPTOR.message_types_by_name['Propagation'] = _PROPAGATION 1138 | DESCRIPTOR.message_types_by_name['ContestData'] = _CONTESTDATA 1139 | DESCRIPTOR.message_types_by_name['Credit'] = _CREDIT 1140 | DESCRIPTOR.message_types_by_name['Upload'] = _UPLOAD 1141 | DESCRIPTOR.message_types_by_name['Qsl'] = _QSL 1142 | DESCRIPTOR.enum_types_by_name['UploadStatus'] = _UPLOADSTATUS 1143 | _sym_db.RegisterFileDescriptor(DESCRIPTOR) 1144 | 1145 | Adif = _reflection.GeneratedProtocolMessageType('Adif', (_message.Message,), { 1146 | 'DESCRIPTOR' : _ADIF, 1147 | '__module__' : 'adif_pb2' 1148 | # @@protoc_insertion_point(class_scope:adif.Adif) 1149 | }) 1150 | _sym_db.RegisterMessage(Adif) 1151 | 1152 | Header = _reflection.GeneratedProtocolMessageType('Header', (_message.Message,), { 1153 | 'DESCRIPTOR' : _HEADER, 1154 | '__module__' : 'adif_pb2' 1155 | # @@protoc_insertion_point(class_scope:adif.Header) 1156 | }) 1157 | _sym_db.RegisterMessage(Header) 1158 | 1159 | Qso = _reflection.GeneratedProtocolMessageType('Qso', (_message.Message,), { 1160 | 1161 | 'AppDefinedEntry' : _reflection.GeneratedProtocolMessageType('AppDefinedEntry', (_message.Message,), { 1162 | 'DESCRIPTOR' : _QSO_APPDEFINEDENTRY, 1163 | '__module__' : 'adif_pb2' 1164 | # @@protoc_insertion_point(class_scope:adif.Qso.AppDefinedEntry) 1165 | }) 1166 | , 1167 | 'DESCRIPTOR' : _QSO, 1168 | '__module__' : 'adif_pb2' 1169 | # @@protoc_insertion_point(class_scope:adif.Qso) 1170 | }) 1171 | _sym_db.RegisterMessage(Qso) 1172 | _sym_db.RegisterMessage(Qso.AppDefinedEntry) 1173 | 1174 | Station = _reflection.GeneratedProtocolMessageType('Station', (_message.Message,), { 1175 | 'DESCRIPTOR' : _STATION, 1176 | '__module__' : 'adif_pb2' 1177 | # @@protoc_insertion_point(class_scope:adif.Station) 1178 | }) 1179 | _sym_db.RegisterMessage(Station) 1180 | 1181 | Propagation = _reflection.GeneratedProtocolMessageType('Propagation', (_message.Message,), { 1182 | 'DESCRIPTOR' : _PROPAGATION, 1183 | '__module__' : 'adif_pb2' 1184 | # @@protoc_insertion_point(class_scope:adif.Propagation) 1185 | }) 1186 | _sym_db.RegisterMessage(Propagation) 1187 | 1188 | ContestData = _reflection.GeneratedProtocolMessageType('ContestData', (_message.Message,), { 1189 | 'DESCRIPTOR' : _CONTESTDATA, 1190 | '__module__' : 'adif_pb2' 1191 | # @@protoc_insertion_point(class_scope:adif.ContestData) 1192 | }) 1193 | _sym_db.RegisterMessage(ContestData) 1194 | 1195 | Credit = _reflection.GeneratedProtocolMessageType('Credit', (_message.Message,), { 1196 | 'DESCRIPTOR' : _CREDIT, 1197 | '__module__' : 'adif_pb2' 1198 | # @@protoc_insertion_point(class_scope:adif.Credit) 1199 | }) 1200 | _sym_db.RegisterMessage(Credit) 1201 | 1202 | Upload = _reflection.GeneratedProtocolMessageType('Upload', (_message.Message,), { 1203 | 'DESCRIPTOR' : _UPLOAD, 1204 | '__module__' : 'adif_pb2' 1205 | # @@protoc_insertion_point(class_scope:adif.Upload) 1206 | }) 1207 | _sym_db.RegisterMessage(Upload) 1208 | 1209 | Qsl = _reflection.GeneratedProtocolMessageType('Qsl', (_message.Message,), { 1210 | 'DESCRIPTOR' : _QSL, 1211 | '__module__' : 'adif_pb2' 1212 | # @@protoc_insertion_point(class_scope:adif.Qsl) 1213 | }) 1214 | _sym_db.RegisterMessage(Qsl) 1215 | 1216 | 1217 | DESCRIPTOR._options = None 1218 | _QSO_APPDEFINEDENTRY._options = None 1219 | # @@protoc_insertion_point(module_scope) 1220 | -------------------------------------------------------------------------------- /demo/demo.py: -------------------------------------------------------------------------------- 1 | import gzip 2 | import re 3 | from pathlib import Path 4 | 5 | import adif_pb2 6 | import sys 7 | from google.protobuf.json_format import MessageToJson 8 | from hamutils.adif import ADIReader 9 | from tabulate import tabulate 10 | 11 | lat_lon_re = re.compile('([NESW])(\d+) ([\d.]+)') 12 | 13 | 14 | def safe_bytes(d, key): 15 | if key in d: 16 | return d[key] 17 | return b'' 18 | 19 | 20 | def safe_int(d, key): 21 | if key in d: 22 | return int(d[key]) 23 | return 0 24 | 25 | 26 | def safe_float(d, key): 27 | if key in d: 28 | return float(d[key]) 29 | return 0 30 | 31 | 32 | def safe_lat_long(d, key): 33 | if key in d: 34 | raw = d[key] 35 | m = lat_lon_re.search(raw) 36 | cardinal = m.group(1) 37 | degs = int(m.group(2)) 38 | mins = float(m.group(3)) 39 | retval = degs + (mins / 60) 40 | if cardinal == 'S' or cardinal == 'W': 41 | retval *= -1 42 | return retval 43 | return 0 44 | 45 | 46 | def safe_upload_status(d, key): 47 | if key in d: 48 | v = d[key] 49 | ret = adif_pb2.UploadStatus.UNKNOWN 50 | if v == "Y": 51 | ret = adif_pb2.UploadStatus.UPLOAD_COMPLETE 52 | if v == "N": 53 | ret = adif_pb2.UploadStatus.DO_NOT_UPLOAD 54 | if v == "M": 55 | ret = adif_pb2.UploadStatus.MODIFIED_AFTER_UPLOAD 56 | return ret 57 | return 0 58 | 59 | 60 | filename = sys.argv[1] 61 | adif_size = Path(filename).stat().st_size 62 | gzip_adif_size = len(gzip.compress(open(filename, "rb").read())) 63 | f = open(filename, 'r') 64 | adi = ADIReader(f) 65 | 66 | pb_adi = adif_pb2.Adif() 67 | pb_adi.header.created_timestamp.GetCurrentTime() 68 | pb_adi.header.program_id = 'PbAdifDemo' 69 | pb_adi.header.program_version = '0.0.1' 70 | 71 | for qso in adi: 72 | pb_qso = pb_adi.qsos.add() 73 | pb_qso.band = safe_bytes(qso, 'band') 74 | pb_qso.band_rx = safe_bytes(qso, 'band_rx') 75 | pb_qso.contacted_station.station_call = safe_bytes(qso, 'call') 76 | pb_qso.contacted_station.county = safe_bytes(qso, 'cnty') 77 | pb_qso.comment = safe_bytes(qso, 'comment') 78 | pb_qso.contacted_station.continent = safe_bytes(qso, 'cont') 79 | pb_qso.contacted_station.country = safe_bytes(qso, 'country') 80 | pb_qso.contacted_station.cq_zone = safe_int(qso, 'cqz') 81 | pb_qso.distance_km = safe_int(qso, 'distance') 82 | pb_qso.contacted_station.dxcc = safe_int(qso, 'dxcc') 83 | pb_qso.contacted_station.email = safe_bytes(qso, 'email') 84 | pb_qso.eqsl.sent_status = safe_bytes(qso, 'eqsl_qsl_sent') 85 | pb_qso.eqsl.received_status = safe_bytes(qso, 'eqsl_qsl_rcvd') 86 | pb_qso.freq = safe_float(qso, 'freq') 87 | pb_qso.freq_rx = safe_float(qso, 'freq_rx') 88 | pb_qso.contacted_station.grid_square = safe_bytes(qso, 'gridsquare') 89 | pb_qso.contacted_station.itu_zone = safe_int(qso, 'ituz') 90 | pb_qso.contacted_station.iota = safe_bytes(qso, 'iota') 91 | pb_qso.contacted_station.latitude = safe_lat_long(qso, 'lat') 92 | pb_qso.contacted_station.longitude = safe_lat_long(qso, 'lon') 93 | pb_qso.lotw.sent_status = safe_bytes(qso, 'lotw_qsl_sent') 94 | pb_qso.lotw.received_status = safe_bytes(qso, 'lotw_qsl_rcvd') 95 | pb_qso.mode = safe_bytes(qso, 'mode') 96 | pb_qso.logging_station.city = safe_bytes(qso, 'my_city') 97 | pb_qso.logging_station.county = safe_bytes(qso, 'my_cnty') 98 | pb_qso.logging_station.country = safe_bytes(qso, 'my_country') 99 | pb_qso.logging_station.cq_zone = safe_int(qso, 'my_cq_zone') 100 | pb_qso.logging_station.grid_square = safe_bytes(qso, 'my_gridsquare') 101 | pb_qso.logging_station.itu_zone = safe_int(qso, 'my_itu_zone') 102 | pb_qso.logging_station.latitude = safe_lat_long(qso, 'my_lat') 103 | pb_qso.logging_station.longitude = safe_lat_long(qso, 'my_lon') 104 | pb_qso.logging_station.op_name = safe_bytes(qso, 'my_name') 105 | pb_qso.logging_station.state = safe_bytes(qso, 'my_state') 106 | pb_qso.contacted_station.op_name = safe_bytes(qso, 'name') 107 | pb_qso.logging_station.op_call = safe_bytes(qso, 'operator') 108 | pb_qso.qrzcom.upload_status = safe_upload_status(qso, 'qrzcom_qso_upload_status') 109 | pb_qso.card.received_message = safe_bytes(qso, 'qslmsg') 110 | pb_qso.card.sent_status = safe_bytes(qso, 'qsl_sent') 111 | pb_qso.card.sent_via = safe_bytes(qso, 'qsl_sent_via') 112 | pb_qso.card.received_status = safe_bytes(qso, 'qsl_rcvd') 113 | pb_qso.contacted_station.qsl_via = safe_bytes(qso, 'qsl_via') 114 | pb_qso.contacted_station.city = safe_bytes(qso, 'qth') 115 | pb_qso.rst_received = safe_bytes(qso, 'rst_rcvd') 116 | pb_qso.rst_sent = safe_bytes(qso, 'rst_sent') 117 | pb_qso.contacted_station.state = safe_bytes(qso, 'state') 118 | pb_qso.logging_station.power = safe_float(qso, 'tx_pwr') 119 | pb_qso.logging_station.station_call = safe_bytes(qso, 'station_callsign') 120 | 121 | pb_qso.time_on.FromJsonString(qso['datetime_on'].isoformat(timespec='seconds') + 'Z') 122 | pb_qso.time_off.FromJsonString(qso['datetime_off'].isoformat(timespec='seconds') + 'Z') 123 | if 'lotw_qslsdate' in qso: 124 | pb_qso.lotw.sent_date.FromJsonString(qso['lotw_qslsdate'].isoformat() + 'T00:00:00Z') 125 | if 'lotw_qslrdate' in qso: 126 | pb_qso.lotw.received_date.FromJsonString(qso['lotw_qslrdate'].isoformat() + 'T00:00:00Z') 127 | if 'qrzcom_qso_upload_date' in qso: 128 | pb_qso.qrzcom.upload_date.FromJsonString(qso['qrzcom_qso_upload_date'].isoformat() + 'T00:00:00Z') 129 | 130 | # avoid having an empty contest stanza 131 | contest_id = safe_bytes(qso, 'contest_id') 132 | if contest_id != b'': 133 | pb_qso.contest.contest_id = contest_id 134 | pb_qso.contest.serial_received = safe_bytes(qso, 'srx_string') 135 | if pb_qso.contest.serial_received == '': 136 | srx = safe_int(qso, 'srx') 137 | if srx != 0: 138 | pb_qso.contest.serial_received = str(srx) 139 | pb_qso.contest.serial_sent = safe_bytes(qso, 'stx_string') 140 | if pb_qso.contest.serial_sent == '': 141 | stx = safe_int(qso, 'stx') 142 | if stx != 0: 143 | pb_qso.contest.serial_sent = str(stx) 144 | pb_qso.contest.arrl_section = safe_bytes(qso, 'arrl_sect') 145 | pb_qso.contest.station_class = safe_bytes(qso, 'class') 146 | 147 | json = MessageToJson(pb_adi) 148 | print(json) 149 | 150 | num_fmt = "{:,}" 151 | json_size = len(json) 152 | gzip_json_size = len(gzip.compress(json.encode('utf-8'))) 153 | pb_size = len(pb_adi.SerializeToString()) 154 | gzip_pb_size = len(gzip.compress(pb_adi.SerializeToString())) 155 | print( 156 | tabulate( 157 | [['Input ADIF', num_fmt.format(adif_size), num_fmt.format(gzip_adif_size)], 158 | ['JSON', num_fmt.format(json_size), num_fmt.format(gzip_json_size)], 159 | ['Binary protobuf', num_fmt.format(pb_size), num_fmt.format(gzip_pb_size)]], 160 | headers=['Encoding', 'bytes', 'gzip']), 161 | file=sys.stderr) 162 | -------------------------------------------------------------------------------- /demo/requirements.txt: -------------------------------------------------------------------------------- 1 | hamutils==0.2.1 2 | protobuf==5.29.5 3 | tabulate==0.9.0 4 | -------------------------------------------------------------------------------- /go/README.md: -------------------------------------------------------------------------------- 1 | [![PkgGoDev](https://pkg.go.dev/badge/github.com/k0swe/adif-json-protobuf/go)](https://pkg.go.dev/github.com/k0swe/adif-json-protobuf/go) 2 | 3 | # ADIF protocol buffer: Golang bindings 4 | 5 | This path contains the generated protobuf bindings for Golang. 6 | -------------------------------------------------------------------------------- /go/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/k0swe/adif-json-protobuf/go 2 | 3 | go 1.21 4 | 5 | toolchain go1.24.3 6 | 7 | require ( 8 | github.com/golang/protobuf v1.5.4 9 | google.golang.org/protobuf v1.36.5 10 | ) 11 | -------------------------------------------------------------------------------- /go/go.sum: -------------------------------------------------------------------------------- 1 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 2 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 3 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 4 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= 5 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 6 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 7 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 8 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 9 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 10 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 11 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 12 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 13 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 14 | google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= 15 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 16 | google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= 17 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 18 | google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= 19 | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 20 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= 21 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 22 | google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= 23 | google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 24 | google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= 25 | google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 26 | google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= 27 | google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 28 | google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= 29 | google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 30 | google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= 31 | google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 32 | google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= 33 | google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 34 | google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= 35 | google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 36 | google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= 37 | google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 38 | google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= 39 | google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 40 | -------------------------------------------------------------------------------- /js/README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://badgen.net/npm/v/adif-pb)](https://www.npmjs.com/package/adif-pb) 2 | 3 | # ADIF protocol buffer: Typescript & Javascript bindings 4 | 5 | This path contains the generated protobuf bindings for Typescript and 6 | Javascript. 7 | -------------------------------------------------------------------------------- /js/adif_pb.d.ts: -------------------------------------------------------------------------------- 1 | // package: adif 2 | // file: adif.proto 3 | 4 | import * as jspb from "google-protobuf"; 5 | import * as google_protobuf_timestamp_pb from "google-protobuf/google/protobuf/timestamp_pb"; 6 | 7 | export class Adif extends jspb.Message { 8 | hasHeader(): boolean; 9 | clearHeader(): void; 10 | getHeader(): Header | undefined; 11 | setHeader(value?: Header): void; 12 | 13 | clearQsosList(): void; 14 | getQsosList(): Array; 15 | setQsosList(value: Array): void; 16 | addQsos(value?: Qso, index?: number): Qso; 17 | 18 | serializeBinary(): Uint8Array; 19 | toObject(includeInstance?: boolean): Adif.AsObject; 20 | static toObject(includeInstance: boolean, msg: Adif): Adif.AsObject; 21 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 22 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 23 | static serializeBinaryToWriter(message: Adif, writer: jspb.BinaryWriter): void; 24 | static deserializeBinary(bytes: Uint8Array): Adif; 25 | static deserializeBinaryFromReader(message: Adif, reader: jspb.BinaryReader): Adif; 26 | } 27 | 28 | export namespace Adif { 29 | export type AsObject = { 30 | header?: Header.AsObject, 31 | qsosList: Array, 32 | } 33 | } 34 | 35 | export class Header extends jspb.Message { 36 | getAdifVersion(): string; 37 | setAdifVersion(value: string): void; 38 | 39 | hasCreatedTimestamp(): boolean; 40 | clearCreatedTimestamp(): void; 41 | getCreatedTimestamp(): google_protobuf_timestamp_pb.Timestamp | undefined; 42 | setCreatedTimestamp(value?: google_protobuf_timestamp_pb.Timestamp): void; 43 | 44 | getProgramId(): string; 45 | setProgramId(value: string): void; 46 | 47 | getProgramVersion(): string; 48 | setProgramVersion(value: string): void; 49 | 50 | serializeBinary(): Uint8Array; 51 | toObject(includeInstance?: boolean): Header.AsObject; 52 | static toObject(includeInstance: boolean, msg: Header): Header.AsObject; 53 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 54 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 55 | static serializeBinaryToWriter(message: Header, writer: jspb.BinaryWriter): void; 56 | static deserializeBinary(bytes: Uint8Array): Header; 57 | static deserializeBinaryFromReader(message: Header, reader: jspb.BinaryReader): Header; 58 | } 59 | 60 | export namespace Header { 61 | export type AsObject = { 62 | adifVersion: string, 63 | createdTimestamp?: google_protobuf_timestamp_pb.Timestamp.AsObject, 64 | programId: string, 65 | programVersion: string, 66 | } 67 | } 68 | 69 | export class Qso extends jspb.Message { 70 | hasLoggingStation(): boolean; 71 | clearLoggingStation(): void; 72 | getLoggingStation(): Station | undefined; 73 | setLoggingStation(value?: Station): void; 74 | 75 | hasContactedStation(): boolean; 76 | clearContactedStation(): void; 77 | getContactedStation(): Station | undefined; 78 | setContactedStation(value?: Station): void; 79 | 80 | hasPropagation(): boolean; 81 | clearPropagation(): void; 82 | getPropagation(): Propagation | undefined; 83 | setPropagation(value?: Propagation): void; 84 | 85 | getBand(): string; 86 | setBand(value: string): void; 87 | 88 | getBandRx(): string; 89 | setBandRx(value: string): void; 90 | 91 | getFreq(): number; 92 | setFreq(value: number): void; 93 | 94 | getFreqRx(): number; 95 | setFreqRx(value: number): void; 96 | 97 | getMode(): string; 98 | setMode(value: string): void; 99 | 100 | getSubmode(): string; 101 | setSubmode(value: string): void; 102 | 103 | getDistanceKm(): number; 104 | setDistanceKm(value: number): void; 105 | 106 | hasTimeOn(): boolean; 107 | clearTimeOn(): void; 108 | getTimeOn(): google_protobuf_timestamp_pb.Timestamp | undefined; 109 | setTimeOn(value?: google_protobuf_timestamp_pb.Timestamp): void; 110 | 111 | hasTimeOff(): boolean; 112 | clearTimeOff(): void; 113 | getTimeOff(): google_protobuf_timestamp_pb.Timestamp | undefined; 114 | setTimeOff(value?: google_protobuf_timestamp_pb.Timestamp): void; 115 | 116 | getRandom(): boolean; 117 | setRandom(value: boolean): void; 118 | 119 | getRstReceived(): string; 120 | setRstReceived(value: string): void; 121 | 122 | getRstSent(): string; 123 | setRstSent(value: string): void; 124 | 125 | getSwl(): boolean; 126 | setSwl(value: boolean): void; 127 | 128 | getComplete(): string; 129 | setComplete(value: string): void; 130 | 131 | getComment(): string; 132 | setComment(value: string): void; 133 | 134 | getNotes(): string; 135 | setNotes(value: string): void; 136 | 137 | hasContest(): boolean; 138 | clearContest(): void; 139 | getContest(): ContestData | undefined; 140 | setContest(value?: ContestData): void; 141 | 142 | clearAwardSubmittedList(): void; 143 | getAwardSubmittedList(): Array; 144 | setAwardSubmittedList(value: Array): void; 145 | addAwardSubmitted(value: string, index?: number): string; 146 | 147 | clearAwardGrantedList(): void; 148 | getAwardGrantedList(): Array; 149 | setAwardGrantedList(value: Array): void; 150 | addAwardGranted(value: string, index?: number): string; 151 | 152 | clearCreditSubmittedList(): void; 153 | getCreditSubmittedList(): Array; 154 | setCreditSubmittedList(value: Array): void; 155 | addCreditSubmitted(value?: Credit, index?: number): Credit; 156 | 157 | clearCreditGrantedList(): void; 158 | getCreditGrantedList(): Array; 159 | setCreditGrantedList(value: Array): void; 160 | addCreditGranted(value?: Credit, index?: number): Credit; 161 | 162 | getPublicKey(): string; 163 | setPublicKey(value: string): void; 164 | 165 | hasClublog(): boolean; 166 | clearClublog(): void; 167 | getClublog(): Upload | undefined; 168 | setClublog(value?: Upload): void; 169 | 170 | hasHrdlog(): boolean; 171 | clearHrdlog(): void; 172 | getHrdlog(): Upload | undefined; 173 | setHrdlog(value?: Upload): void; 174 | 175 | hasQrzcom(): boolean; 176 | clearQrzcom(): void; 177 | getQrzcom(): Upload | undefined; 178 | setQrzcom(value?: Upload): void; 179 | 180 | hasEqsl(): boolean; 181 | clearEqsl(): void; 182 | getEqsl(): Qsl | undefined; 183 | setEqsl(value?: Qsl): void; 184 | 185 | hasLotw(): boolean; 186 | clearLotw(): void; 187 | getLotw(): Qsl | undefined; 188 | setLotw(value?: Qsl): void; 189 | 190 | hasCard(): boolean; 191 | clearCard(): void; 192 | getCard(): Qsl | undefined; 193 | setCard(value?: Qsl): void; 194 | 195 | getAppDefinedMap(): jspb.Map; 196 | clearAppDefinedMap(): void; 197 | serializeBinary(): Uint8Array; 198 | toObject(includeInstance?: boolean): Qso.AsObject; 199 | static toObject(includeInstance: boolean, msg: Qso): Qso.AsObject; 200 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 201 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 202 | static serializeBinaryToWriter(message: Qso, writer: jspb.BinaryWriter): void; 203 | static deserializeBinary(bytes: Uint8Array): Qso; 204 | static deserializeBinaryFromReader(message: Qso, reader: jspb.BinaryReader): Qso; 205 | } 206 | 207 | export namespace Qso { 208 | export type AsObject = { 209 | loggingStation?: Station.AsObject, 210 | contactedStation?: Station.AsObject, 211 | propagation?: Propagation.AsObject, 212 | band: string, 213 | bandRx: string, 214 | freq: number, 215 | freqRx: number, 216 | mode: string, 217 | submode: string, 218 | distanceKm: number, 219 | timeOn?: google_protobuf_timestamp_pb.Timestamp.AsObject, 220 | timeOff?: google_protobuf_timestamp_pb.Timestamp.AsObject, 221 | random: boolean, 222 | rstReceived: string, 223 | rstSent: string, 224 | swl: boolean, 225 | complete: string, 226 | comment: string, 227 | notes: string, 228 | contest?: ContestData.AsObject, 229 | awardSubmittedList: Array, 230 | awardGrantedList: Array, 231 | creditSubmittedList: Array, 232 | creditGrantedList: Array, 233 | publicKey: string, 234 | clublog?: Upload.AsObject, 235 | hrdlog?: Upload.AsObject, 236 | qrzcom?: Upload.AsObject, 237 | eqsl?: Qsl.AsObject, 238 | lotw?: Qsl.AsObject, 239 | card?: Qsl.AsObject, 240 | appDefinedMap: Array<[string, string]>, 241 | } 242 | } 243 | 244 | export class Station extends jspb.Message { 245 | getOpCall(): string; 246 | setOpCall(value: string): void; 247 | 248 | getOpName(): string; 249 | setOpName(value: string): void; 250 | 251 | getGridSquare(): string; 252 | setGridSquare(value: string): void; 253 | 254 | getLatitude(): number; 255 | setLatitude(value: number): void; 256 | 257 | getLongitude(): number; 258 | setLongitude(value: number): void; 259 | 260 | getPower(): number; 261 | setPower(value: number): void; 262 | 263 | getRig(): string; 264 | setRig(value: string): void; 265 | 266 | getAntenna(): string; 267 | setAntenna(value: string): void; 268 | 269 | getAntennaAzimuth(): number; 270 | setAntennaAzimuth(value: number): void; 271 | 272 | getAntennaElevation(): number; 273 | setAntennaElevation(value: number): void; 274 | 275 | getOwnerCall(): string; 276 | setOwnerCall(value: string): void; 277 | 278 | getStationCall(): string; 279 | setStationCall(value: string): void; 280 | 281 | getAge(): number; 282 | setAge(value: number): void; 283 | 284 | getSilentKey(): boolean; 285 | setSilentKey(value: boolean): void; 286 | 287 | getQslVia(): string; 288 | setQslVia(value: string): void; 289 | 290 | getAddress(): string; 291 | setAddress(value: string): void; 292 | 293 | getStreet(): string; 294 | setStreet(value: string): void; 295 | 296 | getCity(): string; 297 | setCity(value: string): void; 298 | 299 | getPostalCode(): string; 300 | setPostalCode(value: string): void; 301 | 302 | getCounty(): string; 303 | setCounty(value: string): void; 304 | 305 | getState(): string; 306 | setState(value: string): void; 307 | 308 | getCountry(): string; 309 | setCountry(value: string): void; 310 | 311 | getDxcc(): number; 312 | setDxcc(value: number): void; 313 | 314 | getContinent(): string; 315 | setContinent(value: string): void; 316 | 317 | getEmail(): string; 318 | setEmail(value: string): void; 319 | 320 | getWeb(): string; 321 | setWeb(value: string): void; 322 | 323 | getCqZone(): number; 324 | setCqZone(value: number): void; 325 | 326 | getItuZone(): number; 327 | setItuZone(value: number): void; 328 | 329 | getDarcDok(): string; 330 | setDarcDok(value: string): void; 331 | 332 | getFists(): number; 333 | setFists(value: number): void; 334 | 335 | getFistsCc(): number; 336 | setFistsCc(value: number): void; 337 | 338 | getIota(): string; 339 | setIota(value: string): void; 340 | 341 | getIotaIslandId(): number; 342 | setIotaIslandId(value: number): void; 343 | 344 | getPfx(): string; 345 | setPfx(value: string): void; 346 | 347 | getRegion(): string; 348 | setRegion(value: string): void; 349 | 350 | getSkcc(): string; 351 | setSkcc(value: string): void; 352 | 353 | getSig(): string; 354 | setSig(value: string): void; 355 | 356 | getSigInfo(): string; 357 | setSigInfo(value: string): void; 358 | 359 | getSotaRef(): string; 360 | setSotaRef(value: string): void; 361 | 362 | getTenTen(): number; 363 | setTenTen(value: number): void; 364 | 365 | getUsacaCounties(): string; 366 | setUsacaCounties(value: string): void; 367 | 368 | getUksmg(): number; 369 | setUksmg(value: number): void; 370 | 371 | getVuccGrids(): string; 372 | setVuccGrids(value: string): void; 373 | 374 | serializeBinary(): Uint8Array; 375 | toObject(includeInstance?: boolean): Station.AsObject; 376 | static toObject(includeInstance: boolean, msg: Station): Station.AsObject; 377 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 378 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 379 | static serializeBinaryToWriter(message: Station, writer: jspb.BinaryWriter): void; 380 | static deserializeBinary(bytes: Uint8Array): Station; 381 | static deserializeBinaryFromReader(message: Station, reader: jspb.BinaryReader): Station; 382 | } 383 | 384 | export namespace Station { 385 | export type AsObject = { 386 | opCall: string, 387 | opName: string, 388 | gridSquare: string, 389 | latitude: number, 390 | longitude: number, 391 | power: number, 392 | rig: string, 393 | antenna: string, 394 | antennaAzimuth: number, 395 | antennaElevation: number, 396 | ownerCall: string, 397 | stationCall: string, 398 | age: number, 399 | silentKey: boolean, 400 | qslVia: string, 401 | address: string, 402 | street: string, 403 | city: string, 404 | postalCode: string, 405 | county: string, 406 | state: string, 407 | country: string, 408 | dxcc: number, 409 | continent: string, 410 | email: string, 411 | web: string, 412 | cqZone: number, 413 | ituZone: number, 414 | darcDok: string, 415 | fists: number, 416 | fistsCc: number, 417 | iota: string, 418 | iotaIslandId: number, 419 | pfx: string, 420 | region: string, 421 | skcc: string, 422 | sig: string, 423 | sigInfo: string, 424 | sotaRef: string, 425 | tenTen: number, 426 | usacaCounties: string, 427 | uksmg: number, 428 | vuccGrids: string, 429 | } 430 | } 431 | 432 | export class Propagation extends jspb.Message { 433 | getPropagationMode(): string; 434 | setPropagationMode(value: string): void; 435 | 436 | getAIndex(): number; 437 | setAIndex(value: number): void; 438 | 439 | getKIndex(): number; 440 | setKIndex(value: number): void; 441 | 442 | getSolarFluxIndex(): number; 443 | setSolarFluxIndex(value: number): void; 444 | 445 | getAntPath(): string; 446 | setAntPath(value: string): void; 447 | 448 | getForceInit(): boolean; 449 | setForceInit(value: boolean): void; 450 | 451 | getMaxBursts(): number; 452 | setMaxBursts(value: number): void; 453 | 454 | getMeteorShowerName(): string; 455 | setMeteorShowerName(value: string): void; 456 | 457 | getNrBursts(): number; 458 | setNrBursts(value: number): void; 459 | 460 | getNrPings(): number; 461 | setNrPings(value: number): void; 462 | 463 | getSatMode(): string; 464 | setSatMode(value: string): void; 465 | 466 | getSatName(): string; 467 | setSatName(value: string): void; 468 | 469 | serializeBinary(): Uint8Array; 470 | toObject(includeInstance?: boolean): Propagation.AsObject; 471 | static toObject(includeInstance: boolean, msg: Propagation): Propagation.AsObject; 472 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 473 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 474 | static serializeBinaryToWriter(message: Propagation, writer: jspb.BinaryWriter): void; 475 | static deserializeBinary(bytes: Uint8Array): Propagation; 476 | static deserializeBinaryFromReader(message: Propagation, reader: jspb.BinaryReader): Propagation; 477 | } 478 | 479 | export namespace Propagation { 480 | export type AsObject = { 481 | propagationMode: string, 482 | aIndex: number, 483 | kIndex: number, 484 | solarFluxIndex: number, 485 | antPath: string, 486 | forceInit: boolean, 487 | maxBursts: number, 488 | meteorShowerName: string, 489 | nrBursts: number, 490 | nrPings: number, 491 | satMode: string, 492 | satName: string, 493 | } 494 | } 495 | 496 | export class ContestData extends jspb.Message { 497 | getContestId(): string; 498 | setContestId(value: string): void; 499 | 500 | getSerialSent(): string; 501 | setSerialSent(value: string): void; 502 | 503 | getSerialReceived(): string; 504 | setSerialReceived(value: string): void; 505 | 506 | getArrlSection(): string; 507 | setArrlSection(value: string): void; 508 | 509 | getStationClass(): string; 510 | setStationClass(value: string): void; 511 | 512 | getCheck(): string; 513 | setCheck(value: string): void; 514 | 515 | getPrecedence(): string; 516 | setPrecedence(value: string): void; 517 | 518 | serializeBinary(): Uint8Array; 519 | toObject(includeInstance?: boolean): ContestData.AsObject; 520 | static toObject(includeInstance: boolean, msg: ContestData): ContestData.AsObject; 521 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 522 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 523 | static serializeBinaryToWriter(message: ContestData, writer: jspb.BinaryWriter): void; 524 | static deserializeBinary(bytes: Uint8Array): ContestData; 525 | static deserializeBinaryFromReader(message: ContestData, reader: jspb.BinaryReader): ContestData; 526 | } 527 | 528 | export namespace ContestData { 529 | export type AsObject = { 530 | contestId: string, 531 | serialSent: string, 532 | serialReceived: string, 533 | arrlSection: string, 534 | stationClass: string, 535 | check: string, 536 | precedence: string, 537 | } 538 | } 539 | 540 | export class Credit extends jspb.Message { 541 | getCredit(): string; 542 | setCredit(value: string): void; 543 | 544 | getQslMedium(): string; 545 | setQslMedium(value: string): void; 546 | 547 | serializeBinary(): Uint8Array; 548 | toObject(includeInstance?: boolean): Credit.AsObject; 549 | static toObject(includeInstance: boolean, msg: Credit): Credit.AsObject; 550 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 551 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 552 | static serializeBinaryToWriter(message: Credit, writer: jspb.BinaryWriter): void; 553 | static deserializeBinary(bytes: Uint8Array): Credit; 554 | static deserializeBinaryFromReader(message: Credit, reader: jspb.BinaryReader): Credit; 555 | } 556 | 557 | export namespace Credit { 558 | export type AsObject = { 559 | credit: string, 560 | qslMedium: string, 561 | } 562 | } 563 | 564 | export class Upload extends jspb.Message { 565 | hasUploadDate(): boolean; 566 | clearUploadDate(): void; 567 | getUploadDate(): google_protobuf_timestamp_pb.Timestamp | undefined; 568 | setUploadDate(value?: google_protobuf_timestamp_pb.Timestamp): void; 569 | 570 | getUploadStatus(): UploadStatusMap[keyof UploadStatusMap]; 571 | setUploadStatus(value: UploadStatusMap[keyof UploadStatusMap]): void; 572 | 573 | serializeBinary(): Uint8Array; 574 | toObject(includeInstance?: boolean): Upload.AsObject; 575 | static toObject(includeInstance: boolean, msg: Upload): Upload.AsObject; 576 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 577 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 578 | static serializeBinaryToWriter(message: Upload, writer: jspb.BinaryWriter): void; 579 | static deserializeBinary(bytes: Uint8Array): Upload; 580 | static deserializeBinaryFromReader(message: Upload, reader: jspb.BinaryReader): Upload; 581 | } 582 | 583 | export namespace Upload { 584 | export type AsObject = { 585 | uploadDate?: google_protobuf_timestamp_pb.Timestamp.AsObject, 586 | uploadStatus: UploadStatusMap[keyof UploadStatusMap], 587 | } 588 | } 589 | 590 | export class Qsl extends jspb.Message { 591 | hasSentDate(): boolean; 592 | clearSentDate(): void; 593 | getSentDate(): google_protobuf_timestamp_pb.Timestamp | undefined; 594 | setSentDate(value?: google_protobuf_timestamp_pb.Timestamp): void; 595 | 596 | getSentStatus(): string; 597 | setSentStatus(value: string): void; 598 | 599 | getSentVia(): string; 600 | setSentVia(value: string): void; 601 | 602 | hasReceivedDate(): boolean; 603 | clearReceivedDate(): void; 604 | getReceivedDate(): google_protobuf_timestamp_pb.Timestamp | undefined; 605 | setReceivedDate(value?: google_protobuf_timestamp_pb.Timestamp): void; 606 | 607 | getReceivedStatus(): string; 608 | setReceivedStatus(value: string): void; 609 | 610 | getReceivedVia(): string; 611 | setReceivedVia(value: string): void; 612 | 613 | getReceivedMessage(): string; 614 | setReceivedMessage(value: string): void; 615 | 616 | serializeBinary(): Uint8Array; 617 | toObject(includeInstance?: boolean): Qsl.AsObject; 618 | static toObject(includeInstance: boolean, msg: Qsl): Qsl.AsObject; 619 | static extensions: {[key: number]: jspb.ExtensionFieldInfo}; 620 | static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; 621 | static serializeBinaryToWriter(message: Qsl, writer: jspb.BinaryWriter): void; 622 | static deserializeBinary(bytes: Uint8Array): Qsl; 623 | static deserializeBinaryFromReader(message: Qsl, reader: jspb.BinaryReader): Qsl; 624 | } 625 | 626 | export namespace Qsl { 627 | export type AsObject = { 628 | sentDate?: google_protobuf_timestamp_pb.Timestamp.AsObject, 629 | sentStatus: string, 630 | sentVia: string, 631 | receivedDate?: google_protobuf_timestamp_pb.Timestamp.AsObject, 632 | receivedStatus: string, 633 | receivedVia: string, 634 | receivedMessage: string, 635 | } 636 | } 637 | 638 | export interface UploadStatusMap { 639 | UNKNOWN: 0; 640 | UPLOAD_COMPLETE: 1; 641 | DO_NOT_UPLOAD: 2; 642 | MODIFIED_AFTER_UPLOAD: 3; 643 | } 644 | 645 | export const UploadStatus: UploadStatusMap; 646 | 647 | -------------------------------------------------------------------------------- /js/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "adif-pb", 3 | "version": "0.1.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "adif-pb", 9 | "version": "0.1.1", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "@types/google-protobuf": "3.15.12", 13 | "google-protobuf": "3.21.4" 14 | } 15 | }, 16 | "node_modules/@types/google-protobuf": { 17 | "version": "3.15.12", 18 | "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", 19 | "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==" 20 | }, 21 | "node_modules/google-protobuf": { 22 | "version": "3.21.4", 23 | "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", 24 | "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==" 25 | } 26 | }, 27 | "dependencies": { 28 | "@types/google-protobuf": { 29 | "version": "3.15.12", 30 | "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", 31 | "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==" 32 | }, 33 | "google-protobuf": { 34 | "version": "3.21.4", 35 | "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", 36 | "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "adif-pb", 3 | "version": "0.1.1", 4 | "description": "Protocol buffers for exchanging amateur radio logs", 5 | "dependencies": { 6 | "@types/google-protobuf": "3.15.12", 7 | "google-protobuf": "3.21.4" 8 | }, 9 | "license": "Apache-2.0", 10 | "repository": "https://github.com/k0swe/adif-json-protobuf" 11 | } 12 | -------------------------------------------------------------------------------- /jsonschema/Adif.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Adif", 4 | "definitions": { 5 | "Adif": { 6 | "properties": { 7 | "header": { 8 | "$ref": "#/definitions/adif.Header", 9 | "additionalProperties": true 10 | }, 11 | "qsos": { 12 | "items": { 13 | "$ref": "#/definitions/adif.Qso" 14 | }, 15 | "type": "array" 16 | } 17 | }, 18 | "additionalProperties": true, 19 | "type": "object" 20 | }, 21 | "adif.ContestData": { 22 | "properties": { 23 | "contest_id": { 24 | "type": "string", 25 | "description": "Contest Identifier" 26 | }, 27 | "serial_sent": { 28 | "type": "string", 29 | "description": "contest QSO transmitted serial number" 30 | }, 31 | "serial_received": { 32 | "type": "string", 33 | "description": "contest QSO received serial number" 34 | }, 35 | "arrl_section": { 36 | "type": "string", 37 | "description": "ARRL section" 38 | }, 39 | "station_class": { 40 | "type": "string", 41 | "description": "contest class (e.g. for ARRL Field Day)" 42 | }, 43 | "check": { 44 | "type": "string", 45 | "description": "contest check (e.g. for ARRL Sweepstakes)" 46 | }, 47 | "precedence": { 48 | "type": "string", 49 | "description": "contest precedence (e.g. for ARRL Sweepstakes)" 50 | } 51 | }, 52 | "additionalProperties": true, 53 | "type": "object", 54 | "description": "QSO fields that are relevant to contests only" 55 | }, 56 | "adif.Credit": { 57 | "properties": { 58 | "credit": { 59 | "type": "string" 60 | }, 61 | "qsl_medium": { 62 | "type": "string" 63 | } 64 | }, 65 | "additionalProperties": true, 66 | "type": "object", 67 | "description": "data about using this QSO for award credit" 68 | }, 69 | "adif.Header": { 70 | "properties": { 71 | "adif_version": { 72 | "type": "string", 73 | "description": "identifies the version of ADIF used in this file in the format X.Y.Z" 74 | }, 75 | "created_timestamp": { 76 | "type": "string", 77 | "description": "identifies the UTC date and time that the file was created", 78 | "format": "date-time" 79 | }, 80 | "program_id": { 81 | "type": "string", 82 | "description": "identifies the name of the logger, converter, or utility that created or processed this ADIF\n file" 83 | }, 84 | "program_version": { 85 | "type": "string", 86 | "description": "identifies the version of the logger, converter, or utility that created or processed this ADIF\n file\n\nTODO: protobuf extensions for user defined fields?" 87 | } 88 | }, 89 | "additionalProperties": true, 90 | "type": "object", 91 | "description": "metadata about the ADIF content" 92 | }, 93 | "adif.Propagation": { 94 | "properties": { 95 | "propagation_mode": { 96 | "type": "string", 97 | "description": "QSO propagation mode" 98 | }, 99 | "a_index": { 100 | "type": "integer", 101 | "description": "the geomagnetic A index at the time of the QSO in the range 0 to 400 (inclusive)" 102 | }, 103 | "k_index": { 104 | "type": "integer", 105 | "description": "the geomagnetic K index at the time of the QSO in the range 0 to 9 (inclusive)" 106 | }, 107 | "solar_flux_index": { 108 | "type": "integer", 109 | "description": "the solar flux at the time of the QSO in the range 0 to 300 (inclusive)." 110 | }, 111 | "ant_path": { 112 | "type": "string", 113 | "description": "the signal path" 114 | }, 115 | "force_init": { 116 | "type": "boolean", 117 | "description": "new EME \"initial\"" 118 | }, 119 | "max_bursts": { 120 | "type": "integer", 121 | "description": "maximum length of meteor scatter bursts heard by the logging station, in seconds" 122 | }, 123 | "meteor_shower_name": { 124 | "type": "string", 125 | "description": "For Meteor Scatter QSOs, the name of the meteor shower in progress" 126 | }, 127 | "nr_bursts": { 128 | "type": "integer", 129 | "description": "the number of meteor scatter bursts heard by the logging stationthe number of meteor scatter\n bursts heard by the logging station" 130 | }, 131 | "nr_pings": { 132 | "type": "integer", 133 | "description": "the number of meteor scatter pings heard by the logging station" 134 | }, 135 | "sat_mode": { 136 | "type": "string", 137 | "description": "satellite mode" 138 | }, 139 | "sat_name": { 140 | "type": "string", 141 | "description": "name of satellite" 142 | } 143 | }, 144 | "additionalProperties": true, 145 | "type": "object", 146 | "description": "QSO fields describing radio propagation conditions" 147 | }, 148 | "adif.Qsl": { 149 | "properties": { 150 | "sent_date": { 151 | "type": "string", 152 | "description": "date QSL sent", 153 | "format": "date-time" 154 | }, 155 | "sent_status": { 156 | "type": "string", 157 | "description": "QSL sent status" 158 | }, 159 | "sent_via": { 160 | "type": "string", 161 | "description": "if QSL_SENT is set to 'Y', the means by which the QSL was sent by the logging station;\n otherwise, the means by which the logging station intends to convey the QSL" 162 | }, 163 | "received_date": { 164 | "type": "string", 165 | "description": "date QSL received", 166 | "format": "date-time" 167 | }, 168 | "received_status": { 169 | "type": "string", 170 | "description": "QSL received status" 171 | }, 172 | "received_via": { 173 | "type": "string", 174 | "description": "if QSL_RCVD is set to 'Y' or 'V', the means by which the QSL was received by the logging\n station; otherwise, the means by which the logging station requested or intends to request that\n the QSL be conveyed." 175 | }, 176 | "received_message": { 177 | "type": "string", 178 | "description": "QSL card message" 179 | } 180 | }, 181 | "additionalProperties": true, 182 | "type": "object", 183 | "description": "QSL data about confirmation of this contact" 184 | }, 185 | "adif.Qso": { 186 | "properties": { 187 | "logging_station": { 188 | "$ref": "#/definitions/adif.Station", 189 | "additionalProperties": true 190 | }, 191 | "contacted_station": { 192 | "$ref": "#/definitions/adif.Station", 193 | "additionalProperties": true 194 | }, 195 | "propagation": { 196 | "$ref": "#/definitions/adif.Propagation", 197 | "additionalProperties": true 198 | }, 199 | "band": { 200 | "type": "string", 201 | "description": "logging station's transmit band" 202 | }, 203 | "band_rx": { 204 | "type": "string", 205 | "description": "in a split frequency QSO, the logging station's receiving band" 206 | }, 207 | "freq": { 208 | "type": "number", 209 | "description": "logging station's transmit frequency in Megahertz" 210 | }, 211 | "freq_rx": { 212 | "type": "number", 213 | "description": "in a split frequency QSO, the logging station's receiving frequency in Megahertz" 214 | }, 215 | "mode": { 216 | "type": "string", 217 | "description": "QSO Mode" 218 | }, 219 | "submode": { 220 | "type": "string", 221 | "description": "QSO Submode" 222 | }, 223 | "distance_km": { 224 | "type": "integer", 225 | "description": "the distance between the logging station and the contacted station" 226 | }, 227 | "time_on": { 228 | "type": "string", 229 | "description": "date and time the QSO started", 230 | "format": "date-time" 231 | }, 232 | "time_off": { 233 | "type": "string", 234 | "description": "date and time the QSO ended", 235 | "format": "date-time" 236 | }, 237 | "random": { 238 | "type": "boolean", 239 | "description": "indicates whether the QSO was random or scheduled" 240 | }, 241 | "rst_received": { 242 | "type": "string", 243 | "description": "signal report from the contacted station" 244 | }, 245 | "rst_sent": { 246 | "type": "string", 247 | "description": "signal report sent to the contacted station" 248 | }, 249 | "swl": { 250 | "type": "boolean", 251 | "description": "indicates that the QSO information pertains to an SWL report" 252 | }, 253 | "complete": { 254 | "type": "string", 255 | "description": "indicates whether the QSO was complete from the perspective of the logging station" 256 | }, 257 | "comment": { 258 | "type": "string", 259 | "description": "comment field for QSO (recommended use: information of interest to the contacted station's\n operator)" 260 | }, 261 | "notes": { 262 | "type": "string", 263 | "description": "QSO notes (recommended use: information of interest to the logging station's operator)" 264 | }, 265 | "contest": { 266 | "$ref": "#/definitions/adif.ContestData", 267 | "additionalProperties": true 268 | }, 269 | "award_submitted": { 270 | "items": { 271 | "type": "string" 272 | }, 273 | "type": "array", 274 | "description": "TODO: Award message type\n the list of awards submitted to a sponsor" 275 | }, 276 | "award_granted": { 277 | "items": { 278 | "type": "string" 279 | }, 280 | "type": "array", 281 | "description": "the list of awards granted by a sponsor" 282 | }, 283 | "credit_submitted": { 284 | "items": { 285 | "$ref": "#/definitions/adif.Credit" 286 | }, 287 | "type": "array", 288 | "description": "the list of credits sought for this QSO" 289 | }, 290 | "credit_granted": { 291 | "items": { 292 | "$ref": "#/definitions/adif.Credit" 293 | }, 294 | "type": "array", 295 | "description": "the list of credits granted to this QSO" 296 | }, 297 | "public_key": { 298 | "type": "string", 299 | "description": "public encryption key" 300 | }, 301 | "clublog": { 302 | "$ref": "#/definitions/adif.Upload", 303 | "additionalProperties": true, 304 | "description": "clublog.org upload status" 305 | }, 306 | "hrdlog": { 307 | "$ref": "#/definitions/adif.Upload", 308 | "additionalProperties": true, 309 | "description": "HRDLog.net upload status" 310 | }, 311 | "qrzcom": { 312 | "$ref": "#/definitions/adif.Upload", 313 | "additionalProperties": true, 314 | "description": "QRZ.com upload status" 315 | }, 316 | "eqsl": { 317 | "$ref": "#/definitions/adif.Qsl", 318 | "additionalProperties": true, 319 | "description": "eQSL.cc QSL status" 320 | }, 321 | "lotw": { 322 | "$ref": "#/definitions/adif.Qsl", 323 | "additionalProperties": true, 324 | "description": "ARRL Logbook of the World QSL status" 325 | }, 326 | "card": { 327 | "$ref": "#/definitions/adif.Qsl", 328 | "additionalProperties": true, 329 | "description": "Physical QSL card status" 330 | }, 331 | "app_defined": { 332 | "additionalProperties": { 333 | "type": "string" 334 | }, 335 | "type": "object", 336 | "description": "Application-defined fields. Keys should follow ADIF 3.1.1 IV.A.4, i.e.\n APP_{PROGRAMID}_{FIELDNAME}" 337 | } 338 | }, 339 | "additionalProperties": true, 340 | "type": "object", 341 | "description": "Data about one radio contact" 342 | }, 343 | "adif.Station": { 344 | "properties": { 345 | "op_call": { 346 | "type": "string", 347 | "description": "operator's callsign" 348 | }, 349 | "op_name": { 350 | "type": "string", 351 | "description": "operator's name" 352 | }, 353 | "grid_square": { 354 | "type": "string", 355 | "description": "Maidenhead Grid Square" 356 | }, 357 | "latitude": { 358 | "type": "number", 359 | "description": "latitude (north positive)" 360 | }, 361 | "longitude": { 362 | "type": "number", 363 | "description": "longitude (east positive)" 364 | }, 365 | "power": { 366 | "type": "number", 367 | "description": "transmitter power in watts" 368 | }, 369 | "rig": { 370 | "type": "string", 371 | "description": "description of the station's equipment" 372 | }, 373 | "antenna": { 374 | "type": "string", 375 | "description": "description of the station antenna" 376 | }, 377 | "antenna_azimuth": { 378 | "type": "integer", 379 | "description": "antenna beam azimuth in degrees" 380 | }, 381 | "antenna_elevation": { 382 | "type": "integer", 383 | "description": "antenna beam elevation in degrees" 384 | }, 385 | "owner_call": { 386 | "type": "string", 387 | "description": "station owner's callsign" 388 | }, 389 | "station_call": { 390 | "type": "string", 391 | "description": "callsign used over the air, e.g. a club callsign" 392 | }, 393 | "age": { 394 | "type": "integer", 395 | "description": "the operator's age in years in the range 0 to 120 (inclusive)" 396 | }, 397 | "silent_key": { 398 | "type": "boolean", 399 | "description": "indicates that the operator is now a Silent Key" 400 | }, 401 | "qsl_via": { 402 | "type": "string", 403 | "description": "preferred QSL route" 404 | }, 405 | "address": { 406 | "type": "string", 407 | "description": "complete mailing address: full name, street address, city, postal code, and country" 408 | }, 409 | "street": { 410 | "type": "string", 411 | "description": "street" 412 | }, 413 | "city": { 414 | "type": "string", 415 | "description": "city" 416 | }, 417 | "postal_code": { 418 | "type": "string", 419 | "description": "postal code" 420 | }, 421 | "county": { 422 | "type": "string", 423 | "description": "Secondary Administrative Subdivision (e.g. US county, JA Gun)" 424 | }, 425 | "state": { 426 | "type": "string", 427 | "description": "the code for the Primary Administrative Subdivision (e.g. US State, JA Island, VE Province)" 428 | }, 429 | "country": { 430 | "type": "string", 431 | "description": "DXCC entity name" 432 | }, 433 | "dxcc": { 434 | "type": "integer", 435 | "description": "DXCC Entity Code" 436 | }, 437 | "continent": { 438 | "type": "string", 439 | "description": "continent" 440 | }, 441 | "email": { 442 | "type": "string", 443 | "description": "email address" 444 | }, 445 | "web": { 446 | "type": "string", 447 | "description": "the station's website URL" 448 | }, 449 | "cq_zone": { 450 | "type": "integer", 451 | "description": "CQ Zone in the range 1 to 40 (inclusive)" 452 | }, 453 | "itu_zone": { 454 | "type": "integer", 455 | "description": "ITU zone in the range 1 to 90 (inclusive)" 456 | }, 457 | "darc_dok": { 458 | "type": "string", 459 | "description": "DARC DOK (District Location Code)" 460 | }, 461 | "fists": { 462 | "type": "integer", 463 | "description": "FISTS CW Club member number" 464 | }, 465 | "fists_cc": { 466 | "type": "integer", 467 | "description": "FISTS CW Club Century Certificate (CC) number" 468 | }, 469 | "iota": { 470 | "type": "string", 471 | "description": "IOTA designator, in format CC-XXX" 472 | }, 473 | "iota_island_id": { 474 | "type": "integer", 475 | "description": "IOTA Island Identifier" 476 | }, 477 | "pfx": { 478 | "type": "string", 479 | "description": "WPX prefix" 480 | }, 481 | "region": { 482 | "type": "string", 483 | "description": "WAE or CQ entity contained within a DXCC entity" 484 | }, 485 | "skcc": { 486 | "type": "string", 487 | "description": "Straight Key Century Club (SKCC) member information" 488 | }, 489 | "sig": { 490 | "type": "string", 491 | "description": "special interest activity or event" 492 | }, 493 | "sig_info": { 494 | "type": "string", 495 | "description": "special interest activity or event information" 496 | }, 497 | "sota_ref": { 498 | "type": "string", 499 | "description": "International SOTA Reference" 500 | }, 501 | "ten_ten": { 502 | "type": "integer", 503 | "description": "Ten-Ten number" 504 | }, 505 | "usaca_counties": { 506 | "type": "string", 507 | "description": "two US counties in the case where the logging station is located on a border between two\n counties, representing counties that the contacted station may claim for the CQ Magazine USA-CA\n award program" 508 | }, 509 | "uksmg": { 510 | "type": "integer", 511 | "description": "UKSMG member number" 512 | }, 513 | "vucc_grids": { 514 | "type": "string", 515 | "description": "two or four adjacent Maidenhead grid locators, each four characters long, representing the\n logging station's grid squares that the contacted station may claim for the ARRL VUCC award\n program" 516 | } 517 | }, 518 | "additionalProperties": true, 519 | "type": "object", 520 | "description": "QSO fields describing one of the stations involved in the contact" 521 | }, 522 | "adif.Upload": { 523 | "properties": { 524 | "upload_date": { 525 | "type": "string", 526 | "format": "date-time" 527 | }, 528 | "upload_status": { 529 | "enum": [ 530 | "UNKNOWN", 531 | 0, 532 | "UPLOAD_COMPLETE", 533 | 1, 534 | "DO_NOT_UPLOAD", 535 | 2, 536 | "MODIFIED_AFTER_UPLOAD", 537 | 3 538 | ], 539 | "oneOf": [ 540 | { 541 | "type": "string" 542 | }, 543 | { 544 | "type": "integer" 545 | } 546 | ] 547 | } 548 | }, 549 | "additionalProperties": true, 550 | "type": "object", 551 | "description": "data about uploading this QSO to online logbook sites" 552 | } 553 | } 554 | } -------------------------------------------------------------------------------- /jsonschema/ContestData.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/ContestData", 4 | "definitions": { 5 | "ContestData": { 6 | "properties": { 7 | "contest_id": { 8 | "type": "string", 9 | "description": "Contest Identifier" 10 | }, 11 | "serial_sent": { 12 | "type": "string", 13 | "description": "contest QSO transmitted serial number" 14 | }, 15 | "serial_received": { 16 | "type": "string", 17 | "description": "contest QSO received serial number" 18 | }, 19 | "arrl_section": { 20 | "type": "string", 21 | "description": "ARRL section" 22 | }, 23 | "station_class": { 24 | "type": "string", 25 | "description": "contest class (e.g. for ARRL Field Day)" 26 | }, 27 | "check": { 28 | "type": "string", 29 | "description": "contest check (e.g. for ARRL Sweepstakes)" 30 | }, 31 | "precedence": { 32 | "type": "string", 33 | "description": "contest precedence (e.g. for ARRL Sweepstakes)" 34 | } 35 | }, 36 | "additionalProperties": true, 37 | "type": "object", 38 | "description": "QSO fields that are relevant to contests only" 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /jsonschema/Credit.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Credit", 4 | "definitions": { 5 | "Credit": { 6 | "properties": { 7 | "credit": { 8 | "type": "string" 9 | }, 10 | "qsl_medium": { 11 | "type": "string" 12 | } 13 | }, 14 | "additionalProperties": true, 15 | "type": "object", 16 | "description": "data about using this QSO for award credit" 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /jsonschema/Header.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Header", 4 | "definitions": { 5 | "Header": { 6 | "properties": { 7 | "adif_version": { 8 | "type": "string", 9 | "description": "identifies the version of ADIF used in this file in the format X.Y.Z" 10 | }, 11 | "created_timestamp": { 12 | "type": "string", 13 | "description": "identifies the UTC date and time that the file was created", 14 | "format": "date-time" 15 | }, 16 | "program_id": { 17 | "type": "string", 18 | "description": "identifies the name of the logger, converter, or utility that created or processed this ADIF\n file" 19 | }, 20 | "program_version": { 21 | "type": "string", 22 | "description": "identifies the version of the logger, converter, or utility that created or processed this ADIF\n file\n\nTODO: protobuf extensions for user defined fields?" 23 | } 24 | }, 25 | "additionalProperties": true, 26 | "type": "object", 27 | "description": "metadata about the ADIF content" 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /jsonschema/Propagation.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Propagation", 4 | "definitions": { 5 | "Propagation": { 6 | "properties": { 7 | "propagation_mode": { 8 | "type": "string", 9 | "description": "QSO propagation mode" 10 | }, 11 | "a_index": { 12 | "type": "integer", 13 | "description": "the geomagnetic A index at the time of the QSO in the range 0 to 400 (inclusive)" 14 | }, 15 | "k_index": { 16 | "type": "integer", 17 | "description": "the geomagnetic K index at the time of the QSO in the range 0 to 9 (inclusive)" 18 | }, 19 | "solar_flux_index": { 20 | "type": "integer", 21 | "description": "the solar flux at the time of the QSO in the range 0 to 300 (inclusive)." 22 | }, 23 | "ant_path": { 24 | "type": "string", 25 | "description": "the signal path" 26 | }, 27 | "force_init": { 28 | "type": "boolean", 29 | "description": "new EME \"initial\"" 30 | }, 31 | "max_bursts": { 32 | "type": "integer", 33 | "description": "maximum length of meteor scatter bursts heard by the logging station, in seconds" 34 | }, 35 | "meteor_shower_name": { 36 | "type": "string", 37 | "description": "For Meteor Scatter QSOs, the name of the meteor shower in progress" 38 | }, 39 | "nr_bursts": { 40 | "type": "integer", 41 | "description": "the number of meteor scatter bursts heard by the logging stationthe number of meteor scatter\n bursts heard by the logging station" 42 | }, 43 | "nr_pings": { 44 | "type": "integer", 45 | "description": "the number of meteor scatter pings heard by the logging station" 46 | }, 47 | "sat_mode": { 48 | "type": "string", 49 | "description": "satellite mode" 50 | }, 51 | "sat_name": { 52 | "type": "string", 53 | "description": "name of satellite" 54 | } 55 | }, 56 | "additionalProperties": true, 57 | "type": "object", 58 | "description": "QSO fields describing radio propagation conditions" 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /jsonschema/Qsl.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Qsl", 4 | "definitions": { 5 | "Qsl": { 6 | "properties": { 7 | "sent_date": { 8 | "type": "string", 9 | "description": "date QSL sent", 10 | "format": "date-time" 11 | }, 12 | "sent_status": { 13 | "type": "string", 14 | "description": "QSL sent status" 15 | }, 16 | "sent_via": { 17 | "type": "string", 18 | "description": "if QSL_SENT is set to 'Y', the means by which the QSL was sent by the logging station;\n otherwise, the means by which the logging station intends to convey the QSL" 19 | }, 20 | "received_date": { 21 | "type": "string", 22 | "description": "date QSL received", 23 | "format": "date-time" 24 | }, 25 | "received_status": { 26 | "type": "string", 27 | "description": "QSL received status" 28 | }, 29 | "received_via": { 30 | "type": "string", 31 | "description": "if QSL_RCVD is set to 'Y' or 'V', the means by which the QSL was received by the logging\n station; otherwise, the means by which the logging station requested or intends to request that\n the QSL be conveyed." 32 | }, 33 | "received_message": { 34 | "type": "string", 35 | "description": "QSL card message" 36 | } 37 | }, 38 | "additionalProperties": true, 39 | "type": "object", 40 | "description": "QSL data about confirmation of this contact" 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /jsonschema/Qso.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Qso", 4 | "definitions": { 5 | "Qso": { 6 | "properties": { 7 | "logging_station": { 8 | "$ref": "#/definitions/adif.Station", 9 | "additionalProperties": true 10 | }, 11 | "contacted_station": { 12 | "$ref": "#/definitions/adif.Station", 13 | "additionalProperties": true 14 | }, 15 | "propagation": { 16 | "$ref": "#/definitions/adif.Propagation", 17 | "additionalProperties": true 18 | }, 19 | "band": { 20 | "type": "string", 21 | "description": "logging station's transmit band" 22 | }, 23 | "band_rx": { 24 | "type": "string", 25 | "description": "in a split frequency QSO, the logging station's receiving band" 26 | }, 27 | "freq": { 28 | "type": "number", 29 | "description": "logging station's transmit frequency in Megahertz" 30 | }, 31 | "freq_rx": { 32 | "type": "number", 33 | "description": "in a split frequency QSO, the logging station's receiving frequency in Megahertz" 34 | }, 35 | "mode": { 36 | "type": "string", 37 | "description": "QSO Mode" 38 | }, 39 | "submode": { 40 | "type": "string", 41 | "description": "QSO Submode" 42 | }, 43 | "distance_km": { 44 | "type": "integer", 45 | "description": "the distance between the logging station and the contacted station" 46 | }, 47 | "time_on": { 48 | "type": "string", 49 | "description": "date and time the QSO started", 50 | "format": "date-time" 51 | }, 52 | "time_off": { 53 | "type": "string", 54 | "description": "date and time the QSO ended", 55 | "format": "date-time" 56 | }, 57 | "random": { 58 | "type": "boolean", 59 | "description": "indicates whether the QSO was random or scheduled" 60 | }, 61 | "rst_received": { 62 | "type": "string", 63 | "description": "signal report from the contacted station" 64 | }, 65 | "rst_sent": { 66 | "type": "string", 67 | "description": "signal report sent to the contacted station" 68 | }, 69 | "swl": { 70 | "type": "boolean", 71 | "description": "indicates that the QSO information pertains to an SWL report" 72 | }, 73 | "complete": { 74 | "type": "string", 75 | "description": "indicates whether the QSO was complete from the perspective of the logging station" 76 | }, 77 | "comment": { 78 | "type": "string", 79 | "description": "comment field for QSO (recommended use: information of interest to the contacted station's\n operator)" 80 | }, 81 | "notes": { 82 | "type": "string", 83 | "description": "QSO notes (recommended use: information of interest to the logging station's operator)" 84 | }, 85 | "contest": { 86 | "$ref": "#/definitions/adif.ContestData", 87 | "additionalProperties": true 88 | }, 89 | "award_submitted": { 90 | "items": { 91 | "type": "string" 92 | }, 93 | "type": "array", 94 | "description": "TODO: Award message type\n the list of awards submitted to a sponsor" 95 | }, 96 | "award_granted": { 97 | "items": { 98 | "type": "string" 99 | }, 100 | "type": "array", 101 | "description": "the list of awards granted by a sponsor" 102 | }, 103 | "credit_submitted": { 104 | "items": { 105 | "$ref": "#/definitions/adif.Credit" 106 | }, 107 | "type": "array", 108 | "description": "the list of credits sought for this QSO" 109 | }, 110 | "credit_granted": { 111 | "items": { 112 | "$ref": "#/definitions/adif.Credit" 113 | }, 114 | "type": "array", 115 | "description": "the list of credits granted to this QSO" 116 | }, 117 | "public_key": { 118 | "type": "string", 119 | "description": "public encryption key" 120 | }, 121 | "clublog": { 122 | "$ref": "#/definitions/adif.Upload", 123 | "additionalProperties": true, 124 | "description": "clublog.org upload status" 125 | }, 126 | "hrdlog": { 127 | "$ref": "#/definitions/adif.Upload", 128 | "additionalProperties": true, 129 | "description": "HRDLog.net upload status" 130 | }, 131 | "qrzcom": { 132 | "$ref": "#/definitions/adif.Upload", 133 | "additionalProperties": true, 134 | "description": "QRZ.com upload status" 135 | }, 136 | "eqsl": { 137 | "$ref": "#/definitions/adif.Qsl", 138 | "additionalProperties": true, 139 | "description": "eQSL.cc QSL status" 140 | }, 141 | "lotw": { 142 | "$ref": "#/definitions/adif.Qsl", 143 | "additionalProperties": true, 144 | "description": "ARRL Logbook of the World QSL status" 145 | }, 146 | "card": { 147 | "$ref": "#/definitions/adif.Qsl", 148 | "additionalProperties": true, 149 | "description": "Physical QSL card status" 150 | }, 151 | "app_defined": { 152 | "additionalProperties": { 153 | "type": "string" 154 | }, 155 | "type": "object", 156 | "description": "Application-defined fields. Keys should follow ADIF 3.1.1 IV.A.4, i.e.\n APP_{PROGRAMID}_{FIELDNAME}" 157 | } 158 | }, 159 | "additionalProperties": true, 160 | "type": "object", 161 | "description": "Data about one radio contact" 162 | }, 163 | "adif.ContestData": { 164 | "properties": { 165 | "contest_id": { 166 | "type": "string", 167 | "description": "Contest Identifier" 168 | }, 169 | "serial_sent": { 170 | "type": "string", 171 | "description": "contest QSO transmitted serial number" 172 | }, 173 | "serial_received": { 174 | "type": "string", 175 | "description": "contest QSO received serial number" 176 | }, 177 | "arrl_section": { 178 | "type": "string", 179 | "description": "ARRL section" 180 | }, 181 | "station_class": { 182 | "type": "string", 183 | "description": "contest class (e.g. for ARRL Field Day)" 184 | }, 185 | "check": { 186 | "type": "string", 187 | "description": "contest check (e.g. for ARRL Sweepstakes)" 188 | }, 189 | "precedence": { 190 | "type": "string", 191 | "description": "contest precedence (e.g. for ARRL Sweepstakes)" 192 | } 193 | }, 194 | "additionalProperties": true, 195 | "type": "object", 196 | "description": "QSO fields that are relevant to contests only" 197 | }, 198 | "adif.Credit": { 199 | "properties": { 200 | "credit": { 201 | "type": "string" 202 | }, 203 | "qsl_medium": { 204 | "type": "string" 205 | } 206 | }, 207 | "additionalProperties": true, 208 | "type": "object", 209 | "description": "data about using this QSO for award credit" 210 | }, 211 | "adif.Propagation": { 212 | "properties": { 213 | "propagation_mode": { 214 | "type": "string", 215 | "description": "QSO propagation mode" 216 | }, 217 | "a_index": { 218 | "type": "integer", 219 | "description": "the geomagnetic A index at the time of the QSO in the range 0 to 400 (inclusive)" 220 | }, 221 | "k_index": { 222 | "type": "integer", 223 | "description": "the geomagnetic K index at the time of the QSO in the range 0 to 9 (inclusive)" 224 | }, 225 | "solar_flux_index": { 226 | "type": "integer", 227 | "description": "the solar flux at the time of the QSO in the range 0 to 300 (inclusive)." 228 | }, 229 | "ant_path": { 230 | "type": "string", 231 | "description": "the signal path" 232 | }, 233 | "force_init": { 234 | "type": "boolean", 235 | "description": "new EME \"initial\"" 236 | }, 237 | "max_bursts": { 238 | "type": "integer", 239 | "description": "maximum length of meteor scatter bursts heard by the logging station, in seconds" 240 | }, 241 | "meteor_shower_name": { 242 | "type": "string", 243 | "description": "For Meteor Scatter QSOs, the name of the meteor shower in progress" 244 | }, 245 | "nr_bursts": { 246 | "type": "integer", 247 | "description": "the number of meteor scatter bursts heard by the logging stationthe number of meteor scatter\n bursts heard by the logging station" 248 | }, 249 | "nr_pings": { 250 | "type": "integer", 251 | "description": "the number of meteor scatter pings heard by the logging station" 252 | }, 253 | "sat_mode": { 254 | "type": "string", 255 | "description": "satellite mode" 256 | }, 257 | "sat_name": { 258 | "type": "string", 259 | "description": "name of satellite" 260 | } 261 | }, 262 | "additionalProperties": true, 263 | "type": "object", 264 | "description": "QSO fields describing radio propagation conditions" 265 | }, 266 | "adif.Qsl": { 267 | "properties": { 268 | "sent_date": { 269 | "type": "string", 270 | "description": "date QSL sent", 271 | "format": "date-time" 272 | }, 273 | "sent_status": { 274 | "type": "string", 275 | "description": "QSL sent status" 276 | }, 277 | "sent_via": { 278 | "type": "string", 279 | "description": "if QSL_SENT is set to 'Y', the means by which the QSL was sent by the logging station;\n otherwise, the means by which the logging station intends to convey the QSL" 280 | }, 281 | "received_date": { 282 | "type": "string", 283 | "description": "date QSL received", 284 | "format": "date-time" 285 | }, 286 | "received_status": { 287 | "type": "string", 288 | "description": "QSL received status" 289 | }, 290 | "received_via": { 291 | "type": "string", 292 | "description": "if QSL_RCVD is set to 'Y' or 'V', the means by which the QSL was received by the logging\n station; otherwise, the means by which the logging station requested or intends to request that\n the QSL be conveyed." 293 | }, 294 | "received_message": { 295 | "type": "string", 296 | "description": "QSL card message" 297 | } 298 | }, 299 | "additionalProperties": true, 300 | "type": "object", 301 | "description": "QSL data about confirmation of this contact" 302 | }, 303 | "adif.Station": { 304 | "properties": { 305 | "op_call": { 306 | "type": "string", 307 | "description": "operator's callsign" 308 | }, 309 | "op_name": { 310 | "type": "string", 311 | "description": "operator's name" 312 | }, 313 | "grid_square": { 314 | "type": "string", 315 | "description": "Maidenhead Grid Square" 316 | }, 317 | "latitude": { 318 | "type": "number", 319 | "description": "latitude (north positive)" 320 | }, 321 | "longitude": { 322 | "type": "number", 323 | "description": "longitude (east positive)" 324 | }, 325 | "power": { 326 | "type": "number", 327 | "description": "transmitter power in watts" 328 | }, 329 | "rig": { 330 | "type": "string", 331 | "description": "description of the station's equipment" 332 | }, 333 | "antenna": { 334 | "type": "string", 335 | "description": "description of the station antenna" 336 | }, 337 | "antenna_azimuth": { 338 | "type": "integer", 339 | "description": "antenna beam azimuth in degrees" 340 | }, 341 | "antenna_elevation": { 342 | "type": "integer", 343 | "description": "antenna beam elevation in degrees" 344 | }, 345 | "owner_call": { 346 | "type": "string", 347 | "description": "station owner's callsign" 348 | }, 349 | "station_call": { 350 | "type": "string", 351 | "description": "callsign used over the air, e.g. a club callsign" 352 | }, 353 | "age": { 354 | "type": "integer", 355 | "description": "the operator's age in years in the range 0 to 120 (inclusive)" 356 | }, 357 | "silent_key": { 358 | "type": "boolean", 359 | "description": "indicates that the operator is now a Silent Key" 360 | }, 361 | "qsl_via": { 362 | "type": "string", 363 | "description": "preferred QSL route" 364 | }, 365 | "address": { 366 | "type": "string", 367 | "description": "complete mailing address: full name, street address, city, postal code, and country" 368 | }, 369 | "street": { 370 | "type": "string", 371 | "description": "street" 372 | }, 373 | "city": { 374 | "type": "string", 375 | "description": "city" 376 | }, 377 | "postal_code": { 378 | "type": "string", 379 | "description": "postal code" 380 | }, 381 | "county": { 382 | "type": "string", 383 | "description": "Secondary Administrative Subdivision (e.g. US county, JA Gun)" 384 | }, 385 | "state": { 386 | "type": "string", 387 | "description": "the code for the Primary Administrative Subdivision (e.g. US State, JA Island, VE Province)" 388 | }, 389 | "country": { 390 | "type": "string", 391 | "description": "DXCC entity name" 392 | }, 393 | "dxcc": { 394 | "type": "integer", 395 | "description": "DXCC Entity Code" 396 | }, 397 | "continent": { 398 | "type": "string", 399 | "description": "continent" 400 | }, 401 | "email": { 402 | "type": "string", 403 | "description": "email address" 404 | }, 405 | "web": { 406 | "type": "string", 407 | "description": "the station's website URL" 408 | }, 409 | "cq_zone": { 410 | "type": "integer", 411 | "description": "CQ Zone in the range 1 to 40 (inclusive)" 412 | }, 413 | "itu_zone": { 414 | "type": "integer", 415 | "description": "ITU zone in the range 1 to 90 (inclusive)" 416 | }, 417 | "darc_dok": { 418 | "type": "string", 419 | "description": "DARC DOK (District Location Code)" 420 | }, 421 | "fists": { 422 | "type": "integer", 423 | "description": "FISTS CW Club member number" 424 | }, 425 | "fists_cc": { 426 | "type": "integer", 427 | "description": "FISTS CW Club Century Certificate (CC) number" 428 | }, 429 | "iota": { 430 | "type": "string", 431 | "description": "IOTA designator, in format CC-XXX" 432 | }, 433 | "iota_island_id": { 434 | "type": "integer", 435 | "description": "IOTA Island Identifier" 436 | }, 437 | "pfx": { 438 | "type": "string", 439 | "description": "WPX prefix" 440 | }, 441 | "region": { 442 | "type": "string", 443 | "description": "WAE or CQ entity contained within a DXCC entity" 444 | }, 445 | "skcc": { 446 | "type": "string", 447 | "description": "Straight Key Century Club (SKCC) member information" 448 | }, 449 | "sig": { 450 | "type": "string", 451 | "description": "special interest activity or event" 452 | }, 453 | "sig_info": { 454 | "type": "string", 455 | "description": "special interest activity or event information" 456 | }, 457 | "sota_ref": { 458 | "type": "string", 459 | "description": "International SOTA Reference" 460 | }, 461 | "ten_ten": { 462 | "type": "integer", 463 | "description": "Ten-Ten number" 464 | }, 465 | "usaca_counties": { 466 | "type": "string", 467 | "description": "two US counties in the case where the logging station is located on a border between two\n counties, representing counties that the contacted station may claim for the CQ Magazine USA-CA\n award program" 468 | }, 469 | "uksmg": { 470 | "type": "integer", 471 | "description": "UKSMG member number" 472 | }, 473 | "vucc_grids": { 474 | "type": "string", 475 | "description": "two or four adjacent Maidenhead grid locators, each four characters long, representing the\n logging station's grid squares that the contacted station may claim for the ARRL VUCC award\n program" 476 | } 477 | }, 478 | "additionalProperties": true, 479 | "type": "object", 480 | "description": "QSO fields describing one of the stations involved in the contact" 481 | }, 482 | "adif.Upload": { 483 | "properties": { 484 | "upload_date": { 485 | "type": "string", 486 | "format": "date-time" 487 | }, 488 | "upload_status": { 489 | "enum": [ 490 | "UNKNOWN", 491 | 0, 492 | "UPLOAD_COMPLETE", 493 | 1, 494 | "DO_NOT_UPLOAD", 495 | 2, 496 | "MODIFIED_AFTER_UPLOAD", 497 | 3 498 | ], 499 | "oneOf": [ 500 | { 501 | "type": "string" 502 | }, 503 | { 504 | "type": "integer" 505 | } 506 | ] 507 | } 508 | }, 509 | "additionalProperties": true, 510 | "type": "object", 511 | "description": "data about uploading this QSO to online logbook sites" 512 | } 513 | } 514 | } -------------------------------------------------------------------------------- /jsonschema/Station.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Station", 4 | "definitions": { 5 | "Station": { 6 | "properties": { 7 | "op_call": { 8 | "type": "string", 9 | "description": "operator's callsign" 10 | }, 11 | "op_name": { 12 | "type": "string", 13 | "description": "operator's name" 14 | }, 15 | "grid_square": { 16 | "type": "string", 17 | "description": "Maidenhead Grid Square" 18 | }, 19 | "latitude": { 20 | "type": "number", 21 | "description": "latitude (north positive)" 22 | }, 23 | "longitude": { 24 | "type": "number", 25 | "description": "longitude (east positive)" 26 | }, 27 | "power": { 28 | "type": "number", 29 | "description": "transmitter power in watts" 30 | }, 31 | "rig": { 32 | "type": "string", 33 | "description": "description of the station's equipment" 34 | }, 35 | "antenna": { 36 | "type": "string", 37 | "description": "description of the station antenna" 38 | }, 39 | "antenna_azimuth": { 40 | "type": "integer", 41 | "description": "antenna beam azimuth in degrees" 42 | }, 43 | "antenna_elevation": { 44 | "type": "integer", 45 | "description": "antenna beam elevation in degrees" 46 | }, 47 | "owner_call": { 48 | "type": "string", 49 | "description": "station owner's callsign" 50 | }, 51 | "station_call": { 52 | "type": "string", 53 | "description": "callsign used over the air, e.g. a club callsign" 54 | }, 55 | "age": { 56 | "type": "integer", 57 | "description": "the operator's age in years in the range 0 to 120 (inclusive)" 58 | }, 59 | "silent_key": { 60 | "type": "boolean", 61 | "description": "indicates that the operator is now a Silent Key" 62 | }, 63 | "qsl_via": { 64 | "type": "string", 65 | "description": "preferred QSL route" 66 | }, 67 | "address": { 68 | "type": "string", 69 | "description": "complete mailing address: full name, street address, city, postal code, and country" 70 | }, 71 | "street": { 72 | "type": "string", 73 | "description": "street" 74 | }, 75 | "city": { 76 | "type": "string", 77 | "description": "city" 78 | }, 79 | "postal_code": { 80 | "type": "string", 81 | "description": "postal code" 82 | }, 83 | "county": { 84 | "type": "string", 85 | "description": "Secondary Administrative Subdivision (e.g. US county, JA Gun)" 86 | }, 87 | "state": { 88 | "type": "string", 89 | "description": "the code for the Primary Administrative Subdivision (e.g. US State, JA Island, VE Province)" 90 | }, 91 | "country": { 92 | "type": "string", 93 | "description": "DXCC entity name" 94 | }, 95 | "dxcc": { 96 | "type": "integer", 97 | "description": "DXCC Entity Code" 98 | }, 99 | "continent": { 100 | "type": "string", 101 | "description": "continent" 102 | }, 103 | "email": { 104 | "type": "string", 105 | "description": "email address" 106 | }, 107 | "web": { 108 | "type": "string", 109 | "description": "the station's website URL" 110 | }, 111 | "cq_zone": { 112 | "type": "integer", 113 | "description": "CQ Zone in the range 1 to 40 (inclusive)" 114 | }, 115 | "itu_zone": { 116 | "type": "integer", 117 | "description": "ITU zone in the range 1 to 90 (inclusive)" 118 | }, 119 | "darc_dok": { 120 | "type": "string", 121 | "description": "DARC DOK (District Location Code)" 122 | }, 123 | "fists": { 124 | "type": "integer", 125 | "description": "FISTS CW Club member number" 126 | }, 127 | "fists_cc": { 128 | "type": "integer", 129 | "description": "FISTS CW Club Century Certificate (CC) number" 130 | }, 131 | "iota": { 132 | "type": "string", 133 | "description": "IOTA designator, in format CC-XXX" 134 | }, 135 | "iota_island_id": { 136 | "type": "integer", 137 | "description": "IOTA Island Identifier" 138 | }, 139 | "pfx": { 140 | "type": "string", 141 | "description": "WPX prefix" 142 | }, 143 | "region": { 144 | "type": "string", 145 | "description": "WAE or CQ entity contained within a DXCC entity" 146 | }, 147 | "skcc": { 148 | "type": "string", 149 | "description": "Straight Key Century Club (SKCC) member information" 150 | }, 151 | "sig": { 152 | "type": "string", 153 | "description": "special interest activity or event" 154 | }, 155 | "sig_info": { 156 | "type": "string", 157 | "description": "special interest activity or event information" 158 | }, 159 | "sota_ref": { 160 | "type": "string", 161 | "description": "International SOTA Reference" 162 | }, 163 | "ten_ten": { 164 | "type": "integer", 165 | "description": "Ten-Ten number" 166 | }, 167 | "usaca_counties": { 168 | "type": "string", 169 | "description": "two US counties in the case where the logging station is located on a border between two\n counties, representing counties that the contacted station may claim for the CQ Magazine USA-CA\n award program" 170 | }, 171 | "uksmg": { 172 | "type": "integer", 173 | "description": "UKSMG member number" 174 | }, 175 | "vucc_grids": { 176 | "type": "string", 177 | "description": "two or four adjacent Maidenhead grid locators, each four characters long, representing the\n logging station's grid squares that the contacted station may claim for the ARRL VUCC award\n program" 178 | } 179 | }, 180 | "additionalProperties": true, 181 | "type": "object", 182 | "description": "QSO fields describing one of the stations involved in the contact" 183 | } 184 | } 185 | } -------------------------------------------------------------------------------- /jsonschema/Upload.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$ref": "#/definitions/Upload", 4 | "definitions": { 5 | "Upload": { 6 | "properties": { 7 | "upload_date": { 8 | "type": "string", 9 | "format": "date-time" 10 | }, 11 | "upload_status": { 12 | "enum": [ 13 | "UNKNOWN", 14 | 0, 15 | "UPLOAD_COMPLETE", 16 | 1, 17 | "DO_NOT_UPLOAD", 18 | 2, 19 | "MODIFIED_AFTER_UPLOAD", 20 | 3 21 | ], 22 | "oneOf": [ 23 | { 24 | "type": "string" 25 | }, 26 | { 27 | "type": "integer" 28 | } 29 | ] 30 | } 31 | }, 32 | "additionalProperties": true, 33 | "type": "object", 34 | "description": "data about uploading this QSO to online logbook sites" 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /regenerate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if ! command -v protoc &> /dev/null; then 3 | echo "Need to install protobuf-compiler" 4 | sudo apt install protobuf-compiler 5 | fi 6 | if ! command -v protoc-gen-jsonschema &> /dev/null; then 7 | echo "Need to install protoc-gen-jsonschema" 8 | go get github.com/chrusty/protoc-gen-jsonschema/cmd/protoc-gen-jsonschema 9 | fi 10 | if ! command -v protoc-gen-go &> /dev/null; then 11 | echo "Need to install protoc-gen-go" 12 | go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 13 | fi 14 | if ! command -v protoc-gen-ts &> /dev/null; then 15 | echo "Need to install protoc-gen-ts" 16 | npm install -g ts-protoc-gen 17 | fi 18 | 19 | protoc \ 20 | --jsonschema_out=./jsonschema/ \ 21 | --python_out=./demo/ \ 22 | --go_out=./go/ \ 23 | --js_out="import_style=commonjs,binary:./js/" \ 24 | --ts_out=./js/ \ 25 | adif.proto 26 | --------------------------------------------------------------------------------