build: link windows-native driver when targeting windows

This is completely experimental, but since the API is the same, it's a
drop-in replacement. The Windows driver is not apparently open source,
so I am vendoring the static libraries provided. In theory, this will
obviate the need to replace the HID driver on Windows and will thus
require no initial setup, but I cannot currently test it beyond making
sure it compiles.
This commit is contained in:
torque 2024-07-10 18:22:17 -07:00
parent e4393c2e5a
commit f1480bca45
Signed by: torque
SSH Key Fingerprint: SHA256:nCrXefBNo6EbjNSQhv0nXmEg/VuNq3sMF5b8zETw3Tk
5 changed files with 1729 additions and 46 deletions

View File

@ -17,11 +17,21 @@ pub fn build(b: *std.Build) void {
.optimize = optimize, .optimize = optimize,
}); });
const ljacklm_dep = b.dependency( if (target.result.os.tag == .windows) {
"ljacklm", if (target.result.cpu.arch == .x86)
.{ .target = target, .optimize = optimize, .use_udev = use_udev }, exe.addObjectFile(b.path("deps/labjack/windows/ljackuw32.lib"))
); else if (target.result.cpu.arch == .x86_64)
exe.linkLibrary(ljacklm_dep.artifact("ljacklm")); exe.addObjectFile(b.path("deps/labjack/windows/ljackuw64.lib"))
else
@panic("Unsupported CPU arch for Windows build (must be x86 or x86_64).");
} else {
const ljacklm_dep = b.dependency(
"ljacklm",
.{ .target = target, .optimize = optimize, .use_udev = use_udev },
);
exe.linkLibrary(ljacklm_dep.artifact("ljacklm"));
}
exe.root_module.addImport( exe.root_module.addImport(
"udev_rules", "udev_rules",
b.addModule("udev_rules", .{ b.addModule("udev_rules", .{

1667
deps/labjack/windows/ljackuw.h vendored Normal file

File diff suppressed because it is too large Load Diff

BIN
deps/labjack/windows/ljackuw32.lib vendored Normal file

Binary file not shown.

BIN
deps/labjack/windows/ljackuw64.lib vendored Normal file

Binary file not shown.

View File

@ -1,4 +1,5 @@
const std = @import("std"); const std = @import("std");
const builtin = @import("builtin");
pub fn getDriverVersion() f32 { pub fn getDriverVersion() f32 {
return c_api.GetDriverVersion(); return c_api.GetDriverVersion();
@ -289,6 +290,11 @@ pub const PackedOutput = packed struct(u4) {
} }
}; };
const Call: std.builtin.CallingConvention = if (builtin.os.tag == .windows and builtin.cpu.arch == .x86)
.Stdcall
else
.C;
pub const c_api = struct { pub const c_api = struct {
pub const vendor_id: u16 = 0x0CD5; pub const vendor_id: u16 = 0x0CD5;
pub const u12_product_id: u16 = 0x0001; pub const u12_product_id: u16 = 0x0001;
@ -300,9 +306,9 @@ pub const c_api = struct {
idnum: *c_long, idnum: *c_long,
serialnum: *c_long, serialnum: *c_long,
caldata: *[20]c_long, caldata: *[20]c_long,
) c_long; ) callconv(Call) c_long;
pub extern fn CloseAll(local_id: c_long) c_long; pub extern fn CloseAll(local_id: c_long) callconv(Call) c_long;
pub extern fn GetU12Information( pub extern fn GetU12Information(
handle: *anyopaque, handle: *anyopaque,
@ -312,7 +318,7 @@ pub const c_api = struct {
cal_data: *[20]c_long, cal_data: *[20]c_long,
fcdd_max_size: *c_long, fcdd_max_size: *c_long,
hvc_max_size: *c_long, hvc_max_size: *c_long,
) c_long; ) callconv(Call) c_long;
pub extern fn EAnalogIn( pub extern fn EAnalogIn(
idnum: *c_long, idnum: *c_long,
@ -321,14 +327,14 @@ pub const c_api = struct {
gain: c_long, gain: c_long,
overVoltage: *c_long, overVoltage: *c_long,
voltage: *f32, voltage: *f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn EAnalogOut( pub extern fn EAnalogOut(
idnum: *c_long, idnum: *c_long,
demo: c_long, demo: c_long,
analogOut0: f32, analogOut0: f32,
analogOut1: f32, analogOut1: f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn ECount( pub extern fn ECount(
idnum: *c_long, idnum: *c_long,
@ -336,7 +342,7 @@ pub const c_api = struct {
resetCounter: c_long, resetCounter: c_long,
count: *f64, count: *f64,
ms: *f64, ms: *f64,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn EDigitalIn( pub extern fn EDigitalIn(
idnum: *c_long, idnum: *c_long,
@ -344,7 +350,7 @@ pub const c_api = struct {
channel: c_long, channel: c_long,
readD: c_long, readD: c_long,
state: *c_long, state: *c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn EDigitalOut( pub extern fn EDigitalOut(
idnum: *c_long, idnum: *c_long,
@ -352,7 +358,7 @@ pub const c_api = struct {
channel: c_long, channel: c_long,
writeD: c_long, writeD: c_long,
state: c_long, state: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AsynchConfig( pub extern fn AsynchConfig(
idnum: *c_long, idnum: *c_long,
@ -367,7 +373,7 @@ pub const c_api = struct {
halfA: c_long, halfA: c_long,
halfB: c_long, halfB: c_long,
halfC: c_long, halfC: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn Asynch( pub extern fn Asynch(
idnum: *c_long, idnum: *c_long,
@ -380,7 +386,7 @@ pub const c_api = struct {
numWrite: c_long, numWrite: c_long,
numRead: c_long, numRead: c_long,
data: [*]c_long, data: [*]c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AISample( pub extern fn AISample(
idnum: *c_long, idnum: *c_long,
@ -394,7 +400,7 @@ pub const c_api = struct {
disableCal: c_long, disableCal: c_long,
overVoltage: *c_long, overVoltage: *c_long,
voltages: *[4]f32, voltages: *[4]f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AIBurst( pub extern fn AIBurst(
idnum: *c_long, idnum: *c_long,
@ -415,7 +421,7 @@ pub const c_api = struct {
stateIOout: *[4096]c_long, stateIOout: *[4096]c_long,
overVoltage: *c_long, overVoltage: *c_long,
transferMode: c_long, // 0=auto,1=normal,2=turbo transferMode: c_long, // 0=auto,1=normal,2=turbo
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AIStreamStart( pub extern fn AIStreamStart(
idnum: *c_long, idnum: *c_long,
@ -430,7 +436,7 @@ pub const c_api = struct {
disableCal: c_long, disableCal: c_long,
reserved1: c_long, // always 0 reserved1: c_long, // always 0
readCount: c_long, readCount: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AIStreamRead( pub extern fn AIStreamRead(
localID: c_long, localID: c_long,
@ -441,11 +447,11 @@ pub const c_api = struct {
reserved: ?*c_long, // unused reserved: ?*c_long, // unused
ljScanBacklog: *c_long, ljScanBacklog: *c_long,
overVoltage: *c_long, overVoltage: *c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AIStreamClear( pub extern fn AIStreamClear(
localID: c_long, localID: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn AOUpdate( pub extern fn AOUpdate(
idnum: *c_long, idnum: *c_long,
@ -459,21 +465,21 @@ pub const c_api = struct {
count: [*c]c_ulong, count: [*c]c_ulong,
analogOut0: f32, analogOut0: f32,
analogOut1: f32, analogOut1: f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn BitsToVolts( pub extern fn BitsToVolts(
chnum: c_long, chnum: c_long,
chgain: c_long, chgain: c_long,
bits: c_long, bits: c_long,
volts: [*c]f32, volts: [*c]f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn VoltsToBits( pub extern fn VoltsToBits(
chnum: c_long, chnum: c_long,
chgain: c_long, chgain: c_long,
volts: f32, volts: f32,
bits: [*c]c_long, bits: [*c]c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn Counter( pub extern fn Counter(
idnum: *c_long, idnum: *c_long,
@ -483,7 +489,7 @@ pub const c_api = struct {
resetCounter: c_long, resetCounter: c_long,
enableSTB: c_long, enableSTB: c_long,
count: [*c]c_ulong, count: [*c]c_ulong,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn DigitalIO( pub extern fn DigitalIO(
idnum: *c_long, idnum: *c_long,
@ -494,12 +500,12 @@ pub const c_api = struct {
stateIO: *c_long, // 4 bits stateIO: *c_long, // 4 bits
updateDigital: c_long, updateDigital: c_long,
outputD: *c_long, // 16 bits outputD: *c_long, // 16 bits
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn GetDriverVersion() f32; pub extern fn GetDriverVersion() callconv(Call) f32;
pub extern fn StaticErrorString(errorcode: c_long) [*:0]const u8; pub extern fn StaticErrorString(errorcode: c_long) callconv(Call) [*:0]const u8;
pub extern fn GetErrorString(errorcode: c_long, errorString: *[50]u8) void; pub extern fn GetErrorString(errorcode: c_long, errorString: *[50]u8) callconv(Call) void;
pub extern fn GetFirmwareVersion(idnum: *c_long) f32; pub extern fn GetFirmwareVersion(idnum: *c_long) callconv(Call) f32;
pub extern fn ListAll( pub extern fn ListAll(
productIDList: *[127]c_long, productIDList: *[127]c_long,
@ -510,12 +516,12 @@ pub const c_api = struct {
numberFound: *c_long, numberFound: *c_long,
fcddMaxSize: *c_long, fcddMaxSize: *c_long,
hvcMaxSize: *c_long, hvcMaxSize: *c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn LocalID( pub extern fn LocalID(
idnum: *c_long, idnum: *c_long,
localID: c_long, localID: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn PulseOut( pub extern fn PulseOut(
idnum: *c_long, idnum: *c_long,
@ -527,7 +533,7 @@ pub const c_api = struct {
timeC1: c_long, timeC1: c_long,
timeB2: c_long, timeB2: c_long,
timeC2: c_long, timeC2: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn PulseOutStart( pub extern fn PulseOutStart(
idnum: *c_long, idnum: *c_long,
@ -539,24 +545,24 @@ pub const c_api = struct {
timeC1: c_long, timeC1: c_long,
timeB2: c_long, timeB2: c_long,
timeC2: c_long, timeC2: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn PulseOutFinish( pub extern fn PulseOutFinish(
idnum: *c_long, idnum: *c_long,
demo: c_long, demo: c_long,
timeoutMS: c_long, timeoutMS: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn PulseOutCalc( pub extern fn PulseOutCalc(
frequency: *f32, frequency: *f32,
timeB: *c_long, timeB: *c_long,
timeC: *c_long, timeC: *c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn ReEnum(idnum: *c_long) LabjackCError; pub extern fn ReEnum(idnum: *c_long) callconv(Call) LabjackCError;
pub extern fn Reset(idnum: *c_long) LabjackCError; pub extern fn Reset(idnum: *c_long) callconv(Call) LabjackCError;
pub extern fn ResetLJ(idnum: *c_long) LabjackCError; pub extern fn ResetLJ(idnum: *c_long) callconv(Call) LabjackCError;
pub extern fn CloseLabJack(localID: c_long) LabjackCError; pub extern fn CloseLabJack(localID: c_long) callconv(Call) LabjackCError;
pub extern fn SHT1X( pub extern fn SHT1X(
idnum: *c_long, idnum: *c_long,
@ -567,7 +573,7 @@ pub const c_api = struct {
tempC: *f32, tempC: *f32,
tempF: *f32, tempF: *f32,
rh: *f32, rh: *f32,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn SHTComm( pub extern fn SHTComm(
idnum: *c_long, idnum: *c_long,
@ -579,7 +585,7 @@ pub const c_api = struct {
numRead: c_long, numRead: c_long,
datatx: [*]u8, // numWrite length datatx: [*]u8, // numWrite length
datarx: [*]u8, // numRead length datarx: [*]u8, // numRead length
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn SHTCRC( pub extern fn SHTCRC(
statusReg: c_long, statusReg: c_long,
@ -587,7 +593,7 @@ pub const c_api = struct {
numRead: c_long, numRead: c_long,
datatx: *[4]u8, datatx: *[4]u8,
datarx: *[4]u8, datarx: *[4]u8,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn Synch( pub extern fn Synch(
idnum: *c_long, idnum: *c_long,
@ -601,7 +607,7 @@ pub const c_api = struct {
configD: c_long, configD: c_long,
numWriteRead: c_long, numWriteRead: c_long,
data: *[18]c_long, data: *[18]c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn Watchdog( pub extern fn Watchdog(
idnum: *c_long, idnum: *c_long,
@ -615,7 +621,7 @@ pub const c_api = struct {
stateD0: c_long, stateD0: c_long,
stateD1: c_long, stateD1: c_long,
stateD8: c_long, stateD8: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn ReadMem( pub extern fn ReadMem(
idnum: *c_long, idnum: *c_long,
@ -624,7 +630,7 @@ pub const c_api = struct {
data2: *c_long, data2: *c_long,
data1: *c_long, data1: *c_long,
data0: *c_long, data0: *c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub extern fn WriteMem( pub extern fn WriteMem(
idnum: *c_long, idnum: *c_long,
@ -634,7 +640,7 @@ pub const c_api = struct {
data2: c_long, data2: c_long,
data1: c_long, data1: c_long,
data0: c_long, data0: c_long,
) LabjackCError; ) callconv(Call) LabjackCError;
pub const LabjackCError = packed struct(c_ulong) { pub const LabjackCError = packed struct(c_ulong) {
code: LabjackErrorCode, code: LabjackErrorCode,