-
Notifications
You must be signed in to change notification settings - Fork 3
/
visa32.js
202 lines (193 loc) · 9.24 KB
/
visa32.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
'use strict';
/*!
* Visa32 SCPI interface for node.js
*
* @author Juergen Skrotzky <JorgenVikingGod@gmail.com>
* @license MIT
*/
// modules
var ref = require('ref');
var ffi = require('ffi');
var ArrayType = require('ref-array');
var assert = require('assert');
// typedef
var ViStatus = ref.types.int;
var ViSession = ref.types.int;
var intPtr = ref.refType('int');
var CharArray = ArrayType('char');
var refCharArray = ref.refType(CharArray);
// library
var visa32 = ffi.DynamicLibrary(__dirname + '\\lib\\visa64.dll');
var resourceManager = 0;
var sessionDevice = 0;
var viStatus = 0;
// exported methods
module.exports = {
openDefaultRM: function(callback){ return visaOpenDefaultRM(callback); },
open: function(visaSession, visaAddress, callback){ return visaOpen(visaSession, visaAddress, callback); },
close: function(visaSession, callback){ return visaClose(visaSession, callback); },
write: function(visaSession, queryString, callback){ return visaWrite(visaSession, queryString, callback); },
read: function(visaSession, callback){ return visaRead(visaSession, callback); },
query: function(visaAddress, queryString, callback){ return visaQuery(visaAddress, queryString, callback); },
exec: function(visaSession, queryString, callback){ return visaExec(visaSession, queryString, callback); }
}
// implementation
function visaOpenDefaultRM(callback){
assert.equal(typeof (callback), 'function');
// exported methods
var viOpenDefaultRMPointer = visa32.get('viOpenDefaultRM');
// method definition
var viOpenDefaultRM = ffi.VariadicForeignFunction(viOpenDefaultRMPointer, ViStatus, [intPtr]);
// open default resource manager
var outNumberMaster = ref.alloc('int');
viStatus = viOpenDefaultRM()(outNumberMaster);
resourceManager = outNumberMaster.deref();
if (viStatus) return callback(viStatus);
// return session
callback(null, resourceManager);
}
function visaOpen(visaSession, visaAddress, callback){
//assert.equal(typeof (visaSession), 'int', 'argument "visaSession" must be a int');
assert.equal(typeof (visaAddress), 'string', 'argument "visaAddress" must be a string');
assert.equal(typeof (callback), 'function');
// exported methods
var viOpenPointer = visa32.get('viOpen');
// method definition
var viOpen = ffi.VariadicForeignFunction(viOpenPointer, ViStatus, [ViSession, 'string', 'int', 'int', intPtr]);
// open session to device
var outNumberSession = ref.alloc('int');
viStatus = viOpen()(visaSession, visaAddress, '0', '2000', outNumberSession);
sessionDevice = outNumberSession.deref();
if (viStatus) return callback(viStatus);
// return session
callback(null, sessionDevice);
}
function visaWrite(visaSession, queryString, callback){
//assert.equal(typeof (visaSession), 'int', 'argument "visaSession" must be a int');
assert.equal(typeof (queryString), 'string', 'argument "queryString" must be a string');
assert.equal(typeof (callback), 'function');
var queryStr = queryString + '\n';
// exported methods
var viWritePointer = visa32.get('viWrite');
// method definition
var viWrite = ffi.VariadicForeignFunction(viWritePointer, ViStatus, [ViSession, 'string', 'int', intPtr]);
// write query to device
var outNumberBuffLen = ref.alloc('int');
viStatus = viWrite()(visaSession, queryStr, queryStr.length, outNumberBuffLen);
var buffLen = outNumberBuffLen.deref();
if (viStatus) return callback(viStatus);
// return true
callback(null, true);
}
function visaRead(visaSession, callback){
//assert.equal(typeof (visaSession), 'int', 'argument "visaSession" must be a int');
assert.equal(typeof (callback), 'function');
// exported methods
var viReadPointer = visa32.get('viRead');
// method definition
var viRead = ffi.VariadicForeignFunction(viReadPointer, ViStatus, [ViSession, refCharArray, 'int', intPtr]);
// read back query result
var outNumberReadBuffLen = ref.alloc('int');
var outReadBuffer = new Buffer(512);
outReadBuffer.type = ref.types.char;
viStatus = viRead()(visaSession, outReadBuffer, outReadBuffer.length, outNumberReadBuffLen);
var readBuffLen = outNumberReadBuffLen.deref();
var returnBuffer = ref.reinterpret(outReadBuffer, readBuffLen, 0);
if (viStatus) return callback(viStatus);
// return query result
callback(null, returnBuffer.toString());
}
function visaClose(visaSession, callback){
//assert.equal(typeof (visaSession), 'int', 'argument "visaSession" must be a int');
assert.equal(typeof (callback), 'function');
// exported methods
var viClosePointer = visa32.get('viClose');
// method definition
var viClose = ffi.VariadicForeignFunction(viClosePointer, ViStatus, [ViSession]);
// close session
viClose()(visaSession);
// return true
callback(null, true);
}
function visaQuery(visaAddress, queryString, callback){
assert.equal(typeof (visaAddress), 'string', 'argument "visaAddress" must be a string');
assert.equal(typeof (queryString), 'string', 'argument "queryString" must be a string');
assert.equal(typeof (callback), 'function');
var queryStr = queryString + '\n';
// exported methods
var viOpenDefaultRMPointer = visa32.get('viOpenDefaultRM');
var viOpenPointer = visa32.get('viOpen');
var viWritePointer = visa32.get('viWrite');
var viReadPointer = visa32.get('viRead');
var viClosePointer = visa32.get('viClose');
// method definition
var viOpenDefaultRM = ffi.VariadicForeignFunction(viOpenDefaultRMPointer, ViStatus, [intPtr]);
var viOpen = ffi.VariadicForeignFunction(viOpenPointer, ViStatus, [ViSession, 'string', 'int', 'int', intPtr]);
var viWrite = ffi.VariadicForeignFunction(viWritePointer, ViStatus, [ViSession, 'string', 'int', intPtr]);
var viRead = ffi.VariadicForeignFunction(viReadPointer, ViStatus, [ViSession, refCharArray, 'int', intPtr]);
var viClose = ffi.VariadicForeignFunction(viClosePointer, ViStatus, [ViSession]);
// open default resource manager
var outNumberMaster = ref.alloc('int');
viStatus = viOpenDefaultRM()(outNumberMaster);
resourceManager = outNumberMaster.deref();
if (viStatus) return callback(viStatus);
// open session to device
var outNumberSession = ref.alloc('int');
viStatus = viOpen()(resourceManager, visaAddress, '0', '2000', outNumberSession);
sessionDevice = outNumberSession.deref();
if (viStatus) return callback(viStatus);
// write query to device
var outNumberBuffLen = ref.alloc('int');
viStatus = viWrite()(sessionDevice, queryStr, queryStr.length, outNumberBuffLen);
var buffLen = outNumberBuffLen.deref();
if (viStatus) return callback(viStatus);
// read back query result
var outNumberReadBuffLen = ref.alloc('int');
var outReadBuffer = new Buffer(512);
outReadBuffer.type = ref.types.char;
viStatus = viRead()(sessionDevice, outReadBuffer, outReadBuffer.length, outNumberReadBuffLen);
var readBuffLen = outNumberReadBuffLen.deref();
var returnBuffer = ref.reinterpret(outReadBuffer, readBuffLen, 0);
if (viStatus) return callback(viStatus);
// close session of device and resource manager
viClose()(sessionDevice);
viClose()(resourceManager);
// return query result
callback(null, returnBuffer.toString());
}
function visaExec(visaAddress, queryString, callback){
assert.equal(typeof (visaAddress), 'string', 'argument "visaAddress" must be a string');
assert.equal(typeof (queryString), 'string', 'argument "queryString" must be a string');
assert.equal(typeof (callback), 'function');
var queryStr = queryString + '\n';
// exported methods
var viOpenDefaultRMPointer = visa32.get('viOpenDefaultRM');
var viOpenPointer = visa32.get('viOpen');
var viWritePointer = visa32.get('viWrite');
var viClosePointer = visa32.get('viClose');
// method definition
var viOpenDefaultRM = ffi.VariadicForeignFunction(viOpenDefaultRMPointer, ViStatus, [intPtr]);
var viOpen = ffi.VariadicForeignFunction(viOpenPointer, ViStatus, [ViSession, 'string', 'int', 'int', intPtr]);
var viWrite = ffi.VariadicForeignFunction(viWritePointer, ViStatus, [ViSession, 'string', 'int', intPtr]);
var viClose = ffi.VariadicForeignFunction(viClosePointer, ViStatus, [ViSession]);
// open default resource manager
var outNumberMaster = ref.alloc('int');
viStatus = viOpenDefaultRM()(outNumberMaster);
resourceManager = outNumberMaster.deref();
if (viStatus) return callback(viStatus);
// open session to device
var outNumberSession = ref.alloc('int');
viStatus = viOpen()(resourceManager, visaAddress, '0', '2000', outNumberSession);
sessionDevice = outNumberSession.deref();
if (viStatus) return callback(viStatus);
// write query to device
var outNumberBuffLen = ref.alloc('int');
viStatus = viWrite()(sessionDevice, queryStr, queryStr.length, outNumberBuffLen);
var buffLen = outNumberBuffLen.deref();
if (viStatus) return callback(viStatus);
// close session of device and resource manager
viClose()(sessionDevice);
viClose()(resourceManager);
// return true on success
callback(null, true);
}