The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.

This URL has Read-Only access.

Statistics
| Revision:

root / tags / 0.1.204 / DomotiGaServer / CVISCA.class @ 852

History | View | Annotate | Download (9.2 kB)

1 239 rdnzl
' Gambas class file
2 239 rdnzl
3 239 rdnzl
' Description:
4 239 rdnzl
' CVISCA.class
5 239 rdnzl
' Support for Sony VISCA protocol to control PTZ camera's
6 239 rdnzl
7 239 rdnzl
' Development Status:
8 239 rdnzl
' Working, a few bugs to fix.
9 239 rdnzl
10 239 rdnzl
' Links:
11 239 rdnzl
' http://www.vision.auc.dk/~tbm/Sony/EVID30.pdf
12 239 rdnzl
' http://animatlab.lip6.fr/~gouricho/SonyPTZCamEVID31/evidapplication.html
13 239 rdnzl
' http://www.j3soft.net/webcam/evi-d30.htm
14 239 rdnzl
' http://www.j3soft.net/webcam/evi-d31.htm
15 239 rdnzl
' http://f1chf.free.fr/SONY/
16 239 rdnzl
17 239 rdnzl
' DomotiGa - an open source home automation program.
18 239 rdnzl
' Copyright(C) 2008-2009 Ron Klinkien
19 239 rdnzl
20 239 rdnzl
' Read file called COPYING for license details.
21 239 rdnzl
22 239 rdnzl
PROPERTY Port AS String
23 239 rdnzl
PROPERTY VISCADebug AS Boolean
24 239 rdnzl
25 239 rdnzl
PRIVATE sPort AS String
26 239 rdnzl
PRIVATE bVISCADebug AS Boolean
27 239 rdnzl
28 239 rdnzl
PUBLIC hVISCA AS NEW SerialPort
29 239 rdnzl
PUBLIC bCamNum AS Byte = &H80 + Hex(Main.iVISCACameraAddress)
30 239 rdnzl
31 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 239 rdnzl
' open serial port
33 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 239 rdnzl
PUBLIC FUNCTION Connect() AS Boolean
35 239 rdnzl
36 239 rdnzl
  ' try to close the port
37 239 rdnzl
  TRY hVISCA.Close
38 239 rdnzl
39 239 rdnzl
  ' get a new one
40 239 rdnzl
  hVISCA = NEW Serialport AS "VISCA"
41 239 rdnzl
  WITH hVISCA
42 239 rdnzl
    .PortName = sPort
43 239 rdnzl
    .Speed = 9600
44 239 rdnzl
    .Parity = 0
45 239 rdnzl
    .DataBits = 8
46 239 rdnzl
    .StopBits = 1
47 239 rdnzl
    .FlowControl = 0
48 239 rdnzl
    .Open()
49 239 rdnzl
  END WITH
50 239 rdnzl
51 239 rdnzl
  ' all ok
52 239 rdnzl
  RETURN TRUE
53 239 rdnzl
54 239 rdnzl
CATCH ' some errors
55 244 rdnzl
  Main.WriteLog(("VISCA Error: ") & ERROR.Text)
56 239 rdnzl
  RETURN FALSE
57 239 rdnzl
58 239 rdnzl
END
59 239 rdnzl
60 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 239 rdnzl
' close port
62 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63 239 rdnzl
PUBLIC FUNCTION Disconnect() AS Boolean
64 239 rdnzl
65 239 rdnzl
  ' try to close the connection
66 239 rdnzl
  TRY hVISCA.Close
67 244 rdnzl
  Main.WriteLog(("VISCA serial port close."))
68 239 rdnzl
69 239 rdnzl
  ' all ok
70 239 rdnzl
  RETURN TRUE
71 239 rdnzl
72 239 rdnzl
CATCH ' some errors
73 244 rdnzl
  Main.WriteLog(("VISCA Error: ") & ERROR.Text)
74 239 rdnzl
  RETURN FALSE
75 239 rdnzl
76 239 rdnzl
END
77 239 rdnzl
78 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79 239 rdnzl
' send a command to the camera
80 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 239 rdnzl
PUBLIC FUNCTION SendCommand(aCommand AS Array)
82 239 rdnzl
83 239 rdnzl
  DIM iCmd AS Byte
84 239 rdnzl
85 239 rdnzl
  IF Main.bVISCADebug THEN Main.WriteDebugLog("[VISCA] > ", TRUE)
86 239 rdnzl
  FOR EACH iCmd IN aCommand
87 239 rdnzl
    IF Main.bVISCADebug THEN Main.WriteRFXDebugLog(Hex$(iCmd, 2) & " ", TRUE)
88 239 rdnzl
    TRY WRITE #hVISCA, iCmd
89 239 rdnzl
  NEXT
90 239 rdnzl
  IF Main.bVISCADebug THEN Main.WriteRFXDebugLog("\n", TRUE)
91 239 rdnzl
92 239 rdnzl
END
93 239 rdnzl
94 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
95 239 rdnzl
' got data back from camera
96 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97 239 rdnzl
PUBLIC SUB VISCA_Read()
98 239 rdnzl
99 239 rdnzl
  DIM sData AS Byte
100 239 rdnzl
101 262 rdnzl
  TRY READ #hVISCA, sData
102 262 rdnzl
  IF ERROR THEN Main.WriteDebugLog(("[VISCA] Error reading data from the serial port! ->") & ERROR.Text)
103 239 rdnzl
  IF Main.bVISCADebug THEN Main.WriteDebugLog("[VISCA] < " & Hex$(sData, 2))
104 239 rdnzl
105 239 rdnzl
END
106 239 rdnzl
107 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108 239 rdnzl
' send address set command to camera
109 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110 239 rdnzl
PUBLIC SUB AddressSet()
111 239 rdnzl
112 239 rdnzl
  DIM b AS Byte[] = [CByte(&H88), CByte(&H30), &H1, &HFF]
113 239 rdnzl
114 239 rdnzl
  SendCommand(b)
115 239 rdnzl
116 239 rdnzl
END
117 239 rdnzl
118 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 239 rdnzl
' send clear command to camera
120 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121 239 rdnzl
PUBLIC SUB IfClear()
122 239 rdnzl
123 239 rdnzl
  DIM b AS Byte[] = [CByte(&H88), CByte(&H1), &H0, &H1, &HFF]
124 239 rdnzl
125 239 rdnzl
  SendCommand(b)
126 239 rdnzl
127 239 rdnzl
END
128 239 rdnzl
129 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130 239 rdnzl
' switch camera on and off (power save mode)
131 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132 239 rdnzl
PUBLIC SUB Power(sMode AS String)
133 239 rdnzl
134 262 rdnzl
  DIM b AS Byte[] = [CByte(bCamNum), CByte(&h1), &H4, &H0, IIf(sMode = "on", &H2, &H3), &HFF]
135 239 rdnzl
136 239 rdnzl
  SendCommand(b)
137 239 rdnzl
138 239 rdnzl
END
139 239 rdnzl
140 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 239 rdnzl
' change white balance setting
142 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143 239 rdnzl
PUBLIC SUB WhiteBalance(sMode AS String)
144 239 rdnzl
145 239 rdnzl
  DIM b AS Byte[6]
146 239 rdnzl
147 239 rdnzl
  b[0] = bCamNum
148 239 rdnzl
  b[1] = &H1
149 239 rdnzl
  b[2] = &H4
150 239 rdnzl
  b[3] = &H35
151 239 rdnzl
152 262 rdnzl
  SELECT CASE LCase(sMode)
153 262 rdnzl
    CASE "auto"
154 239 rdnzl
      b[4] = &H0
155 262 rdnzl
    CASE "indoor"
156 239 rdnzl
      b[4] = &H1
157 262 rdnzl
    CASE "outdoor"
158 239 rdnzl
      b[4] = &H2
159 262 rdnzl
    CASE "onepush"
160 239 rdnzl
      b[4] = &H3
161 262 rdnzl
    CASE "trigger"
162 239 rdnzl
      b[4] = &H4
163 239 rdnzl
  END SELECT
164 239 rdnzl
165 239 rdnzl
  b[5] = &HFF
166 239 rdnzl
  SendCommand(b)
167 239 rdnzl
168 239 rdnzl
END
169 239 rdnzl
170 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171 239 rdnzl
' control autoexposure mode
172 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
173 239 rdnzl
PUBLIC SUB AutoExposure(sMode AS String)
174 239 rdnzl
175 239 rdnzl
  DIM b AS Byte[6]
176 239 rdnzl
177 239 rdnzl
  b[0] = bCamNum
178 239 rdnzl
  b[1] = &H1
179 239 rdnzl
  b[2] = &H4
180 239 rdnzl
  b[3] = &H39
181 239 rdnzl
182 262 rdnzl
  SELECT CASE LCase(sMode)
183 262 rdnzl
    CASE "auto"
184 239 rdnzl
      b[4] = &H0
185 262 rdnzl
    CASE "manual"
186 239 rdnzl
      b[4] = &H3
187 262 rdnzl
    CASE "shutter"
188 239 rdnzl
      b[4] = &HA
189 262 rdnzl
    CASE "iris"
190 239 rdnzl
      b[4] = &HB
191 262 rdnzl
    CASE "bright"
192 239 rdnzl
      b[4] = &HD
193 239 rdnzl
  END SELECT
194 239 rdnzl
195 239 rdnzl
  b[5] = &HFF
196 239 rdnzl
  SendCommand(b)
197 239 rdnzl
198 239 rdnzl
END
199 239 rdnzl
200 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
201 239 rdnzl
' control exposure modes (bright, shutter, iris and gain)
202 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
203 239 rdnzl
PUBLIC SUB ManualExposure(sMode AS String, sDo AS String)
204 239 rdnzl
205 239 rdnzl
  DIM b AS Byte[7]
206 239 rdnzl
207 239 rdnzl
  b[0] = bCamNum
208 239 rdnzl
  b[1] = &H1
209 239 rdnzl
  b[2] = &H4
210 239 rdnzl
  b[3] = &H0
211 239 rdnzl
212 262 rdnzl
  SELECT CASE LCase(sMode)
213 262 rdnzl
    CASE "bright"
214 239 rdnzl
      b[4] = &HD
215 262 rdnzl
    CASE "shutter"
216 239 rdnzl
      b[4] = &HA
217 262 rdnzl
    CASE "iris"
218 239 rdnzl
      b[4] = &HB
219 262 rdnzl
    CASE "gain"
220 239 rdnzl
      b[4] = &HC
221 239 rdnzl
  END SELECT
222 239 rdnzl
223 239 rdnzl
  IF sDo = "-" THEN
224 239 rdnzl
    b[5] = &H2
225 239 rdnzl
  ELSE IF sDo = "+" THEN
226 239 rdnzl
    b[5] = &H3
227 239 rdnzl
  ELSE
228 239 rdnzl
    b[5] = &H0 ' reset
229 239 rdnzl
  END IF
230 239 rdnzl
231 239 rdnzl
  b[6] = &HFF
232 239 rdnzl
  SendCommand(b)
233 239 rdnzl
234 239 rdnzl
END
235 239 rdnzl
236 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
237 239 rdnzl
' switch backlight compensation on/off
238 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
239 239 rdnzl
PUBLIC SUB BackLight(sMode AS String)
240 239 rdnzl
241 262 rdnzl
  DIM b AS Byte[] = [CByte(bCamNum), CByte(&H1), &H4, &H33, IIf(sMode = "on", &H2, &H3), &HFF]
242 239 rdnzl
243 239 rdnzl
  SendCommand(b)
244 239 rdnzl
245 239 rdnzl
END
246 239 rdnzl
247 262 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
248 262 rdnzl
' tiltdrive
249 262 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
250 339 rdnzl
PUBLIC SUB Direction(sMode AS String, iPanSpeed AS Integer, iTiltSpeed AS Integer)
251 239 rdnzl
252 239 rdnzl
  DIM b AS Byte[9]
253 239 rdnzl
254 239 rdnzl
  b[0] = bCamNum
255 239 rdnzl
  b[1] = &H1
256 239 rdnzl
  b[2] = &H6
257 239 rdnzl
  b[3] = &H1
258 339 rdnzl
  b[4] = Format(Val("&H" & Hex(iPanSpeed)))
259 339 rdnzl
  b[5] = Format(Val("&H" & Hex(iTiltSpeed)))
260 239 rdnzl
261 262 rdnzl
  SELECT CASE LCase(sMode)
262 262 rdnzl
    CASE "up"
263 239 rdnzl
      b[6] = &H3
264 239 rdnzl
      b[7] = &H1
265 262 rdnzl
    CASE "down"
266 239 rdnzl
      b[6] = &H3
267 239 rdnzl
      b[7] = &H2
268 262 rdnzl
    CASE "left"
269 239 rdnzl
      b[6] = &H1
270 239 rdnzl
      b[7] = &H3
271 262 rdnzl
    CASE "right"
272 239 rdnzl
      b[6] = &H2
273 239 rdnzl
      b[7] = &H3
274 262 rdnzl
    CASE "upleft"
275 239 rdnzl
      b[6] = &H1
276 239 rdnzl
      b[7] = &H1
277 262 rdnzl
    CASE "downleft"
278 239 rdnzl
      b[6] = &H1
279 239 rdnzl
      b[7] = &H2
280 262 rdnzl
    CASE "upright"
281 239 rdnzl
      b[6] = &H2
282 239 rdnzl
      b[7] = &H1
283 262 rdnzl
    CASE "downright"
284 239 rdnzl
      b[6] = &H2
285 239 rdnzl
      b[7] = &H2
286 262 rdnzl
    CASE "stop"
287 239 rdnzl
      b[6] = &H3
288 239 rdnzl
      b[7] = &H3
289 239 rdnzl
  END SELECT
290 239 rdnzl
291 239 rdnzl
  b[8] = &HFF
292 239 rdnzl
  SendCommand(b)
293 239 rdnzl
294 239 rdnzl
END
295 239 rdnzl
296 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
297 239 rdnzl
' stop whatever you are doing
298 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
299 239 rdnzl
PUBLIC SUB StopCommand()
300 239 rdnzl
301 239 rdnzl
  DIM b AS Byte[9]
302 239 rdnzl
303 239 rdnzl
  b[0] = bCamNum
304 239 rdnzl
  b[1] = &H1
305 239 rdnzl
  b[2] = &H6
306 239 rdnzl
  b[3] = &H1
307 239 rdnzl
  b[4] = &H10
308 239 rdnzl
  b[5] = &H10
309 239 rdnzl
  b[6] = &H3
310 239 rdnzl
  b[7] = &H3
311 239 rdnzl
  b[8] = &HFF
312 239 rdnzl
313 239 rdnzl
  SendCommand(b)
314 239 rdnzl
315 239 rdnzl
END
316 239 rdnzl
317 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
318 239 rdnzl
' go home
319 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
320 239 rdnzl
PUBLIC SUB Home()
321 239 rdnzl
322 239 rdnzl
  DIM b AS Byte[] = [CByte(bCamNum), CByte(&H1), &H6, &H4, &HFF]
323 239 rdnzl
324 239 rdnzl
  SendCommand(b)
325 239 rdnzl
326 239 rdnzl
END
327 239 rdnzl
328 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
329 239 rdnzl
' memory reset, set and recall
330 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
331 339 rdnzl
PUBLIC SUB Memory(sPreset AS String, bRecall AS Boolean, bRecallSet AS Boolean)
332 239 rdnzl
333 239 rdnzl
  DIM b AS Byte[7]
334 239 rdnzl
335 239 rdnzl
  b[0] = bCamNum
336 239 rdnzl
  b[1] = &H1
337 239 rdnzl
  b[2] = &H4
338 239 rdnzl
  b[3] = &H3F
339 239 rdnzl
340 339 rdnzl
  IF bRecall = TRUE THEN
341 339 rdnzl
    b[4] = &H2 ' recall
342 339 rdnzl
  ELSE IF BRecallSet = TRUE THEN
343 339 rdnzl
    b[4] = &H1 ' set
344 339 rdnzl
  ELSE
345 239 rdnzl
    b[4] = &H0 ' reset
346 339 rdnzl
  END IF
347 239 rdnzl
348 239 rdnzl
  b[5] = sPreset
349 239 rdnzl
  b[6] = &HFF
350 239 rdnzl
  SendCommand(b)
351 239 rdnzl
352 239 rdnzl
END
353 239 rdnzl
354 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
355 239 rdnzl
' power inquiry
356 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
357 239 rdnzl
PUBLIC SUB PowerInq()
358 239 rdnzl
359 239 rdnzl
  DIM b AS Byte[] = [CByte(bCamNum), CByte(&H9), &H4, &H0, &HFF]
360 239 rdnzl
361 239 rdnzl
  SendCommand(b)
362 239 rdnzl
363 239 rdnzl
END
364 239 rdnzl
365 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
366 239 rdnzl
' control focus modes (stop, near, far, auto and manual)
367 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
368 239 rdnzl
PUBLIC SUB Focus(sMode AS String)
369 239 rdnzl
370 239 rdnzl
  DIM b AS Byte[6]
371 239 rdnzl
372 239 rdnzl
  b[0] = bCamNum
373 239 rdnzl
  b[1] = &H1
374 239 rdnzl
  b[2] = &H4
375 239 rdnzl
376 262 rdnzl
  SELECT CASE LCase(sMode)
377 262 rdnzl
    CASE "stop"
378 239 rdnzl
      b[3] = &H8
379 239 rdnzl
      b[4] = &H0
380 262 rdnzl
    CASE "far"
381 239 rdnzl
      b[3] = &H8
382 239 rdnzl
      b[4] = &H2
383 262 rdnzl
    CASE "near"
384 239 rdnzl
      b[3] = &H8
385 239 rdnzl
      b[4] = &H3
386 262 rdnzl
    CASE "auto"
387 239 rdnzl
      b[4] = &H38
388 239 rdnzl
      b[4] = &H2
389 262 rdnzl
    CASE "manual"
390 239 rdnzl
      b[4] = &H38
391 239 rdnzl
      b[5] = &H3
392 239 rdnzl
  END SELECT
393 239 rdnzl
394 239 rdnzl
  b[5] = &HFF
395 239 rdnzl
  SendCommand(b)
396 239 rdnzl
397 239 rdnzl
END
398 239 rdnzl
399 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
400 239 rdnzl
' control zoom (stop, direct, tele, wide, tele(var) and wide(var)
401 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
402 339 rdnzl
PUBLIC SUB Zoom(sMode AS String, iValue AS Integer)
403 239 rdnzl
404 239 rdnzl
  DIM b AS Byte[6]
405 239 rdnzl
406 239 rdnzl
  b[0] = bCamNum
407 239 rdnzl
  b[1] = &H1
408 239 rdnzl
  b[2] = &H4
409 239 rdnzl
410 262 rdnzl
  SELECT CASE LCase(sMode)
411 262 rdnzl
    CASE "stop"
412 239 rdnzl
      b[3] = &H7
413 239 rdnzl
      b[4] = &H0
414 262 rdnzl
    CASE "tele"
415 239 rdnzl
      b[3] = &H7
416 339 rdnzl
      IF iValue > 1 THEN
417 339 rdnzl
        b[4] = &H2 + Hex(iValue)
418 339 rdnzl
      ELSE IF iValue > 7 THEN
419 339 rdnzl
        b[4] = &H2 + Hex(7)
420 339 rdnzl
      ELSE
421 239 rdnzl
        b[4] = &H2
422 339 rdnzl
      END IF
423 262 rdnzl
    CASE "wide"
424 239 rdnzl
      b[3] = &H7
425 339 rdnzl
      IF iValue > 1 THEN
426 339 rdnzl
        b[4] = &H3 + Hex(iValue)
427 339 rdnzl
      ELSE IF iValue > 7 THEN
428 339 rdnzl
        b[4] = &H2 + Hex(7)
429 339 rdnzl
      ELSE
430 339 rdnzl
        b[4] = &H3
431 339 rdnzl
      END IF
432 239 rdnzl
      b[4] = &H3
433 239 rdnzl
  END SELECT
434 239 rdnzl
435 239 rdnzl
  b[5] = &HFF
436 239 rdnzl
  SendCommand(b)
437 239 rdnzl
438 239 rdnzl
END
439 239 rdnzl
440 239 rdnzl
441 239 rdnzl
' implement the properties
442 239 rdnzl
PRIVATE FUNCTION Port_Read() AS String
443 239 rdnzl
444 239 rdnzl
  RETURN sPort
445 239 rdnzl
446 239 rdnzl
END
447 239 rdnzl
448 239 rdnzl
PRIVATE SUB Port_Write(sValue AS String)
449 239 rdnzl
450 239 rdnzl
  sPort = sValue
451 239 rdnzl
452 239 rdnzl
END
453 239 rdnzl
454 239 rdnzl
PRIVATE FUNCTION VISCADebug_Read() AS Boolean
455 239 rdnzl
456 239 rdnzl
  RETURN bVISCADebug
457 239 rdnzl
458 239 rdnzl
END
459 239 rdnzl
460 239 rdnzl
PRIVATE SUB VISCADebug_Write(sValue AS Boolean)
461 239 rdnzl
462 239 rdnzl
  bVISCADebug = sValue
463 239 rdnzl
464 239 rdnzl
END