Skip to content

Commit 984742b

Browse files
committed
release: 0.4.4
1 parent 302b2d9 commit 984742b

11 files changed

Lines changed: 84 additions & 26 deletions

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ For faster installation or offline environments, you can manually install precom
4040
## Quick Start
4141

4242
```javascript
43-
const { HamLib, Rotator } = require('hamlib');
43+
const { HamLib, Rotator, PASSBAND } = require('hamlib');
4444

4545
async function main() {
4646
// Create rig instance (model 1035 = FT-991A)
@@ -50,7 +50,7 @@ async function main() {
5050

5151
// Basic operations
5252
await rig.setFrequency(144390000); // 144.39 MHz
53-
await rig.setMode('FM');
53+
await rig.setMode('FM', 'nochange');
5454

5555
const freq = await rig.getFrequency();
5656
const mode = await rig.getMode();
@@ -116,6 +116,9 @@ const freq = await rig.getFrequency();
116116

117117
// Mode
118118
await rig.setMode('USB');
119+
await rig.setMode('USB', 'nochange');
120+
await rig.setMode('USB', PASSBAND.NOCHANGE);
121+
await rig.setMode('USB', rig.getPassbandNormal('USB'));
119122
const mode = await rig.getMode();
120123

121124
// VFO
@@ -360,7 +363,7 @@ async function repeaterOperation() {
360363

361364
// Set up for 2m repeater
362365
await rig.setFrequency(145500000); // 145.500 MHz
363-
await rig.setMode('FM');
366+
await rig.setMode('FM', 'nochange');
364367
await rig.setRepeaterShift('MINUS'); // Negative offset
365368
await rig.setRepeaterOffset(600000); // 600 kHz offset
366369
await rig.setTuningStep(12500); // 12.5 kHz steps

index.d.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ type VFO =
147147
*/
148148
type RadioMode = 'USB' | 'LSB' | 'FM' | 'PKTFM' | 'AM' | 'CW' | 'RTTY' | 'DIG' | string;
149149

150+
type PassbandSelector = 'narrow' | 'wide' | 'normal' | 'nochange' | number;
151+
152+
interface PassbandConstants {
153+
NORMAL: 0;
154+
NOCHANGE: -1;
155+
}
156+
150157
/**
151158
* Frequency range information
152159
*/
@@ -604,14 +611,16 @@ declare class HamLib extends EventEmitter {
604611
/**
605612
* Set radio mode
606613
* @param mode Radio mode (such as 'USB', 'LSB', 'FM', 'PKTFM')
607-
* @param bandwidth Optional bandwidth setting ('narrow', 'wide', or default)
614+
* @param bandwidth Optional bandwidth selector ('narrow', 'wide', 'normal', 'nochange') or width in Hz
608615
* @param vfo Optional VFO to set mode on ('VFOA' or 'VFOB'). If not specified, uses current VFO
609616
* @example
610617
* await rig.setMode('USB');
611618
* await rig.setMode('FM', 'narrow');
619+
* await rig.setMode('USB', 'nochange');
620+
* await rig.setMode('USB', PASSBAND.NOCHANGE);
612621
* await rig.setMode('USB', 'wide', 'VFOA');
613622
*/
614-
setMode(mode: RadioMode, bandwidth?: 'narrow' | 'wide', vfo?: VFO): Promise<number>;
623+
setMode(mode: RadioMode, bandwidth?: PassbandSelector, vfo?: VFO): Promise<number>;
615624

616625
/**
617626
* Set PTT (Push-to-Talk) status
@@ -1711,8 +1720,11 @@ interface VfoInfo {
17111720
declare const nodeHamlib: {
17121721
HamLib: typeof HamLib;
17131722
Rotator: typeof Rotator;
1723+
PASSBAND: PassbandConstants;
17141724
};
17151725

1726+
declare const PASSBAND: PassbandConstants;
1727+
17161728
// Export types for use elsewhere
17171729
export { ConnectionInfo, ModeInfo, SupportedRigInfo, SupportedRotatorInfo, AntennaInfo, RotatorConnectionInfo,
17181730
RotatorPosition, RotatorStatus, RotatorDirection, RotatorResetType, RotatorCaps, VFO, RadioMode, MemoryChannelData,
@@ -1722,7 +1734,7 @@ export { ConnectionInfo, ModeInfo, SupportedRigInfo, SupportedRotatorInfo, Anten
17221734
HamlibConfigFieldType, HamlibConfigFieldDescriptor, HamlibPortType, HamlibPortCaps,
17231735
SpectrumScopeInfo, SpectrumModeInfo, SpectrumAverageModeInfo, SpectrumLine,
17241736
SpectrumCapabilities, SpectrumSupportSummary, SpectrumConfig, SpectrumDisplayState,
1725-
ClockInfo, VfoInfo, HamLib, Rotator };
1737+
ClockInfo, VfoInfo, PassbandSelector, PassbandConstants, HamLib, Rotator, PASSBAND };
17261738

17271739
// Support both CommonJS and ES module exports
17281740
// @ts-ignore

lib/index.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ const nodeGypBuild = require('node-gyp-build');
44
// Ensure loader resolves from package root (contains prebuilds/ and build/)
55
const nativeModule = nodeGypBuild(path.join(__dirname, '..'));
66

7+
const PASSBAND = Object.freeze({
8+
NORMAL: 0,
9+
NOCHANGE: -1,
10+
});
11+
712
/**
813
* HamLib class for controlling amateur radio devices
914
*
@@ -110,7 +115,7 @@ class HamLib extends EventEmitter {
110115
/**
111116
* Set radio mode
112117
* @param {string} mode - Radio mode ('USB', 'LSB', 'FM', 'PKTFM', etc.)
113-
* @param {string} [bandwidth] - Optional bandwidth ('narrow', 'wide')
118+
* @param {string|number} [bandwidth] - Optional bandwidth selector ('narrow', 'wide', 'normal', 'nochange') or width in Hz
114119
* @param {string} [vfo] - Optional VFO ('VFOA' or 'VFOB')
115120
*/
116121
async setMode(mode, bandwidth, vfo) {
@@ -1549,7 +1554,8 @@ class Rotator extends EventEmitter {
15491554
}
15501555

15511556
// Export for CommonJS
1552-
module.exports = { HamLib, Rotator };
1557+
module.exports = { HamLib, Rotator, PASSBAND };
15531558
module.exports.HamLib = HamLib;
15541559
module.exports.Rotator = Rotator;
1555-
module.exports.default = { HamLib, Rotator };
1560+
module.exports.PASSBAND = PASSBAND;
1561+
module.exports.default = { HamLib, Rotator, PASSBAND };

lib/index.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ const __dirname = path.dirname(__filename);
77
const require = createRequire(import.meta.url);
88

99
// Import the CommonJS module
10-
const { HamLib, Rotator } = require('./index.js');
10+
const { HamLib, Rotator, PASSBAND } = require('./index.js');
1111

1212
// Export for ES modules
13-
export { HamLib, Rotator };
14-
export default { HamLib, Rotator };
13+
export { HamLib, Rotator, PASSBAND };
14+
export default { HamLib, Rotator, PASSBAND };

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hamlib",
3-
"version": "0.4.3",
3+
"version": "0.4.4",
44
"description": "Node.js bindings for Hamlib rig control with official spectrum streaming support",
55
"main": "index.js",
66
"module": "lib/index.mjs",

src/hamlib.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2567,16 +2567,28 @@ Napi::Value NodeHamLib::SetMode(const Napi::CallbackInfo & info) {
25672567
int vfo = SHIM_RIG_VFO_CURR;
25682568

25692569
// Parse parameters: setMode(mode) or setMode(mode, bandwidth) or setMode(mode, bandwidth, vfo)
2570-
if (info.Length() >= 2 && info[1].IsString()) {
2571-
std::string bandstr = info[1].As<Napi::String>().Utf8Value();
2572-
if (bandstr == "narrow") {
2573-
bandwidth = shim_rig_passband_narrow(my_rig, mode);
2574-
} else if (bandstr == "wide") {
2575-
bandwidth = shim_rig_passband_wide(my_rig, mode);
2570+
if (info.Length() >= 2) {
2571+
if (info[1].IsNumber()) {
2572+
bandwidth = info[1].As<Napi::Number>().Int32Value();
2573+
} else if (info[1].IsString()) {
2574+
std::string bandstr = info[1].As<Napi::String>().Utf8Value();
2575+
if (bandstr == "narrow") {
2576+
bandwidth = shim_rig_passband_narrow(my_rig, mode);
2577+
} else if (bandstr == "wide") {
2578+
bandwidth = shim_rig_passband_wide(my_rig, mode);
2579+
} else if (bandstr == "normal") {
2580+
bandwidth = SHIM_RIG_PASSBAND_NORMAL;
2581+
} else if (bandstr == "nochange") {
2582+
bandwidth = SHIM_RIG_PASSBAND_NOCHANGE;
2583+
} else {
2584+
// If second parameter is not a known passband selector, treat it as VFO
2585+
vfo = parseVfoParameter(info, 1, SHIM_RIG_VFO_CURR);
2586+
RETURN_NULL_IF_INVALID_VFO(vfo);
2587+
}
25762588
} else {
2577-
// If second parameter is not "narrow" or "wide", might be VFO
2578-
vfo = parseVfoParameter(info, 1, SHIM_RIG_VFO_CURR);
2579-
RETURN_NULL_IF_INVALID_VFO(vfo);
2589+
Napi::TypeError::New(env, "Bandwidth must be a string selector or numeric passband width")
2590+
.ThrowAsJavaScriptException();
2591+
return env.Null();
25802592
}
25812593
}
25822594

src/shim/hamlib_shim.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ typedef void* hamlib_shim_handle_t;
7070

7171
/* Passband constants */
7272
#define SHIM_RIG_PASSBAND_NORMAL 0
73+
#define SHIM_RIG_PASSBAND_NOCHANGE (-1)
7374

7475
/* Port types (must match hamlib rig_port_e enum) */
7576
#define SHIM_RIG_PORT_NONE 0

test/test_ci_functional.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Tests core API operations to ensure the native addon is functional.
77
*/
88

9-
const { HamLib, Rotator } = require('../index.js');
9+
const { HamLib, Rotator, PASSBAND } = require('../index.js');
1010

1111
let passed = 0;
1212
let failed = 0;
@@ -433,6 +433,22 @@ async function run() {
433433
assert(typeof pb === 'number', `expected number, got ${typeof pb}`);
434434
});
435435

436+
await test('setMode accepts nochange selector', async () => {
437+
await rig.setMode('USB', 'nochange');
438+
});
439+
440+
await test('setMode accepts normal selector', async () => {
441+
await rig.setMode('USB', 'normal');
442+
});
443+
444+
await test('setMode accepts PASSBAND.NOCHANGE constant', async () => {
445+
await rig.setMode('USB', PASSBAND.NOCHANGE);
446+
});
447+
448+
await test('setMode accepts numeric passband width', async () => {
449+
await rig.setMode('USB', rig.getPassbandNormal('USB'));
450+
});
451+
436452
await test('getResolution returns number for USB', () => {
437453
const res = rig.getResolution('USB');
438454
assert(typeof res === 'number', `expected number, got ${typeof res}`);

test/test_dummy_complete.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ async function runCompleteTest() {
133133
await rig.setMode('USB', 'wide');
134134
return '设置成功';
135135
});
136+
137+
await testWithErrorHandling('保持当前带宽切换模式', async () => {
138+
await rig.setMode('USB', 'nochange');
139+
return '设置成功';
140+
});
136141

137142
await testWithErrorHandling('设置VFOA模式', async () => {
138143
await rig.setMode('LSB', 'narrow', 'VFOA');

0 commit comments

Comments
 (0)