├── .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 | ADIF | JSON |
8 |
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 | |
48 |
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 | |
99 |
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 | [](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 | [](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 |
--------------------------------------------------------------------------------