@ham2k/lib-operation-data 0.8.3 → 0.9.0

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,6 +1,6 @@
1
1
  {
2
2
  "name": "@ham2k/lib-operation-data",
3
- "version": "0.8.3",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.js",
6
6
  "exports": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "devDependencies": {
10
10
  "jest": "~29",
11
- "standard": "^17.0.0"
11
+ "standard": "^17.1.2"
12
12
  },
13
13
  "scripts": {
14
14
  "test": "node --experimental-vm-modules ./node_modules/.bin/jest"
@@ -10,8 +10,9 @@
10
10
  "segments": [
11
11
  { "name": "CW", "mhz": [1800, 1843], "mode": "CW" },
12
12
  { "name": "Data", "mhz": [1800, 1810], "mode": "RTTY" },
13
- { "name": "FT8", "mhz": [1840, 1843], "mode": "FT8" },
14
- { "name": "Phone", "mhz": [1843, 2000], "mode": "SSB", "submode": "LSB" }
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"] }
15
16
  ]
16
17
  },
17
18
  "80m": {
@@ -19,10 +20,11 @@
19
20
  "segments": [
20
21
  { "name": "CW", "mhz": [3500, 3600], "mode": "CW" },
21
22
  { "name": "Phone", "mhz": [3535, 3800], "mode": "SSB", "submode": "LSB", "regions": [ 3 ] },
22
- { "name": "FT8", "mhz": [3568, 3571], "mode": "FT8", "regions": [ 3 ] },
23
+ { "name": "FT8", "mhz": [3568, 3571], "mode": "FT8", "regions": [ 3 ], "priority": 100 },
23
24
  { "name": "Data", "mhz": [3570, 3600], "mode": "RTTY" },
24
- { "name": "FT8", "mhz": [3573, 3576], "mode": "FT8" },
25
- { "name": "Phone", "mhz": [3600, 4000], "mode": "SSB", "submode": "LSB" }
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"] }
26
28
  ]
27
29
  },
28
30
  "60m": {
@@ -30,7 +32,7 @@
30
32
  "segments": [
31
33
  { "name": "60m Channel 1", "mhz": [5330.5, 5333.5] },
32
34
  { "name": "60m Channel 2", "mhz": [5346.5, 5349.5] },
33
- { "name": "60m Channel 3", "mhz": [5357, 5360], "mode": "FT8" },
35
+ { "name": "60m Channel 3", "mhz": [5357, 5360], "mode": "FT8", "priority": 100 },
34
36
  { "name": "60m Channel 4", "mhz": [5371.5, 5373.5] },
35
37
  { "name": "60m Channel 5", "mhz": [5403.5, 5406.5] }
36
38
  ]
@@ -40,11 +42,12 @@
40
42
  "segments": [
41
43
  { "name": "CW", "mhz": [7000, 7060], "mode": "CW" },
42
44
  { "name": "CW", "mhz": [7000, 7125], "mode": "CW", "countries": [ "us" ] },
43
- { "name": "FT4", "mhz": [7047.5, 7050.5], "mode": "FT4" },
45
+ { "name": "FT4", "mhz": [7047.5, 7050.5], "mode": "FT4", "priority": 100 },
44
46
  { "name": "Phone", "mhz": [7060, 7300], "mode": "SSB", "submode": "LSB" },
45
- { "name": "FT8", "mhz": [7074, 7077], "mode": "FT8" },
47
+ { "name": "FT8", "mhz": [7074, 7077], "mode": "FT8", "priority": 100 },
46
48
  { "name": "Data", "mhz": [7080, 7125], "mode": "RTTY", "countries": [ "us" ] },
47
- { "name": "Phone", "mhz": [7125, 7300], "mode": "SSB", "submode": "LSB", "countries": [ "us" ] }
49
+ { "name": "Phone", "mhz": [7125, 7300], "mode": "SSB", "submode": "LSB", "countries": [ "us" ] },
50
+ { "name": "Australia", "mhz": [7000, 7300], "mode": null, "countries": ["au"] }
48
51
  ]
49
52
  },
50
53
  "30m": {
@@ -52,22 +55,23 @@
52
55
  "segments": [
53
56
  { "name": "CW", "mhz": [10100, 10150], "mode": "CW" },
54
57
  { "name": "Data", "mhz": [10130, 10140], "mode": "RTTY" },
55
- { "name": "FT8", "mhz": [10136, 10139], "mode": "FT8" },
56
- { "name": "FT4", "mhz": [10140, 10143], "mode": "FT4" },
57
- { "name": "Australia", "mhz": [10100, 10150], "mode": null, "countries": ["au", "za"] }
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"] }
58
61
  ]
59
62
  },
60
63
  "20m": {
61
64
  "mhz": [14000, 14350],
62
65
  "segments": [
63
- { "name": "CW", "mhz": [14000, 14101], "mode": "CW", "regions": [ 2 ] },
64
66
  { "name": "CW", "mhz": [14000, 14150], "mode": "CW" },
65
67
  { "name": "CW", "mhz": [14000, 14070], "mode": "CW", "regions": [ 1 ] },
68
+ { "name": "CW", "mhz": [14000, 14101], "mode": "CW", "regions": [ 2 ] },
66
69
  { "name": "Data", "mhz": [14070, 14095], "mode": "RTTY" },
67
- { "name": "FT8", "mhz": [14074, 14077], "mode": "FT8" },
68
- { "name": "FT4", "mhz": [14080, 14083], "mode": "FT4" },
70
+ { "name": "FT8", "mhz": [14074, 14077], "mode": "FT8", "priority": 100 },
71
+ { "name": "FT4", "mhz": [14080, 14083], "mode": "FT4", "priority": 100 },
69
72
  { "name": "Phone", "mhz": [14112, 14350], "mode": "SSB", "submode": "USB", "regions": [ 1, 2 ] },
70
- { "name": "Phone", "mhz": [14150, 14350], "mode": "SSB", "submode": "USB", "countries": [ "us" ] }
73
+ { "name": "Phone", "mhz": [14150, 14350], "mode": "SSB", "submode": "USB", "countries": [ "us" ] },
74
+ { "name": "Australia", "mhz": [14000, 14350], "mode": null, "countries": ["au"] }
71
75
  ]
72
76
  },
73
77
  "17m": {
@@ -75,9 +79,10 @@
75
79
  "segments": [
76
80
  { "name": "CW", "mhz": [18068, 18110], "mode": "CW" },
77
81
  { "name": "Data", "mhz": [18100, 18105], "mode": "RTTY" },
78
- { "name": "FT8", "mhz": [18100, 18103], "mode": "FT8" },
79
- { "name": "FT4", "mhz": [18104, 18107], "mode": "FT4" },
80
- { "name": "Phone", "mhz": [18110, 18168], "mode": "SSB", "submode": "USB" }
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"] }
81
86
  ]
82
87
  },
83
88
  "15m": {
@@ -85,19 +90,21 @@
85
90
  "segments": [
86
91
  { "name": "CW", "mhz": [21000, 21150], "mode": "CW" },
87
92
  { "name": "Data", "mhz": [21070, 21095], "mode": "RTTY" },
88
- { "name": "FT8", "mhz": [21074, 21077], "mode": "FT8" },
89
- { "name": "FT4", "mhz": [21140, 21143], "mode": "FT4" },
90
- { "name": "Phone", "mhz": [21150, 21450], "mode": "SSB", "submode": "USB" }
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"] }
91
97
  ]
92
98
  },
93
99
  "12m": {
94
100
  "mhz": [24890, 24990],
95
101
  "segments": [
96
102
  { "name": "CW", "mhz": [24890, 24930], "mode": "CW" },
97
- { "name": "FT8", "mhz": [24915, 24918], "mode": "FT8" },
98
- { "name": "FT4", "mhz": [24919, 23922], "mode": "FT4" },
103
+ { "name": "FT8", "mhz": [24915, 24918], "mode": "FT8", "priority": 100 },
104
+ { "name": "FT4", "mhz": [24919, 23922], "mode": "FT4", "priority": 100 },
99
105
  { "name": "Data", "mhz": [24920, 24925], "mode": "RTTY" },
100
- { "name": "Phone", "mhz": [24930, 24990], "mode": "SSB", "submode": "USB" }
106
+ { "name": "Phone", "mhz": [24930, 24990], "mode": "SSB", "submode": "USB" },
107
+ { "name": "Australia", "mhz": [24890, 24990], "mode": null, "countries": ["au"] }
101
108
  ]
102
109
  },
103
110
  "10m": {
@@ -105,15 +112,16 @@
105
112
  "segments": [
106
113
  { "name": "CW", "mhz": [28000, 28190], "mode": "CW" },
107
114
  { "name": "Data", "mhz": [28070, 28150], "mode": "RTTY" },
108
- { "name": "FT8", "mhz": [28074, 28077], "mode": "FT8" },
109
- { "name": "FT4", "mhz": [28180, 28183], "mode": "FT4" },
115
+ { "name": "FT8", "mhz": [28074, 28077], "mode": "FT8", "priority": 100 },
116
+ { "name": "FT4", "mhz": [28180, 28183], "mode": "FT4", "priority": 100 },
110
117
  { "name": "Beacons", "mhz": [28190, 28300] },
111
118
  { "name": "Phone SSB", "mhz": [28300, 29000], "mode": "SSB", "submode": "USB" },
112
119
  { "name": "AM", "mhz": [29000, 29200], "mode": "AM" },
113
120
  { "name": "Satellite", "mhz": [29300, 29520] },
114
121
  { "name": "Repeater Uplinks", "mhz": [29520, 29590] },
115
122
  { "name": "FM", "mhz": [29520, 29700], "mode": "FM" },
116
- { "name": "Repeater Downlinks", "mhz": [29620, 29700] }
123
+ { "name": "Repeater Downlinks", "mhz": [29620, 29700] },
124
+ { "name": "Australia", "mhz": [28000, 29700], "mode": null, "countries": ["au"] }
117
125
  ]
118
126
  },
119
127
  "6m": {
@@ -124,9 +132,10 @@
124
132
  { "name": "Phone", "mhz": [51000, 51110], "mode": "SSB", "submode": "USB" },
125
133
  { "name": "FM", "mhz": [51110, 52100], "mode": "FM" },
126
134
  { "name": "FM", "mhz": [51110, 52100], "mode": "FM" },
127
- { "name": "FT8", "mhz": [50313, 50316], "mode": "FT8" },
128
- { "name": "FT4", "mhz": [50318, 50321], "mode": "FT4" },
129
- { "name": "FT8", "mhz": [50323, 50326], "mode": "FT8" }
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"] }
130
139
  ]
131
140
  },
132
141
  "2m": {
@@ -134,8 +143,8 @@
134
143
  "segments": [
135
144
  { "name": "CW", "mhz": [144000, 144100], "mode": "CW" },
136
145
  { "name": "Data", "mhz": [144100, 144200], "mode": "RTTY" },
137
- { "name": "FT8", "mhz": [144174, 144177], "mode": "FT8" },
138
- { "name": "FT8", "mhz": [144170, 144173], "mode": "FT4" },
146
+ { "name": "FT8", "mhz": [144174, 144177], "mode": "FT8", "priority": 100 },
147
+ { "name": "FT4", "mhz": [144170, 144173], "mode": "FT4", "priority": 100 },
139
148
  { "name": "Phone", "mhz": [144200, 144275], "mode": "SSB", "submode": "USB" },
140
149
  { "name": "FM", "mhz": [144300, 148000], "mode": "FM" }
141
150
  ]
package/src/lib/modes.js CHANGED
@@ -163,8 +163,17 @@ const AllSegments = Object.keys(BandPlans.bands).reduce((segments, band) => {
163
163
  }, [])
164
164
 
165
165
  export function modeForFrequency(frequency, { ituRegion, countryCode, entityPrefix } = {}) {
166
- const segments = AllSegments.filter(segment => segment.mhz[0] <= frequency && segment.mhz[1] >= frequency)
166
+ const segments = AllSegments.filter(segment => (
167
+ (segment.mhz[0] <= frequency && segment.mhz[1] >= frequency) &&
168
+ (!entityPrefix || Object.keys(segment.entities).length === 0 || segment.entities[entityPrefix]) &&
169
+ (!countryCode || Object.keys(segment.countries).length === 0 || segment.countries[countryCode]) &&
170
+ (!ituRegion || Object.keys(segment.regions).length === 0 || segment.regions[ituRegion])
171
+ ))
172
+
167
173
  const sortedSegments = segments.sort((a, b) => {
174
+ if ((a.priority ?? 0) < (b.priority ?? 0)) return 1
175
+ if ((a.priority ?? 0) > (b.priority ?? 0)) return -1
176
+
168
177
  if (entityPrefix && !a.entities[entityPrefix] && b.entities[entityPrefix]) return 1
169
178
  if (entityPrefix && a.entities[entityPrefix] && !b.entities[entityPrefix]) return -1
170
179
 
@@ -176,5 +185,6 @@ export function modeForFrequency(frequency, { ituRegion, countryCode, entityPref
176
185
 
177
186
  return a.width - b.width
178
187
  })
188
+
179
189
  return sortedSegments[0]?.mode
180
190
  }
@@ -5,10 +5,29 @@ describe('modeForFrequency', () => {
5
5
  expect(modeForFrequency(14255)).toEqual('SSB')
6
6
  expect(modeForFrequency(14107)).toEqual('CW')
7
7
  expect(modeForFrequency(14074)).toEqual('FT8')
8
+ })
8
9
 
10
+ it('should handle different bandplans for different regions', () => {
9
11
  expect(modeForFrequency(14140)).toEqual('CW')
10
12
  expect(modeForFrequency(14140, { ituRegion: 2 })).toEqual('SSB')
11
- expect(modeForFrequency(14140, { entityPrefix: 'K' })).toEqual('CW')
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
+ // })
12
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()
13
31
  })
32
+
14
33
  })