@@ -273,6 +273,7 @@ Visca.compatibility = {
273
273
-- When the first preset is 1, leave it nil (or set to 0).
274
274
-- When the first preset is 0, set the offset to 1.
275
275
-- The preset recalled at the camera is 'preset - <preset_nr_offset>'
276
+ pantilt_pan_bytes = 4 -- The number of bytes used for the pan argument in absolute pan/tilt commands
276
277
}
277
278
278
279
394
395
function Visca .PayloadReply :get_inquiry_data_for (inquiry_payload )
395
396
local _ ,_ ,category ,inquiry_command = unpack (inquiry_payload )
396
397
local data = {}
398
+ local unsupported_nr_of_arguments = false
397
399
398
400
if category == Visca .categories .interface then
399
401
if inquiry_command == Visca .inquiry_commands .software_version then
@@ -409,38 +411,82 @@ function Visca.PayloadReply:get_inquiry_data_for(inquiry_payload)
409
411
rom_version = bit .lshift (self .arguments [5 ] or 0 , 8 ) + (self .arguments [6 ] or 0 ),
410
412
max_nr_sockets = bit .band (self .arguments [7 ] or 0 , 0x0F ),
411
413
}
414
+ else
415
+ unsupported_nr_of_arguments = true
412
416
end
413
417
end
414
418
elseif category == Visca .categories .camera then
415
419
if inquiry_command == Visca .inquiry_commands .color_gain then
416
- data = {
417
- color_level = bit .band (self .arguments [4 ] or 0 , 0x0F )
418
- }
420
+ if self .argument_cnt == 4 then
421
+ data = {
422
+ color_level = bit .band (self .arguments [4 ] or 0 , 0x0F )
423
+ }
424
+ else
425
+ unsupported_nr_of_arguments = true
426
+ end
419
427
elseif inquiry_command == Visca .inquiry_commands .brightness_position then
420
- data = {
421
- brightness = bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
422
- bit .band (self .arguments [4 ] or 0 , 0x0F ),
423
- }
428
+ if self .argument_cnt == 4 then
429
+ data = {
430
+ brightness = bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
431
+ bit .band (self .arguments [4 ] or 0 , 0x0F ),
432
+ }
433
+ else
434
+ unsupported_nr_of_arguments = true
435
+ end
424
436
elseif inquiry_command == Visca .inquiry_commands .zoom_position then
425
- data = {
426
- zoom = bit .lshift (bit .band (self .arguments [1 ] or 0 , 0x0F ), 12 ) +
427
- bit .lshift (bit .band (self .arguments [2 ] or 0 , 0x0F ), 8 ) +
428
- bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
429
- bit .band (self .arguments [4 ] or 0 , 0x0F ),
430
- }
437
+ if self .argument_cnt == 4 then
438
+ data = {
439
+ zoom = bit .lshift (bit .band (self .arguments [1 ] or 0 , 0x0F ), 12 ) +
440
+ bit .lshift (bit .band (self .arguments [2 ] or 0 , 0x0F ), 8 ) +
441
+ bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
442
+ bit .band (self .arguments [4 ] or 0 , 0x0F ),
443
+ }
444
+ else
445
+ unsupported_nr_of_arguments = true
446
+ end
431
447
end
432
448
elseif category == Visca .categories .pan_tilter then
433
449
if inquiry_command == Visca .inquiry_commands .pantilt_position then
434
- data = {
435
- pan = bit .lshift (bit .band (self .arguments [1 ] or 0 , 0x0F ), 12 ) +
436
- bit .lshift (bit .band (self .arguments [2 ] or 0 , 0x0F ), 8 ) +
437
- bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
438
- bit .band (self .arguments [4 ] or 0 , 0x0F ),
439
- tilt = bit .lshift (bit .band (self .arguments [5 ] or 0 , 0x0F ), 12 ) +
440
- bit .lshift (bit .band (self .arguments [6 ] or 0 , 0x0F ), 8 ) +
441
- bit .lshift (bit .band (self .arguments [7 ] or 0 , 0x0F ), 4 ) +
442
- bit .band (self .arguments [8 ] or 0 , 0x0F )
443
- }
450
+ if self .argument_cnt == 8 then
451
+ data = {
452
+ pantilt_pan_bytes = 4 ,
453
+ pan = bit .lshift (bit .band (self .arguments [1 ] or 0 , 0x0F ), 12 ) +
454
+ bit .lshift (bit .band (self .arguments [2 ] or 0 , 0x0F ), 8 ) +
455
+ bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 4 ) +
456
+ bit .band (self .arguments [4 ] or 0 , 0x0F ),
457
+ tilt = bit .lshift (bit .band (self .arguments [5 ] or 0 , 0x0F ), 12 ) +
458
+ bit .lshift (bit .band (self .arguments [6 ] or 0 , 0x0F ), 8 ) +
459
+ bit .lshift (bit .band (self .arguments [7 ] or 0 , 0x0F ), 4 ) +
460
+ bit .band (self .arguments [8 ] or 0 , 0x0F )
461
+ }
462
+ elseif self .argument_cnt == 9 then
463
+ data = {
464
+ pantilt_pan_bytes = 5 ,
465
+ pan = bit .lshift (bit .band (self .arguments [1 ] or 0 , 0x0F ), 16 ) +
466
+ bit .lshift (bit .band (self .arguments [2 ] or 0 , 0x0F ), 12 ) +
467
+ bit .lshift (bit .band (self .arguments [3 ] or 0 , 0x0F ), 8 ) +
468
+ bit .lshift (bit .band (self .arguments [4 ] or 0 , 0x0F ), 4 ) +
469
+ bit .band (self .arguments [5 ] or 0 , 0x0F ),
470
+ tilt = bit .lshift (bit .band (self .arguments [6 ] or 0 , 0x0F ), 12 ) +
471
+ bit .lshift (bit .band (self .arguments [7 ] or 0 , 0x0F ), 8 ) +
472
+ bit .lshift (bit .band (self .arguments [8 ] or 0 , 0x0F ), 4 ) +
473
+ bit .band (self .arguments [9 ] or 0 , 0x0F )
474
+ }
475
+ else
476
+ unsupported_nr_of_arguments = true
477
+ end
478
+ end
479
+ end
480
+
481
+ if next (data ) == nil then
482
+ if Visca .debug then
483
+ if unsupported_nr_of_arguments then
484
+ print (string.format (" Unsupported number of arguments received for inquiry %d (%d)" ,
485
+ inquiry_command , self .argument_cnt ))
486
+ else
487
+ print (string.format (" Unsupported inquiry type received (%d) for command category %d" ,
488
+ inquiry_command , category ))
489
+ end
444
490
end
445
491
end
446
492
@@ -1347,23 +1393,44 @@ function Visca.Connection:Cam_PanTilt_Absolute(speed, pan, tilt)
1347
1393
1348
1394
local msg = Visca .Message .new ()
1349
1395
msg .payload_type = Visca .payload_types .visca_command
1350
- msg .payload = {
1351
- Visca .packet_consts .req_addr_base + bit .band (Visca .default_camera_nr or 1 , 0x0F ),
1352
- Visca .packet_consts .command ,
1353
- Visca .categories .pan_tilter ,
1354
- Visca .commands .pantilt_absolute ,
1355
- speed , -- Pan speed
1356
- speed , -- Tilt speed
1357
- bit .band (bit .rshift (pan , 12 ), 0x0F ),
1358
- bit .band (bit .rshift (pan , 8 ), 0x0F ),
1359
- bit .band (bit .rshift (pan , 4 ), 0x0F ),
1360
- bit .band (pan , 0x0F ),
1361
- bit .band (bit .rshift (tilt , 12 ), 0x0F ),
1362
- bit .band (bit .rshift (tilt , 8 ), 0x0F ),
1363
- bit .band (bit .rshift (tilt , 4 ), 0x0F ),
1364
- bit .band (tilt , 0x0F ),
1365
- Visca .packet_consts .terminator
1366
- }
1396
+ if not self .compatibility .pantilt_pan_bytes or self .compatibility .pantilt_pan_bytes == 4 then
1397
+ msg .payload = {
1398
+ Visca .packet_consts .req_addr_base + bit .band (Visca .default_camera_nr or 1 , 0x0F ),
1399
+ Visca .packet_consts .command ,
1400
+ Visca .categories .pan_tilter ,
1401
+ Visca .commands .pantilt_absolute ,
1402
+ speed , -- Pan speed
1403
+ speed , -- Tilt speed
1404
+ bit .band (bit .rshift (pan , 12 ), 0x0F ),
1405
+ bit .band (bit .rshift (pan , 8 ), 0x0F ),
1406
+ bit .band (bit .rshift (pan , 4 ), 0x0F ),
1407
+ bit .band (pan , 0x0F ),
1408
+ bit .band (bit .rshift (tilt , 12 ), 0x0F ),
1409
+ bit .band (bit .rshift (tilt , 8 ), 0x0F ),
1410
+ bit .band (bit .rshift (tilt , 4 ), 0x0F ),
1411
+ bit .band (tilt , 0x0F ),
1412
+ Visca .packet_consts .terminator
1413
+ }
1414
+ elseif self .compatibility .pantilt_pan_bytes == 5 then
1415
+ msg .payload = {
1416
+ Visca .packet_consts .req_addr_base + bit .band (Visca .default_camera_nr or 1 , 0x0F ),
1417
+ Visca .packet_consts .command ,
1418
+ Visca .categories .pan_tilter ,
1419
+ Visca .commands .pantilt_absolute ,
1420
+ speed , -- Pan/Tilt speed
1421
+ 00 , -- Fixed
1422
+ bit .band (bit .rshift (pan , 16 ), 0x0F ),
1423
+ bit .band (bit .rshift (pan , 12 ), 0x0F ),
1424
+ bit .band (bit .rshift (pan , 8 ), 0x0F ),
1425
+ bit .band (bit .rshift (pan , 4 ), 0x0F ),
1426
+ bit .band (pan , 0x0F ),
1427
+ bit .band (bit .rshift (tilt , 12 ), 0x0F ),
1428
+ bit .band (bit .rshift (tilt , 8 ), 0x0F ),
1429
+ bit .band (bit .rshift (tilt , 4 ), 0x0F ),
1430
+ bit .band (tilt , 0x0F ),
1431
+ Visca .packet_consts .terminator
1432
+ }
1433
+ end
1367
1434
1368
1435
return self :send (msg )
1369
1436
end
0 commit comments