@ham2k/lib-operation-data 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@ham2k/lib-operation-data",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
8
- "dist",
9
- "src"
8
+ "dist"
10
9
  ],
11
10
  "exports": {
12
11
  ".": {
13
12
  "types": "./dist/index.d.ts",
14
- "import": "./dist/index.js"
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
15
  }
16
16
  },
17
17
  "devDependencies": {
@@ -1,176 +0,0 @@
1
- {
2
- "sources": [
3
- { "url": "https://www.iaru-r2.org/en/reference/band-plans/" },
4
- { "url": "https://www.arrl.org/band-plan" },
5
- { "url": "https://www.arrl.org/news/view/updated-arrl-us-amateur-radio-bands-charts-now-available" }
6
- ],
7
- "bands": {
8
- "160m": {
9
- "mhz": [1800, 2000],
10
- "segments": [
11
- { "name": "CW", "mhz": [1800, 1843], "mode": "CW" },
12
- { "name": "Data", "mhz": [1800, 1810], "mode": "RTTY" },
13
- { "name": "FT8", "mhz": [1840, 1843], "mode": "FT8", "priority": 100 },
14
- { "name": "Phone", "mhz": [1843, 2000], "mode": "SSB", "submode": "LSB" },
15
- { "name": "Australia", "mhz": [1800, 1875], "mode": null, "countries": ["au"] }
16
- ]
17
- },
18
- "80m": {
19
- "mhz": [3500, 3800],
20
- "segments": [
21
- { "name": "CW", "mhz": [3500, 3600], "mode": "CW" },
22
- { "name": "Phone", "mhz": [3535, 3800], "mode": "SSB", "submode": "LSB", "regions": [ 3 ] },
23
- { "name": "FT8", "mhz": [3568, 3571], "mode": "FT8", "regions": [ 3 ], "priority": 100 },
24
- { "name": "Data", "mhz": [3570, 3600], "mode": "RTTY" },
25
- { "name": "FT8", "mhz": [3573, 3576], "mode": "FT8", "priority": 100 },
26
- { "name": "Phone", "mhz": [3600, 4000], "mode": "SSB", "submode": "LSB" },
27
- { "name": "Australia", "mhz": [3500, 3800], "mode": null, "countries": ["au"] }
28
- ]
29
- },
30
- "60m": {
31
- "mhz": [5330.5, 3406.5],
32
- "segments": [
33
- { "name": "60m Channel 1", "mhz": [5330.5, 5333.5] },
34
- { "name": "60m Channel 2", "mhz": [5346.5, 5349.5] },
35
- { "name": "60m Channel 3", "mhz": [5357, 5360], "mode": "FT8", "priority": 100 },
36
- { "name": "60m Channel 4", "mhz": [5371.5, 5373.5] },
37
- { "name": "60m Channel 5", "mhz": [5403.5, 5406.5] }
38
- ]
39
- },
40
- "40m": {
41
- "mhz": [7000, 7300],
42
- "segments": [
43
- { "name": "CW", "mhz": [7000, 7060], "mode": "CW" },
44
- { "name": "CW", "mhz": [7000, 7125], "mode": "CW", "countries": [ "us" ] },
45
- { "name": "FT4", "mhz": [7047.5, 7050.5], "mode": "FT4", "priority": 100 },
46
- { "name": "Phone", "mhz": [7060, 7300], "mode": "SSB", "submode": "LSB" },
47
- { "name": "FT8", "mhz": [7074, 7077], "mode": "FT8", "priority": 100 },
48
- { "name": "Data", "mhz": [7080, 7125], "mode": "RTTY", "countries": [ "us" ] },
49
- { "name": "Phone", "mhz": [7125, 7300], "mode": "SSB", "submode": "LSB", "countries": [ "us" ] },
50
- { "name": "Australia", "mhz": [7000, 7300], "mode": null, "countries": ["au"] }
51
- ]
52
- },
53
- "30m": {
54
- "mhz": [10100, 10150],
55
- "segments": [
56
- { "name": "CW", "mhz": [10100, 10150], "mode": "CW" },
57
- { "name": "Data", "mhz": [10130, 10140], "mode": "RTTY" },
58
- { "name": "FT8", "mhz": [10136, 10139], "mode": "FT8", "priority": 100 },
59
- { "name": "FT4", "mhz": [10140, 10143], "mode": "FT4", "priority": 100 },
60
- { "name": "Countries with no plan on 30m", "mhz": [10100, 10150], "mode": null, "countries": ["au", "za"] }
61
- ]
62
- },
63
- "20m": {
64
- "mhz": [14000, 14350],
65
- "segments": [
66
- { "name": "CW", "mhz": [14000, 14150], "mode": "CW" },
67
- { "name": "CW", "mhz": [14000, 14070], "mode": "CW", "regions": [ 1 ] },
68
- { "name": "CW", "mhz": [14000, 14101], "mode": "CW", "regions": [ 2 ] },
69
- { "name": "Data", "mhz": [14070, 14095], "mode": "RTTY" },
70
- { "name": "FT8", "mhz": [14074, 14077], "mode": "FT8", "priority": 100 },
71
- { "name": "FT4", "mhz": [14080, 14083], "mode": "FT4", "priority": 100 },
72
- { "name": "Phone", "mhz": [14112, 14350], "mode": "SSB", "submode": "USB", "regions": [ 1, 2 ] },
73
- { "name": "Phone", "mhz": [14150, 14350], "mode": "SSB", "submode": "USB", "countries": [ "us" ] },
74
- { "name": "Australia", "mhz": [14000, 14350], "mode": null, "countries": ["au"] }
75
- ]
76
- },
77
- "17m": {
78
- "mhz": [18068, 18168],
79
- "segments": [
80
- { "name": "CW", "mhz": [18068, 18110], "mode": "CW" },
81
- { "name": "Data", "mhz": [18100, 18105], "mode": "RTTY" },
82
- { "name": "FT8", "mhz": [18100, 18103], "mode": "FT8", "priority": 100 },
83
- { "name": "FT4", "mhz": [18104, 18107], "mode": "FT4", "priority": 100 },
84
- { "name": "Phone", "mhz": [18110, 18168], "mode": "SSB", "submode": "USB" },
85
- { "name": "Australia", "mhz": [18068, 18168], "mode": null, "countries": ["au"] }
86
- ]
87
- },
88
- "15m": {
89
- "mhz": [21000, 21450],
90
- "segments": [
91
- { "name": "CW", "mhz": [21000, 21150], "mode": "CW" },
92
- { "name": "Data", "mhz": [21070, 21095], "mode": "RTTY" },
93
- { "name": "FT8", "mhz": [21074, 21077], "mode": "FT8", "priority": 100 },
94
- { "name": "FT4", "mhz": [21140, 21143], "mode": "FT4", "priority": 100 },
95
- { "name": "Phone", "mhz": [21150, 21450], "mode": "SSB", "submode": "USB" },
96
- { "name": "Australia", "mhz": [21000, 21450], "mode": null, "countries": ["au"] }
97
- ]
98
- },
99
- "12m": {
100
- "mhz": [24890, 24990],
101
- "segments": [
102
- { "name": "CW", "mhz": [24890, 24930], "mode": "CW" },
103
- { "name": "FT8", "mhz": [24915, 24918], "mode": "FT8", "priority": 100 },
104
- { "name": "FT4", "mhz": [24919, 23922], "mode": "FT4", "priority": 100 },
105
- { "name": "Data", "mhz": [24920, 24925], "mode": "RTTY" },
106
- { "name": "Phone", "mhz": [24930, 24990], "mode": "SSB", "submode": "USB" },
107
- { "name": "Australia", "mhz": [24890, 24990], "mode": null, "countries": ["au"] }
108
- ]
109
- },
110
- "10m": {
111
- "mhz": [28000, 29700],
112
- "segments": [
113
- { "name": "CW", "mhz": [28000, 28190], "mode": "CW" },
114
- { "name": "Data", "mhz": [28070, 28150], "mode": "RTTY" },
115
- { "name": "FT8", "mhz": [28074, 28077], "mode": "FT8", "priority": 100 },
116
- { "name": "FT4", "mhz": [28180, 28183], "mode": "FT4", "priority": 100 },
117
- { "name": "Beacons", "mhz": [28190, 28300] },
118
- { "name": "Phone SSB", "mhz": [28300, 29000], "mode": "SSB", "submode": "USB" },
119
- { "name": "AM", "mhz": [29000, 29200], "mode": "AM" },
120
- { "name": "Satellite", "mhz": [29300, 29520] },
121
- { "name": "Repeater Uplinks", "mhz": [29520, 29590] },
122
- { "name": "FM", "mhz": [29520, 29700], "mode": "FM" },
123
- { "name": "Repeater Downlinks", "mhz": [29620, 29700] },
124
- { "name": "Australia", "mhz": [28000, 29700], "mode": null, "countries": ["au"] }
125
- ]
126
- },
127
- "6m": {
128
- "mhz": [50000, 54000],
129
- "segments": [
130
- { "name": "CW", "mhz": [50000, 50100], "mode": "CW" },
131
- { "name": "Phone", "mhz": [50150, 50400], "mode": "SSB", "submode": "USB" },
132
- { "name": "Phone", "mhz": [51000, 51110], "mode": "SSB", "submode": "USB" },
133
- { "name": "FM", "mhz": [51110, 52100], "mode": "FM" },
134
- { "name": "FM", "mhz": [51110, 52100], "mode": "FM" },
135
- { "name": "FT8", "mhz": [50313, 50316], "mode": "FT8", "priority": 100 },
136
- { "name": "FT4", "mhz": [50318, 50321], "mode": "FT4", "priority": 100 },
137
- { "name": "FT8", "mhz": [50323, 50326], "mode": "FT8", "priority": 100 },
138
- { "name": "Australia", "mhz": [50000, 54000], "mode": null, "countries": ["au"] }
139
- ]
140
- },
141
- "2m": {
142
- "mhz": [144000, 148000],
143
- "segments": [
144
- { "name": "CW", "mhz": [144000, 144100], "mode": "CW" },
145
- { "name": "Data", "mhz": [144100, 144200], "mode": "RTTY" },
146
- { "name": "FT8", "mhz": [144174, 144177], "mode": "FT8", "priority": 100 },
147
- { "name": "FT4", "mhz": [144170, 144173], "mode": "FT4", "priority": 100 },
148
- { "name": "Phone", "mhz": [144200, 144275], "mode": "SSB", "submode": "USB" },
149
- { "name": "FM", "mhz": [144300, 148000], "mode": "FM" }
150
- ]
151
- },
152
- "1.25m": {
153
- "mhz": [222000, 225000],
154
- "segments": [
155
- { "name": "CW", "mhz": [222000, 222070], "mode": "CW" },
156
- { "name": "Phone", "mhz": [222070, 222150], "mode": "SSB", "submode": "USB" },
157
- { "name": "FM", "mhz": [222200, 225000], "mode": "FM" }
158
- ]
159
- },
160
- "70cm": {
161
- "mhz": [420000, 450000],
162
- "segments": [
163
- { "name": "CW", "mhz": [432000, 432100], "mode": "CW" },
164
- { "name": "Phone", "mhz": [432100, 432300], "mode": "SSB", "submode": "USB" },
165
- { "name": "Phone", "mhz": [432420, 433000], "mode": "SSB", "submode": "USB" },
166
- { "name": "FM", "mhz": [420000, 450000], "mode": "FM" }
167
- ]
168
- },
169
- "33cm": {
170
- "mhz": [902000, 928000],
171
- "segments": [
172
- { "name": "FM", "mhz": [927000, 928000], "mode": "FM" }
173
- ]
174
- }
175
- }
176
- }
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './lib/bands'
2
- export * from './lib/modes'
3
-
package/src/lib/bands.ts DELETED
@@ -1,215 +0,0 @@
1
- export const EXTENDED_BANDS = [ // Includes 11m
2
- '2190m',
3
- '630m',
4
- '560m',
5
- '160m',
6
- '80m',
7
- '60m',
8
- '40m',
9
- '30m',
10
- '20m',
11
- '17m',
12
- '15m',
13
- '12m',
14
- '11m',
15
- '10m',
16
- '6m',
17
- '5m',
18
- '4m',
19
- '2m',
20
- '1.25m',
21
- '70cm',
22
- '33cm',
23
- '23cm',
24
- '13cm',
25
- '9cm',
26
- '6cm',
27
- '3cm',
28
- '1.25cm',
29
- '6mm',
30
- '4mm',
31
- '2.5mm',
32
- '2mm',
33
- '1mm',
34
- 'submm',
35
- 'other'
36
- ] as const
37
-
38
- export const BANDS = [
39
- '2190m',
40
- '630m',
41
- '560m',
42
- '160m',
43
- '80m',
44
- '60m',
45
- '40m',
46
- '30m',
47
- '20m',
48
- '17m',
49
- '15m',
50
- '12m',
51
- '10m',
52
- '6m',
53
- '5m',
54
- '4m',
55
- '2m',
56
- '1.25m',
57
- '70cm',
58
- '33cm',
59
- '23cm',
60
- '13cm',
61
- '9cm',
62
- '6cm',
63
- '3cm',
64
- '1.25cm',
65
- '6mm',
66
- '4mm',
67
- '2.5mm',
68
- '2mm',
69
- '1mm',
70
- 'submm',
71
- 'other'
72
- ] as const
73
-
74
- export type Band = typeof EXTENDED_BANDS[number]
75
-
76
- export const HF_BANDS = ['160m', '80m', '60m', '40m', '30m', '20m', '17m', '15m', '12m', '10m'] as const
77
- export const VHF_BANDS = ['6m', '5m', '4m', '2m', '1.25m'] as const
78
- export const UHF_BANDS = ['70cm', '33cm', '23cm', '13cm'] as const
79
- export const SHF_BANDS = ['9cm', '6cm', '3cm', '1.25cm'] as const
80
- export const EHF_BANDS = ['6mm', '4mm', '2mm', '2.5mm', '1mm', 'submm'] as const
81
-
82
- export const POPULAR_BANDS = ['160m', '80m', '60m', '40m', '30m', '20m', '17m', '15m', '12m', '10m', '6m', '2m', '70cm'] as const
83
- export const CONTEST_BANDS = ['160m', '80m', '40m', '20m', '15m', '10m'] as const
84
-
85
- export function bandForFrequency(freq: number): Band {
86
- return bandForExactFrequencyInMHz(freq) ?? bandForExactFrequencyInMHz(freq * 1000) ?? 'other'
87
- }
88
-
89
- function bandForExactFrequencyInMHz(freq: number): Band | undefined {
90
- if (freq >= 130 && freq <= 140) return '2190m'
91
- else if (freq >= 450 && freq <= 499) return '630m'
92
- else if (freq >= 500 && freq <= 505) return '560m'
93
- else if (freq >= 1700 && freq <= 2100) return '160m'
94
- else if (freq >= 3400 && freq <= 4100) return '80m'
95
- else if (freq >= 5300 && freq <= 5500) return '60m'
96
- else if (freq >= 6900 && freq <= 7400) return '40m'
97
- else if (freq >= 10000 && freq <= 10200) return '30m'
98
- else if (freq >= 13900 && freq <= 14400) return '20m'
99
- else if (freq >= 18000 && freq <= 18200) return '17m'
100
- else if (freq >= 20900 && freq <= 21600) return '15m'
101
- else if (freq >= 24500 && freq <= 25200) return '12m'
102
- else if (freq >= 26000 && freq <= 27500) return '11m'
103
- else if (freq >= 27900 && freq <= 30000) return '10m'
104
- else if (freq >= 50000 && freq <= 54000) return '6m'
105
- else if (freq >= 54001 && freq <= 69999) return '5m'
106
- else if (freq >= 70000 && freq <= 71000) return '4m'
107
- else if (freq >= 140000 && freq <= 150000) return '2m'
108
- else if (freq >= 219000 && freq <= 230000) return '1.25m'
109
- else if (freq >= 400000 && freq <= 460000) return '70cm'
110
- else if (freq >= 900000 && freq <= 930000) return '33cm'
111
- else if (freq >= 1180000 && freq <= 1420000) return '23cm'
112
- else if (freq >= 2300000 && freq <= 2450000) return '13cm'
113
- else if (freq >= 3290000 && freq <= 3510000) return '9cm'
114
- else if (freq >= 5640000 && freq <= 5926000) return '6cm'
115
- else if (freq >= 10000000 && freq <= 10500000) return '3cm'
116
- else if (freq >= 24000000 && freq <= 24250000) return '1.25cm'
117
- else if (freq >= 47000000 && freq <= 47200000) return '6mm'
118
- else if (freq >= 75000000 && freq <= 81000000) return '4mm'
119
- else if (freq >= 122250000 && freq <= 123000000) return '2.5mm'
120
- else if (freq >= 134000000 && freq <= 141000000) return '2mm'
121
- else if (freq >= 241000000 && freq <= 250000000) return '1mm'
122
- else if (freq >= 300000000 && freq <= 7500000000) return 'submm'
123
- else return undefined
124
- }
125
-
126
- export function frequencyForBand(band: Band, mode?: string): number | undefined {
127
- if (band === '2190m') return 135.7
128
- else if (band === '630m') return 472
129
- else if (band === '560m') return 501
130
- else if (band === '160m') {
131
- if (mode === 'FT8' || mode === 'FT4') return 1840
132
- else return 1800
133
- }
134
- else if (band === '80m') {
135
- if (mode === 'SSB' || mode === 'LSB') return 3800
136
- else if (mode === 'FT8') return 3573
137
- else if (mode === 'FT4') return 3575
138
- else return 3000
139
- }
140
- else if (band === '60m') {
141
- if (mode === 'FT8') return 5357
142
- else return 5330
143
- }
144
- else if (band === '40m') {
145
- if (mode === 'SSB' || mode === 'LSB') return 7175
146
- else if (mode === 'FT8') return 7074
147
- else if (mode === 'FT4') return 7047.5
148
- else return 7000
149
- }
150
- else if (band === '30m') {
151
- if (mode === 'FT8') return 10136
152
- else if (mode === 'FT4') return 10140
153
- else return 10100
154
- }
155
- else if (band === '20m') {
156
- if (mode === 'SSB' || mode === 'USB') return 14225
157
- else if (mode === 'FT8') return 14074
158
- else if (mode === 'FT4') return 14080
159
- else return 14000
160
- }
161
- else if (band === '17m') {
162
- if (mode === 'SSB' || mode === 'USB') return 18110
163
- else if (mode === 'FT8') return 18100
164
- else if (mode === 'FT4') return 18104
165
- else return 18068
166
- }
167
- else if (band === '15m') {
168
- if (mode === 'SSB' || mode === 'USB') return 21275
169
- else if (mode === 'FT8') return 21074
170
- else if (mode === 'FT4') return 21140
171
- else return 21000
172
- }
173
- else if (band === '12m') {
174
- if (mode === 'SSB' || mode === 'USB') return 24930
175
- else if (mode === 'FT8') return 24915
176
- else if (mode === 'FT4') return 24919
177
- else return 24890
178
- }
179
- else if (band === '11m') {
180
- return 26965
181
- }
182
- else if (band === '10m') {
183
- if (mode === 'SSB' || mode === 'USB') return 28300
184
- else if (mode === 'FM' || mode === 'AM') return 28500
185
- else if (mode === 'FT8') return 28074
186
- else if (mode === 'FT4') return 28180
187
- else return 28000
188
- }
189
- else if (band === '6m') {
190
- if (mode === 'SSB' || mode === 'USB') return 50125
191
- else if (mode === 'FT8') return 50313
192
- else if (mode === 'FT4') return 50318
193
- else return 50000
194
- }
195
- else if (band === '5m') return 55000
196
- else if (band === '4m') return 70090
197
- else if (band === '2m') return 145400
198
- else if (band === '1.25m') return 222000
199
- else if (band === '70cm') return 420000
200
- else if (band === '33cm') return 902000
201
- else if (band === '23cm') return 1240000
202
- else if (band === '13cm') return 2300000
203
- else if (band === '9cm') return 3300000
204
- else if (band === '6cm') return 5650000
205
- else if (band === '3cm') return 10000000
206
- else if (band === '1.25cm') return 24000000
207
- else if (band === '6mm') return 47000000
208
- else if (band === '4mm') return 75500000
209
- else if (band === '2.5mm') return 122500000
210
- else if (band === '2mm') return 134000000
211
- else if (band === '1mm') return 241000000
212
- else if (band === 'submm') return 300000000
213
- else return undefined
214
- }
215
-
@@ -1,34 +0,0 @@
1
- import { modeForFrequency } from './modes'
2
-
3
- describe('modeForFrequency', () => {
4
- it('should find the most common mode for a frequency', () => {
5
- expect(modeForFrequency(14255)).toEqual('SSB')
6
- expect(modeForFrequency(14107)).toEqual('CW')
7
- expect(modeForFrequency(14074)).toEqual('FT8')
8
- })
9
-
10
- it('should handle different bandplans for different regions', () => {
11
- expect(modeForFrequency(14140)).toEqual('CW')
12
- expect(modeForFrequency(14140, { ituRegion: 2 })).toEqual('SSB')
13
- })
14
-
15
- it('should handle different priorities', () => {
16
- // ituRegion 2 should make CW be the match for 14074, but priority 100 for FT8 should make FT8 the match
17
- expect(modeForFrequency(14074, { ituRegion: 2 })).toEqual('FT8')
18
- })
19
-
20
- // The current bandplan data does not have any entity-specific segments
21
- // TODO: mock data for this test
22
- // it('should handle different bandplans for different entities', () => {
23
- // expect(modeForFrequency(14140, { entityPrefix: 'K' })).toEqual('CW')
24
- // expect(modeForFrequency(14140, { entityPrefix: 'VK' })).toBeNull()
25
- // })
26
-
27
- it('should handle different bandplans for different countries', () => {
28
- expect(modeForFrequency(7090, { countryCode: 'us' })).toBe('RTTY')
29
- expect(modeForFrequency(7090, { countryCode: 've' })).toBe('SSB')
30
- expect(modeForFrequency(7090, { countryCode: 'au' })).toBeNull()
31
- })
32
-
33
- })
34
-
package/src/lib/modes.ts DELETED
@@ -1,205 +0,0 @@
1
- import BandPlans from '../data/bandPlans.json'
2
- import type { BandPlansData, SegmentWithMetadata, ModeForFrequencyOptions } from '../types'
3
-
4
- export const SUPER_MODES: readonly string[] = [
5
- 'CW',
6
- 'PHONE',
7
- 'DATA'
8
- ] as const
9
-
10
- export type SuperMode = 'CW' | 'PHONE' | 'DATA'
11
-
12
- export const MAIN_MODES: readonly string[] = [
13
- 'CW',
14
- 'SSB',
15
- 'AM',
16
- 'FM',
17
- 'FT8',
18
- 'FT4',
19
- 'RTTY'
20
- ] as const
21
-
22
- export const POPULAR_MODES: readonly string[] = [
23
- 'CW',
24
- 'SSB',
25
- 'USB',
26
- 'LSB',
27
- 'FM',
28
- 'AM',
29
- 'FT8',
30
- 'FT4',
31
- 'RTTY',
32
- 'DIGITALVOICE',
33
- 'C4FM',
34
- 'DMR',
35
- 'DSTAR',
36
- 'FREEDV',
37
- 'M17',
38
- 'DYNAMIC',
39
- 'HELL',
40
- 'JT9',
41
- 'MFSK',
42
- 'MSK144',
43
- 'OLIVIA',
44
- 'PKT',
45
- 'PSK',
46
- 'SSTV',
47
- 'WSPR',
48
- ] as const
49
-
50
- export const ADIF_MODES: readonly string[] = [
51
- 'AM',
52
- 'ARDOP',
53
- 'ATV',
54
- 'CHIP',
55
- 'CLO',
56
- 'CONTESTI',
57
- 'CW',
58
- 'DIGITALVOICE',
59
- 'DOMINO',
60
- 'DYNAMIC',
61
- 'FAX',
62
- 'FM',
63
- 'FSK441',
64
- 'FT8',
65
- 'HELL',
66
- 'ISCAT',
67
- 'JT4',
68
- 'JT6M',
69
- 'JT9',
70
- 'JT44',
71
- 'JT65',
72
- 'MFSK',
73
- 'MSK144',
74
- 'MT63',
75
- 'OLIVIA',
76
- 'OPERA',
77
- 'PAC',
78
- 'PAX',
79
- 'PKT',
80
- 'PSK',
81
- 'PSK2K',
82
- 'Q15',
83
- 'QRA64',
84
- 'ROS',
85
- 'RTTY',
86
- 'RTTYM',
87
- 'SSB',
88
- 'SSTV',
89
- 'T10',
90
- 'THOR',
91
- 'THRB',
92
- 'TOR',
93
- 'V4',
94
- 'VOI',
95
- 'WINMOR',
96
- 'WSPR'
97
- ] as const
98
-
99
- export const ADIF_SUBMODES: Record<string, readonly string[]> = {
100
- 'CHIP': ['CHIP64', 'CHIP128'],
101
- 'DIGITALVOICE': ['C4FM', 'DMR', 'DSTAR', 'FREEDV', 'M17'],
102
- 'DOMINO': ['DOM-M', 'DOM4', 'DOM5', 'DOM8', 'DOM11', 'DOM16', 'DOM22', 'DOM44', 'DOM88', 'DOMINOEX', 'DOMINOF'],
103
- 'DYNAMIC': ['VARA HF', 'VARA SATELLITE', 'VARA FM 1200', 'VARA FM 9600'],
104
- 'HELL': ['FMHELL', 'FSKHELL', 'HELL80', 'HELLX5', 'HELLX9', 'HFSK', 'PSKHELL', 'SLOWHELL'],
105
- 'ISCAT': ['ISCAT-A', 'ISCAT-B'],
106
- 'JT4': ['JT4A', 'JT4B', 'JT4C', 'JT4D', 'JT4E', 'JT4F', 'JT4G'],
107
- 'JT9': ['JT9-1', 'JT9', 'JT9-2', 'JT9-5', 'JT9-10', 'JT9-30', 'JT9A', 'JT9B', 'JT9C', 'JT9D', 'JT9E', 'JT9E FAST', 'JT9F', 'JT9F FAST', 'JT9G', 'JT9G FAST', 'JT9H', 'JT9H FAST'],
108
- 'JT65': ['JT65A', 'JT65B', 'JT65B2', 'JT65C', 'JT65C2'],
109
- 'MFSK': ['FSQCALL', 'FST4', 'FST4W', 'FT4', 'JS8', 'JTMS', 'MFSK4', 'MFSK8', 'MFSK11', 'MFSK16', 'MFSK22', 'MFSK31', 'MFSK32', 'MFSK64', 'MFSK64L', 'MFSK128 MFSK128L', 'Q65'],
110
- 'OLIVIA': ['OLIVIA 4/125', 'OLIVIA 4/250', 'OLIVIA 8/250', 'OLIVIA 8/500', 'OLIVIA 16/500', 'OLIVIA 16/1000', 'OLIVIA 32/1000'],
111
- 'OPERA': ['OPERA-BEACON', 'OPERA-QSO'],
112
- 'PAC': ['PAC2', 'PAC3', 'PAC4'],
113
- 'PAX': ['PAX2'],
114
- 'PSK': ['8PSK125', '8PSK125F', '8PSK125FL', '8PSK250', '8PSK250F', '8PSK250FL', '8PSK500', '8PSK500F', '8PSK1000', '8PSK1000F', '8PSK1200F', 'FSK31', 'PSK10', 'PSK31', 'PSK63', 'PSK63F', 'PSK63RC4', 'PSK63RC5', 'PSK63RC10', 'PSK63RC20', 'PSK63RC32', 'PSK125', 'PSK125C12', 'PSK125R', 'PSK125RC10', 'PSK125RC12', 'PSK125RC16', 'PSK125RC4', 'PSK125RC5', 'PSK250', 'PSK250C6', 'PSK250R', 'PSK250RC2', 'PSK250RC3', 'PSK250RC5', 'PSK250RC6', 'PSK250RC7', 'PSK500', 'PSK500C2', 'PSK500C4', 'PSK500R', 'PSK500RC2', 'PSK500RC3', 'PSK500RC4', 'PSK800C2', 'PSK800RC2', 'PSK1000', 'PSK1000C2', 'PSK1000R', 'PSK1000RC2', 'PSKAM10', 'PSKAM31', 'PSKAM50', 'PSKFEC31', 'QPSK31', 'QPSK63', 'QPSK125', 'QPSK250', 'QPSK500', 'SIM31'],
115
- 'QRA64': ['QRA64A', 'QRA64B', 'QRA64C', 'QRA64D', 'QRA64E'],
116
- 'ROS': ['ROS-EME', 'ROS-HF', 'ROS-MF'],
117
- 'RTTY': ['ASCI'],
118
- 'SSB': ['LSB', 'USB'],
119
- 'THOR': ['THOR-M', 'THOR4', 'THOR5', 'THOR8', 'THOR11', 'THOR16', 'THOR22', 'THOR25X4', 'THOR50X1', 'THOR50X2', 'THOR100'],
120
- 'THRB': ['THRBX', 'THRBX1', 'THRBX2', 'THRBX4', 'THROB1', 'THROB2', 'THROB4'],
121
- 'TOR': ['AMTORFEC', 'GTOR', 'NAVTEX', 'SITORB']
122
- } as const
123
-
124
- export const ADIF_MODE_FOR_SUBMODE: Record<string, string> = {}
125
- Object.keys(ADIF_SUBMODES).forEach(mode => {
126
- ADIF_SUBMODES[mode].forEach(submode => {
127
- ADIF_MODE_FOR_SUBMODE[submode] = mode
128
- })
129
- })
130
-
131
- export const ADIF_MODES_AND_SUBMODES: readonly string[] = [...new Set([...ADIF_MODES, ...Object.values(ADIF_SUBMODES).flat()])].sort()
132
-
133
- export function adifModeAndSubmodeForMode(mode: string): string[] {
134
- if (ADIF_MODE_FOR_SUBMODE[mode]) {
135
- return [ADIF_MODE_FOR_SUBMODE[mode], mode]
136
- } else {
137
- return [mode]
138
- }
139
- }
140
-
141
- export function superModeForMode(mode: string): SuperMode {
142
- if (ADIF_MODE_FOR_SUBMODE[mode]) mode = ADIF_MODE_FOR_SUBMODE[mode]
143
-
144
- if (mode === 'CW') {
145
- return 'CW'
146
- } else if (mode === 'SSB' || mode === 'FM' || mode === 'AM' || mode === 'DIGITALVOICE' || mode === 'PHONE') {
147
- return 'PHONE'
148
- } else {
149
- return 'DATA'
150
- }
151
- }
152
-
153
- const bandPlansData = BandPlans as unknown as BandPlansData
154
-
155
- const AllSegments: SegmentWithMetadata[] = Object.keys(bandPlansData.bands).reduce((segments, band) => {
156
- return segments.concat(
157
- bandPlansData.bands[band].segments.map(segment => {
158
- const mhz = Array.isArray(segment.mhz) && segment.mhz.length >= 2
159
- ? [segment.mhz[0], segment.mhz[1]] as [number, number]
160
- : [0, 0] as [number, number]
161
- return {
162
- name: segment.name,
163
- mode: segment.mode,
164
- submode: segment.submode,
165
- priority: segment.priority,
166
- mhz,
167
- band,
168
- width: mhz[1] - mhz[0],
169
- regions: (segment.regions || []).reduce((regions: Record<string, boolean>, region) => { regions[region.toString()] = true; return regions }, {}),
170
- entities: (segment.entities || []).reduce((entities: Record<string, boolean>, entity) => { entities[entity] = true; return entities }, {}),
171
- countries: (segment.countries || []).reduce((countries: Record<string, boolean>, country) => { countries[country] = true; return countries }, {}),
172
- } as SegmentWithMetadata
173
- })
174
- )
175
- }, [] as SegmentWithMetadata[])
176
-
177
- export function modeForFrequency(frequency: number, options: ModeForFrequencyOptions = {}): string | null | undefined {
178
- const { ituRegion, countryCode, entityPrefix } = options
179
-
180
- const segments = AllSegments.filter(segment => (
181
- (segment.mhz[0] <= frequency && segment.mhz[1] >= frequency) &&
182
- (!entityPrefix || Object.keys(segment.entities).length === 0 || segment.entities[entityPrefix]) &&
183
- (!countryCode || Object.keys(segment.countries).length === 0 || segment.countries[countryCode]) &&
184
- (!ituRegion || Object.keys(segment.regions).length === 0 || segment.regions[ituRegion.toString()])
185
- ))
186
-
187
- const sortedSegments = segments.sort((a, b) => {
188
- if ((a.priority ?? 0) < (b.priority ?? 0)) return 1
189
- if ((a.priority ?? 0) > (b.priority ?? 0)) return -1
190
-
191
- if (entityPrefix && !a.entities[entityPrefix] && b.entities[entityPrefix]) return 1
192
- if (entityPrefix && a.entities[entityPrefix] && !b.entities[entityPrefix]) return -1
193
-
194
- if (countryCode && !a.countries[countryCode] && b.countries[countryCode]) return 1
195
- if (countryCode && a.countries[countryCode] && !b.countries[countryCode]) return -1
196
-
197
- if (ituRegion && !a.regions[ituRegion.toString()] && b.regions[ituRegion.toString()]) return 1
198
- if (ituRegion && a.regions[ituRegion.toString()] && !b.regions[ituRegion.toString()]) return -1
199
-
200
- return a.width - b.width
201
- })
202
-
203
- return sortedSegments[0]?.mode
204
- }
205
-
package/src/types.ts DELETED
@@ -1,40 +0,0 @@
1
- export interface BandPlanSegment {
2
- name: string
3
- mhz: [number, number] | number[]
4
- mode?: string | null
5
- submode?: string
6
- priority?: number
7
- regions?: number[]
8
- entities?: string[]
9
- countries?: string[]
10
- }
11
-
12
- export interface BandPlan {
13
- mhz: [number, number] | number[]
14
- segments: BandPlanSegment[]
15
- }
16
-
17
- export interface BandPlansData {
18
- sources: Array<{ url: string }>
19
- bands: Record<string, BandPlan>
20
- }
21
-
22
- export interface SegmentWithMetadata {
23
- name: string
24
- mhz: [number, number]
25
- mode?: string | null
26
- submode?: string
27
- priority?: number
28
- band: string
29
- width: number
30
- regions: Record<string, boolean>
31
- entities: Record<string, boolean>
32
- countries: Record<string, boolean>
33
- }
34
-
35
- export interface ModeForFrequencyOptions {
36
- ituRegion?: number
37
- countryCode?: string
38
- entityPrefix?: string
39
- }
40
-