Skip to content

Commit 2f823ee

Browse files
committed
feat: improve CMake configuration and add support for MSVC bridge mode
1 parent 617139b commit 2f823ee

3 files changed

Lines changed: 124 additions & 53 deletions

File tree

CMakeLists.txt

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,19 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
2626
# Include cmake-js
2727
if(CMAKE_JS_INC)
2828
include_directories(${CMAKE_JS_INC})
29-
endif()
30-
31-
# Add Node.js include path
32-
execute_process(
33-
COMMAND node -p "require('path').dirname(process.execPath) + '/../include/node'"
34-
OUTPUT_VARIABLE NODE_INCLUDE_DIR
35-
OUTPUT_STRIP_TRAILING_WHITESPACE
36-
ERROR_QUIET
37-
)
38-
if(NODE_INCLUDE_DIR AND EXISTS "${NODE_INCLUDE_DIR}")
39-
include_directories(${NODE_INCLUDE_DIR})
40-
message(STATUS "Node.js include directory: ${NODE_INCLUDE_DIR}")
29+
message(STATUS "Using cmake-js include directory: ${CMAKE_JS_INC}")
30+
else()
31+
# Fallback: Add Node.js include path if cmake-js is not used
32+
execute_process(
33+
COMMAND node -p "require('path').dirname(process.execPath) + '/../include/node'"
34+
OUTPUT_VARIABLE NODE_INCLUDE_DIR
35+
OUTPUT_STRIP_TRAILING_WHITESPACE
36+
ERROR_QUIET
37+
)
38+
if(NODE_INCLUDE_DIR AND EXISTS "${NODE_INCLUDE_DIR}")
39+
include_directories(${NODE_INCLUDE_DIR})
40+
message(STATUS "Node.js include directory: ${NODE_INCLUDE_DIR}")
41+
endif()
4142
endif()
4243

4344
# ==================== 平台特定编译选项 ====================
@@ -90,28 +91,27 @@ endif()
9091

9192
# ==================== 依赖库查找 ====================
9293

93-
# Boost (header-only)
94-
if(WIN32 AND NOT MSVC)
95-
# MinGW: 尝试find_package和手动查找
96-
find_package(Boost QUIET)
97-
if(NOT Boost_FOUND)
98-
find_path(Boost_INCLUDE_DIRS
99-
NAMES boost/version.hpp
100-
PATHS /mingw64/include C:/msys64/mingw64/include
101-
NO_DEFAULT_PATH
102-
)
103-
if(Boost_INCLUDE_DIRS)
104-
message(STATUS "Found Boost headers: ${Boost_INCLUDE_DIRS}")
105-
set(Boost_FOUND TRUE)
106-
endif()
107-
endif()
108-
else()
109-
# 其他平台
110-
find_package(Boost REQUIRED)
111-
endif()
112-
11394
# pkg-config 和 FFTW3(仅在构建库时需要)
11495
if(WSJTX_BUILD_LIBS)
96+
# Boost (header-only) - 仅在构建wsjtx_lib时需要
97+
if(WIN32 AND NOT MSVC)
98+
# MinGW: 尝试find_package和手动查找
99+
find_package(Boost QUIET)
100+
if(NOT Boost_FOUND)
101+
find_path(Boost_INCLUDE_DIRS
102+
NAMES boost/version.hpp
103+
PATHS /mingw64/include C:/msys64/mingw64/include
104+
NO_DEFAULT_PATH
105+
)
106+
if(Boost_INCLUDE_DIRS)
107+
message(STATUS "Found Boost headers: ${Boost_INCLUDE_DIRS}")
108+
set(Boost_FOUND TRUE)
109+
endif()
110+
endif()
111+
else()
112+
# 其他平台
113+
find_package(Boost REQUIRED)
114+
endif()
115115
find_package(PkgConfig REQUIRED)
116116
pkg_check_modules(FFTW3F REQUIRED fftw3f)
117117

@@ -172,16 +172,22 @@ if(NOT NODE_ADDON_API_PATH)
172172
message(FATAL_ERROR "Could not find node-addon-api")
173173
endif()
174174

175-
# Include directories
175+
# Include directories (base paths needed by all targets)
176176
include_directories(
177177
${CMAKE_SOURCE_DIR}/wsjtx_lib
178178
${CMAKE_SOURCE_DIR}/wsjtx_bridge
179179
${CMAKE_SOURCE_DIR}/native
180180
${NODE_ADDON_API_PATH}
181-
${FFTW3F_INCLUDE_DIRS}
182-
${Boost_INCLUDE_DIRS}
183181
)
184182

183+
# Only add FFTW and Boost includes when building libs
184+
if(WSJTX_BUILD_LIBS)
185+
include_directories(
186+
${FFTW3F_INCLUDE_DIRS}
187+
${Boost_INCLUDE_DIRS}
188+
)
189+
endif()
190+
185191
# ==================== 库依赖定义 ====================
186192

187193
set(LIBRARIES_FROM_REFERENCES
@@ -360,10 +366,10 @@ if(WSJTX_BUILD_NODE_ADDON)
360366
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB})
361367
endif()
362368

363-
# 链接库(仅链接Boost,运行时动态加载wsjtx_bridge
364-
target_link_libraries(${PROJECT_NAME} PRIVATE
365-
${BOOST_LIBRARIES}
366-
)
369+
# 链接Boost(仅在构建wsjtx_lib时需要,MSVC模式下不需要
370+
if(WSJTX_BUILD_LIBS AND BOOST_LIBRARIES)
371+
target_link_libraries(${PROJECT_NAME} PRIVATE ${BOOST_LIBRARIES})
372+
endif()
367373

368374
message(STATUS ".node extension will dynamically load wsjtx_bridge at runtime")
369375
message(STATUS "Build complete: wsjtx_lib (static) -> wsjtx_bridge (dynamic) -> .node (loads bridge)")

native/wsjtx_wrapper.cpp

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,12 @@ namespace wsjtx_nodejs
257257
{
258258
Napi::Env env = info.Env();
259259

260+
#if WSJTX_WINDOWS_MSVC_MODE
261+
// WSPR is not supported in MSVC bridge mode
262+
Napi::Error::New(env, "WSPR decode is not currently supported in Windows MSVC mode")
263+
.ThrowAsJavaScriptException();
264+
return env.Null();
265+
#else
260266
if (info.Length() < 3)
261267
{
262268
Napi::TypeError::New(env, "Expected 3 arguments: iqData, options, callback")
@@ -340,6 +346,7 @@ namespace wsjtx_nodejs
340346
Napi::Error::New(env, "WSPR decoding is not yet supported in the current bridge architecture. Use standard decode() for supported modes.")
341347
.ThrowAsJavaScriptException();
342348
return env.Null();
349+
#endif
343350
}
344351

345352
// Pull decoded messages from the queue
@@ -362,17 +369,8 @@ namespace wsjtx_nodejs
362369
}
363370

364371
// Convert C message to JavaScript object
365-
WsjtxMessage msg(
366-
c_msg.hh,
367-
c_msg.min,
368-
c_msg.sec,
369-
c_msg.snr,
370-
c_msg.sync,
371-
c_msg.dt,
372-
c_msg.freq,
373-
std::string(c_msg.message)
374-
);
375-
results[count++] = CreateWSJTXMessage(env, msg);
372+
// In MSVC mode, WsjtxMessage is just wsjtx_message_t (a C struct)
373+
results[count++] = CreateWSJTXMessage(env, c_msg);
376374
}
377375

378376
return results;
@@ -531,7 +529,7 @@ namespace wsjtx_nodejs
531529
{
532530
Napi::Object result = Napi::Object::New(env);
533531

534-
result.Set("text", Napi::String::New(env, msg.msg));
532+
result.Set("text", Napi::String::New(env, msg.message));
535533
result.Set("snr", Napi::Number::New(env, msg.snr));
536534
result.Set("deltaTime", Napi::Number::New(env, msg.dt));
537535
result.Set("deltaFrequency", Napi::Number::New(env, msg.freq));
@@ -585,6 +583,23 @@ namespace wsjtx_nodejs
585583
threads_(threads),
586584
useFloat_(false) {}
587585

586+
EncodeWorker::EncodeWorker(Napi::Function &callback,
587+
wsjtx_handle_t handle,
588+
wsjtx_encode_fn encode_fn,
589+
wsjtx_get_max_samples_fn get_max_samples_fn,
590+
wsjtxMode mode,
591+
const std::string &message,
592+
int frequency,
593+
int threads)
594+
: AsyncWorkerBase(callback),
595+
handle_(handle),
596+
encode_fn_(encode_fn),
597+
get_max_samples_fn_(get_max_samples_fn),
598+
mode_(mode),
599+
message_(message),
600+
frequency_(frequency),
601+
threads_(threads) {}
602+
588603
void DecodeWorker::Execute()
589604
{
590605
try
@@ -764,7 +779,7 @@ namespace wsjtx_nodejs
764779
// Clamp then scale
765780
if (v > 1.0f) v = 1.0f;
766781
else if (v < -1.0f) v = -1.0f;
767-
intOut_[i] = static_cast<short int>(std::max(-32768, std::min(32767, static_cast<int>(std::lround(v * 32768.0f)))));
782+
intOut_[i] = static_cast<short int>((std::max)(-32768, (std::min)(32767, static_cast<int>(std::lround(v * 32768.0f)))));
768783
}
769784
}
770785
}

native/wsjtx_wrapper.h

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,61 @@
2121
#define FREE_LIBRARY(handle) dlclose(handle)
2222
#endif
2323

24+
// 检测MSVC模式(Windows + MSVC编译器)
25+
#if defined(_WIN32) && defined(_MSC_VER)
26+
#define WSJTX_WINDOWS_MSVC_MODE 1
27+
#else
28+
#define WSJTX_WINDOWS_MSVC_MODE 0
29+
#endif
30+
2431
// 引用bridge API头文件
25-
#include "wsjtx_bridge.h"
32+
#include "../wsjtx_bridge/wsjtx_bridge.h"
2633

2734
// 引用C++类型定义(仅用于类型声明,不会链接wsjtx_lib)
35+
#if !WSJTX_WINDOWS_MSVC_MODE
2836
#include <wsjtx_lib.h>
37+
#else
38+
// MSVC模式下:只使用C bridge类型,避免C++运行时冲突
39+
// 模式枚举:使用bridge的wsjtx_mode_t,但为兼容性保留enum名
40+
enum wsjtxMode {
41+
FT8 = 0,
42+
FT4 = 1,
43+
JT4 = 2,
44+
JT65 = 3,
45+
JT9 = 4,
46+
FT2 = 5,
47+
WSPR = 6,
48+
ECHO = 7,
49+
FST4 = 8,
50+
Q65 = 9,
51+
FST4W = 10
52+
};
53+
54+
// 使用C bridge类型作为WsjtxMessage(无std::string,安全跨CRT)
55+
using WsjtxMessage = wsjtx_message_t;
56+
57+
// WSPR相关结构(当前不支持)
58+
struct decoder_options {
59+
int freq;
60+
char rcall[13];
61+
char rloc[7];
62+
int quickmode;
63+
int usehashtable;
64+
int npasses;
65+
int subtraction;
66+
};
67+
68+
struct decoder_results {
69+
double freq;
70+
float sync, snr, dt, drift;
71+
int jitter;
72+
char message[23];
73+
char call[13];
74+
char loc[7];
75+
char pwr[3];
76+
int cycles;
77+
};
78+
#endif
2979

3080
namespace wsjtx_nodejs {
3181

0 commit comments

Comments
 (0)