Skip to content

Commit 4a4920c

Browse files
author
Noah Andrews
authored
Merge pull request #12 from REVrobotics/3.0
2 parents dd53b2d + b8ed15d commit 4a4920c

File tree

5 files changed

+92
-33
lines changed

5 files changed

+92
-33
lines changed

lib/binding.ts

Lines changed: 84 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {promisify} from "util";
22
import * as path from "path";
3-
const addon = require('node-gyp-build')(path.join(__dirname, '..'));
43

54
export interface CanMessage {
65
data: number[];
@@ -34,27 +33,87 @@ export enum ThreadPriority {
3433
PriorityError
3534
}
3635

37-
export const getDevices: () => Promise<CanDeviceInfo[]> = promisify(addon.getDevices);
38-
export const registerDeviceToHAL:
39-
(descriptor:string, messageId:Number, messageMask:number) => number = addon.registerDeviceToHAL;
40-
export const unregisterDeviceFromHAL: (descriptor:string) => Promise<number> = promisify(addon.unregisterDeviceFromHAL);
41-
export const receiveMessage: (descriptor:string, messageId:number, messageMask:number) => CanMessage = addon.receiveMessage;
42-
export const openStreamSession: (descriptor:string, messageId:number, messageMask:number, maxSize:number) =>
43-
number = addon.openStreamSession;
44-
export const readStreamSession: (descriptor:string, sessionHandle:number, messagesToRead:number) =>
45-
CanMessage[] = addon.readStreamSession;
46-
export const closeStreamSession: (descriptor:string, sessionHandle:number) => number = addon.closeStreamSession;
47-
export const getCANDetailStatus: (descriptor:string) => CanDeviceStatus = addon.getCANDetailStatus;
48-
export const sendCANMessage: (descriptor:string, messageId: number, messageData: number[], repeatPeriod: number) => number = addon.sendCANMessage;
49-
export const sendHALMessage: (messageId: number, messageData: number[], repeatPeriod: number) => number = addon.sendHALMessage;
50-
export const intializeNotifier: () => void = addon.intializeNotifier;
51-
export const waitForNotifierAlarm: (time:number) => Promise<number> = promisify(addon.waitForNotifierAlarm);
52-
export const stopNotifier: () => void = addon.stopNotifier;
53-
export const writeDfuToBin: (dfuFileName:string, binFileName:string) => Promise<number> = promisify(addon.writeDfuToBin);
54-
export const openHALStreamSession: (messageId: number, messageMask:number, numMessages:number) => number = addon.openHALStreamSession;
55-
export const readHALStreamSession: (streamHandle:number, numMessages:number) => CanMessage[] = addon.readHALStreamSession;
56-
export const closeHALStreamSession: (streamHandle:number) => void = addon.closeHALStreamSession;
57-
export const setThreadPriority: (descriptor: string, priority: ThreadPriority) => void = addon.setThreadPriority;
58-
export const setSparkMaxHeartbeatData: (descriptor: string, heartbeatData: number[]) => void = addon.setSparkMaxHeartbeatData;
59-
export const startRevCommonHeartbeat: (descriptor: string) => void = addon.startRevCommonHeartbeat;
60-
export const ackHeartbeats: () => void = addon.ackHeartbeats;
36+
export class CanBridgeInitializationError extends Error {
37+
cause: any;
38+
39+
constructor(cause: any) {
40+
super("Failed to load the CANBridge native addon. This is likely a packaging problem, or perhaps the Visual Studio C++ redistributable package is not installed. See cause field for details.");
41+
this.cause = cause;
42+
}
43+
}
44+
45+
export class CanBridge {
46+
getDevices: () => Promise<CanDeviceInfo[]>;
47+
registerDeviceToHAL: (descriptor:string, messageId:Number, messageMask:number) => number;
48+
unregisterDeviceFromHAL: (descriptor:string) => Promise<number>;
49+
receiveMessage: (descriptor:string, messageId:number, messageMask:number) => CanMessage;
50+
openStreamSession: (descriptor:string, messageId:number, messageMask:number, maxSize:number) => number;
51+
readStreamSession: (descriptor:string, sessionHandle:number, messagesToRead:number) => CanMessage[];
52+
closeStreamSession: (descriptor:string, sessionHandle:number) => number;
53+
getCANDetailStatus: (descriptor:string) => CanDeviceStatus;
54+
sendCANMessage: (descriptor:string, messageId: number, messageData: number[], repeatPeriod: number) => number;
55+
sendHALMessage: (messageId: number, messageData: number[], repeatPeriod: number) => number;
56+
initializeNotifier: () => void;
57+
waitForNotifierAlarm: (time:number) => Promise<number>;
58+
stopNotifier: () => void;
59+
writeDfuToBin: (dfuFileName:string, binFileName:string) => Promise<number>;
60+
openHALStreamSession: (messageId: number, messageMask:number, numMessages:number) => number;
61+
readHALStreamSession: (streamHandle:number, numMessages:number) => CanMessage[];
62+
closeHALStreamSession: (streamHandle:number) => void;
63+
setThreadPriority: (descriptor: string, priority: ThreadPriority) => void;
64+
setSparkMaxHeartbeatData: (descriptor: string, heartbeatData: number[]) => void;
65+
startRevCommonHeartbeat: (descriptor: string) => void;
66+
ackHeartbeats: () => void;
67+
68+
constructor() {
69+
try {
70+
const addon = require('node-gyp-build')(path.join(__dirname, '..'));
71+
72+
this.getDevices = promisify(addon.getDevices);
73+
this.registerDeviceToHAL = addon.registerDeviceToHAL;
74+
this.unregisterDeviceFromHAL = promisify(addon.unregisterDeviceFromHAL);
75+
this.receiveMessage = addon.receiveMessage;
76+
this.openStreamSession = addon.openStreamSession;
77+
this.readStreamSession = addon.readStreamSession;
78+
this.closeStreamSession = addon.closeStreamSession;
79+
this.getCANDetailStatus = addon.getCANDetailStatus;
80+
this.sendCANMessage = addon.sendCANMessage;
81+
this.sendHALMessage = addon.sendHALMessage;
82+
this.initializeNotifier = addon.initializeNotifier;
83+
this.waitForNotifierAlarm = promisify(addon.waitForNotifierAlarm);
84+
this.stopNotifier = addon.stopNotifier;
85+
this.writeDfuToBin = promisify(addon.writeDfuToBin);
86+
this.openHALStreamSession = addon.openHALStreamSession;
87+
this.readHALStreamSession = addon.readHALStreamSession;
88+
this.closeHALStreamSession = addon.closeHALStreamSession;
89+
this.setThreadPriority = addon.setThreadPriority;
90+
this.setSparkMaxHeartbeatData = addon.setSparkMaxHeartbeatData;
91+
this.startRevCommonHeartbeat = addon.startRevCommonHeartbeat;
92+
this.ackHeartbeats = addon.ackHeartbeats;
93+
} catch (e: any) {
94+
throw new CanBridgeInitializationError(e);
95+
}
96+
}
97+
}
98+
99+
100+
101+
102+
103+
104+
105+
106+
107+
108+
109+
110+
111+
112+
113+
114+
115+
116+
117+
118+
119+

src/addon.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
2222
Napi::Function::New(env, sendCANMessage));
2323
exports.Set(Napi::String::New(env, "sendHALMessage"),
2424
Napi::Function::New(env, sendHALMessage));
25-
exports.Set(Napi::String::New(env, "intializeNotifier"),
26-
Napi::Function::New(env, intializeNotifier));
25+
exports.Set(Napi::String::New(env, "initializeNotifier"),
26+
Napi::Function::New(env, initializeNotifier));
2727
exports.Set(Napi::String::New(env, "waitForNotifierAlarm"),
2828
Napi::Function::New(env, waitForNotifierAlarm));
2929
exports.Set(Napi::String::New(env, "stopNotifier"),
@@ -47,4 +47,4 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
4747
return exports;
4848
}
4949

50-
NODE_API_MODULE(addon, Init);
50+
NODE_API_MODULE(addon, Init);

src/canWrapper.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ void closeHALStreamSession(const Napi::CallbackInfo& info) {
606606
HAL_CAN_CloseStreamSession(streamHandle);
607607
}
608608

609-
void intializeNotifier(const Napi::CallbackInfo& info) {
609+
void initializeNotifier(const Napi::CallbackInfo& info) {
610610
int32_t status;
611611
m_notifier = HAL_InitializeNotifier(&status);
612612
}
@@ -718,7 +718,7 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
718718
Napi::Array dataParam = info[1].As<Napi::Array>();
719719

720720
uint8_t heartbeat[] = {0, 0, 0, 0, 0, 0, 0, 0};
721-
721+
722722
{
723723
std::scoped_lock lock{canDevicesMtx};
724724
auto deviceIterator = canDeviceMap.find(descriptor);

src/canWrapper.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Napi::Object getCANDetailStatus(const Napi::CallbackInfo& info);
1414
Napi::Number sendCANMessage(const Napi::CallbackInfo& info);
1515
Napi::Number sendCANMessageThroughHal(const Napi::CallbackInfo& info);
1616
Napi::Number sendHALMessage(const Napi::CallbackInfo& info);
17-
void intializeNotifier(const Napi::CallbackInfo& info);
17+
void initializeNotifier(const Napi::CallbackInfo& info);
1818
void waitForNotifierAlarm(const Napi::CallbackInfo& info);
1919
void stopNotifier(const Napi::CallbackInfo& info);
2020
void writeDfuToBin(const Napi::CallbackInfo& info);
@@ -25,4 +25,4 @@ void setThreadPriority(const Napi::CallbackInfo& info);
2525
void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info);
2626
void startRevCommonHeartbeat(const Napi::CallbackInfo& info);
2727
void ackHeartbeats(const Napi::CallbackInfo& info);
28-
#endif
28+
#endif

test/test_binding.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ async function testSetThreadPriority() {
156156

157157
function testInitializeNotifier() {
158158
try {
159-
addon.intializeNotifier();
159+
addon.initializeNotifier();
160160
} catch(error) {
161161
assert.fail(error);
162162
}

0 commit comments

Comments
 (0)