This one is an old equipment, but maybe in the future it might make someone happy. (At least I hope)
Example drawing snippet provided, you might need a driver to have a shared entry point for the device.
Code: Select all
;Driver for Wacom Intuos 3 PTZ-630 Release 1.2
;VID:056A (1386), PID:00B1 (177), RELEASE:0102 (258)
;Vendor defined descriptor reverse engineered, module written by miso, 2025.12.28
;Policy: 777, do what you please. No credit required.
;-=======MODULE Start===========================================================================
DeclareModule PTZ
Declare Open()
Declare Examine()
Declare Close()
Declare.i PenScreenX()
Declare.i PenScreenY()
Declare.u PenRawX()
Declare.u PenRawY()
Declare.i Getpressure()
Declare.a PenInRange()
Declare.a PenIsClose()
Declare.a PenButton_1()
Declare.a PenButton_2()
Declare.i GetLeftSlider()
Declare.i GetRightSlider()
Declare.a Rightbutton_1()
Declare.a Rightbutton_2()
Declare.a Rightbutton_3()
Declare.a Rightbutton_4()
Declare.a Leftbutton_1()
Declare.a Leftbutton_2()
Declare.a Leftbutton_3()
Declare.a Leftbutton_4()
EndDeclareModule
Module PTZ
Structure hstruct
id.i
iswacom.i
path.s
vid.s
pid.s
*buffer
*buttons
*pen
lastsize.i
EndStructure
Global wacomptz.hstruct
Procedure.u swap16(u.u)
ProcedureReturn (u<<8|((u>>8)&$FF))
EndProcedure
;=============================================================================================
;Open device Wacom Intuos 3 PTZ-630 Release 1.2 for use if exists, and an entry point is given
;allocates 3x10 bytes memory if succesful.
;=============================================================================================
Procedure Open()
ExamineHIDs()
While NextHID()
If HIDInfo(#PB_HID_VendorId) = "1386" And HIDInfo(#PB_HID_ProductId) = "177" And HIDInfo(#PB_HID_ReleaseNumber) = "258"
If HIDInfo(#PB_HID_UsagePage) = "13" And HIDInfo(#PB_HID_Usage) = "1"
wacomptz\id = OpenHIDPath(#PB_Any,HIDInfo(#PB_HID_Path))
If IsHID(wacomptz\id)
Debug "ok"
wacomptz\buffer = AllocateMemory(10)
wacomptz\pen = AllocateMemory(10)
wacomptz\buttons = AllocateMemory(10)
EndIf
EndIf
EndIf
Wend
EndProcedure
;=============================================================================================
;Closes device Wacom Intuos 3 PTZ-630 Release 1.2 for use if exists and previously opened.
;Deallocates 3x10 bytes memory.
;=============================================================================================
Procedure Close()
If IsHID(wacomptz\id)
FreeMemory(wacomptz\buffer)
FreeMemory(wacomptz\pen)
FreeMemory(wacomptz\buttons)
CloseHID(wacomptz\id)
EndIf
EndProcedure
;=============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for raw data if previously opened
;=============================================================================================
Procedure Examine()
If IsHID(wacomptz\id)
Repeat
wacomptz\lastsize = ReadHIDData(wacomptz\id,wacomptz\buffer,10,1)
If PeekA(wacomptz\buffer)=$0c
CopyMemory(wacomptz\buffer,wacomptz\buttons,10)
ElseIf PeekA(wacomptz\buffer)=$02
CopyMemory(wacomptz\buffer,wacomptz\pen,10)
EndIf
Until wacomptz\lastsize = 0
EndIf
EndProcedure
;==============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for pen screen x. Requires an opened screen
;==============================================================================================
Procedure.i PenScreenX()
Protected u.u,f.f,out.i
If IsHID(wacomptz\id)
u = PeekU(wacomptz\pen+2)
u = swap16(u)
f.f = (ScreenWidth()/20320)*u
out.i = Round(f.f,#PB_Round_Down)
ProcedureReturn out.i
EndIf
EndProcedure
;==============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for pen screen y. Requires an opened screen
;==============================================================================================
Procedure.i PenScreenY()
Protected u.u,f.f,out.i
If IsHID(wacomptz\id)
u = PeekU(wacomptz\pen+4)
u = swap16(u)
f.f = (ScreenHeight()/15240)*u
out.i = Round(f.f,#PB_Round_Down)
ProcedureReturn out.i
EndIf
EndProcedure
;==============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for device raw x. 0-20320
;==============================================================================================
Procedure.u PenRawX()
Protected u.u,f.f,out.i
If IsHID(wacomptz\id)
ProcedureReturn swap16(PeekU(wacomptz\pen+2))
EndIf
EndProcedure
;==============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for device raw y. 0-15240
;==============================================================================================
Procedure.u PenRawY()
Protected u.u,f.f,out.i
If IsHID(wacomptz\id)
ProcedureReturn swap16(PeekU(wacomptz\pen+4))
EndIf
EndProcedure
;==============================================================================================
;Examines device Wacom Intuos 3 PTZ-630 Release 1.2 for pressure strength 0-255
;==============================================================================================
Procedure.i Getpressure()
Protected out.i
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
out = PeekA(wacomptz\pen+6)
ProcedureReturn out
EndProcedure
;==============================================================================================
;Returns 1 if pen is in range, 0 otherwise
;==============================================================================================
Procedure.a PenInRange()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\pen+1))>>5)&%1
EndProcedure
;==============================================================================================
;Returns 1 if pen is close, 0 otherwise
;==============================================================================================
Procedure.a PenIsClose()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\pen+1))>>6)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a PenButton_1()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\pen+1))>>1)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a PenButton_2()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\pen+1))>>2)&%1
EndProcedure
;==============================================================================================
;0-13 , 0 = no touch, 1 = top 13= bottom
;==============================================================================================
Procedure.i GetLeftSlider()
Protected u.u,i.i
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
u = swap16(PeekU(wacomptz\buttons+1))
If u = 0 : ProcedureReturn 0:EndIf
For i = 0 To 15
If u>>i&%1 :ProcedureReturn i+1 : EndIf
Next i
ProcedureReturn 0
EndProcedure
;==============================================================================================
;0-13 0 = no touch, 1 = top 13= bottom
;==============================================================================================
Procedure.i GetRightSlider()
Protected u.u,i.i
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
u = swap16(PeekU(wacomptz\buttons+3))
If u = 0 : ProcedureReturn 0:EndIf
For i = 0 To 15
If u>>i&%1 :ProcedureReturn i+1 : EndIf
Next i
ProcedureReturn 0
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Rightbutton_1()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+6)))&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Rightbutton_2()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+6))>>1)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Rightbutton_3()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+6))>>2)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Rightbutton_4()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+6))>>3)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Leftbutton_1()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+5)))&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Leftbutton_2()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+5))>>1)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Leftbutton_3()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+5))>>2)&%1
EndProcedure
;==============================================================================================
;0-1
;==============================================================================================
Procedure.a Leftbutton_4()
If Not IsHID(wacomptz\id) : ProcedureReturn 0 : EndIf
ProcedureReturn ((PeekA(wacomptz\buttons+5))>>3)&%1
EndProcedure
EndModule
;-=======MODULE END=============================================================================
;-=======EXAMPLE START==========================================================================
DeclareModule petskii
EnableExplicit
;=======================================================================
;system font
;=======================================================================
Declare LoadSyStemFont()
Declare text(x,y,text.s,color.i,intensity.i=255)
Declare centertext(x,y,text.s,color.i,intensity.i=255)
Declare FreeSyStemFont()
EndDeclareModule
Module petskii
;======================================================
;System fonts for displaying system messages on screen
;======================================================
#USED_CHARACTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[{]};:',<.>/?"+Chr(34)
Global Dim font(370):Global Dim fontimport.i(370)
Procedure LoadSyStemFont()
Protected x.i,i.i,j.i,sprline.a
For i = 1 To Len(#USED_CHARACTERS):fontImport(Asc(Mid(#USED_CHARACTERS,i,1)))=1 : Next i
Restore sysfont
For x= 1 To 370
If fontimport(x)=1
font(x)=CreateSprite(-1,8,12,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(font(x)))
DrawingMode(#PB_2DDrawing_AllChannels)
For j=0 To 11
Read.a sprline
For i=0 To 7
If sprline&%1 :Plot(i,j,RGBA(255,255,255,255)): Else : Plot(i,j,RGBA(0,0,0,0)) : EndIf
sprline>>1
Next i
Next j
StopDrawing()
ZoomSprite(font(x),16,24)
EndIf
Next x
EndProcedure
Procedure text(x,y,text.s,color.i,intensity.i=255) : Protected.i textlength,i,character
textlength.i = Len(text.s)
For i = 1 To textlength.i
character.i = Asc(Mid(text.s,i,1))
If character.i>ArraySize(font()) : ProcedureReturn #Null : EndIf
If IsSprite(font(character))
DisplayTransparentSprite(font(character),(x+((i-1) * 16)),(y),intensity,color.i)
EndIf
Next i
EndProcedure
Procedure centertext(x,y,text.s,color.i,intensity=255)
Protected textlength.i
textlength.i = Len(text.s)
x=x-(textlength*8) : y=y-8
text(x,y,text.s,color,intensity)
EndProcedure
Procedure FreeSyStemFont()
Protected i.i
For i = 1 To Len(#USED_CHARACTERS)
If IsSprite(font(i)) : FreeSprite(font(i)) : EndIf
Next i
EndProcedure
DataSection
sysfont:
Data.q $3838383838380000,$EEEE000000003800,$00000000000000EE,$FFEEFFEEEEEE0000,$383800000000EEEE,$0000387EE07C0EFC,$1C3870EECECE0000,$7C7C00000000E6EE,$0000FCEEEE3C7CEE
Data.q $00003870E0E00000,$7070000000000000,$000070381C1C1C38,$707070381C1C0000,$0000000000001C38,$000000EE7CFF7CEE,$38FE383800000000,$0000000000000038,$001C383800000000
Data.q $00FE000000000000,$0000000000000000,$0000383800000000,$3870E0C000000000,$7C7C000000000E1C,$00007CEEEEFEFEEE,$38383C3838380000,$7C7C00000000FE38,$0000FE0E1C70E0EE
Data.q $E078E0EE7C7C0000,$E0E0000000007CEE,$0000E0E0FEEEF8F0,$E0E07E0EFEFE0000,$7C7C000000007CEE,$00007CEEEE7E0EEE,$383870EEFEFE0000,$7C7C000000003838,$00007CEEEE7CEEEE
Data.q $E0FCEEEE7C7C0000,$3838000000007CEE,$0000383800000038,$0000003838380000,$F0F00000001C3838,$0000F0381C0E1C38,$FE00FE0000000000,$1E1E000000000000,$00001E3870E07038
Data.q $3870E0EE7C7C0000,$7C7C000000003800,$00007CCE0EFEFEEE,$EEFEEE7C38380000,$7E7E00000000EEEE,$00007EEEEE7EEEEE,$0E0E0EEE7C7C0000,$3E3E000000007CEE,$00003E7EEEEEEE7E
Data.q $0E3E0E0EFEFE0000,$FEFE00000000FE0E,$00000E0E0E3E0E0E,$EEFE0EEE7C7C0000,$EEEE000000007CEE,$0000EEEEEEFEEEEE,$383838387C7C0000,$F8F8000000007C38,$00003C7E70707070
Data.q $3E1E3E7EEEEE0000,$0E0E00000000EE7E,$0000FE0E0E0E0E0E,$CEFEFEFECECE0000,$EEEE00000000CECE,$0000EEEEFEFEFEFE,$EEEEEEEE7C7C0000,$7E7E000000007CEE,$00000E0E0E7EEEEE
Data.q $EEEEEEEE7C7C0000,$7E7E00000000F07C,$0000EE7E3E7EEEEE,$E07C0EEE7C7C0000,$FEFE000000007CEE,$0000383838383838,$EEEEEEEEEEEE0000,$EEEE000000007CEE,$0000387CEEEEEEEE
Data.q $FEFECECECECE0000,$EEEE00000000CEFE,$0000EEEE7C387CEE,$387CEEEEEEEE0000,$FEFE000000003838,$0000FE0E1C3870E0,$1C1C1C1C7C7C0000,$7C7C000000007C1C,$00007C7070707070
Data.q $3838FE7C38380000,$0000000000003838,$0000FF0000000000,$FCE07C0000000000,$000000000000FCEE,$00007EEEEE7E0E0E,$0E0E7C0000000000,$0000000000007C0E,$0000FCEEEEFCE0E0
Data.q $FEEE7C0000000000,$0000000000007C0E,$0000383838FC38F0,$EEEEFC0000000000,$0E0E0000007EE0FC,$0000EEEEEEEE7E0E,$38383C0038380000,$0000000000007C38,$003C707070700070
Data.q $3E7E0E0E0E0E0000,$3C3C00000000EE7E,$00007C3838383838,$FEFEEE0000000000,$000000000000CEFE,$0000EEEEEEEE7E00,$EEEE7C0000000000,$0000000000007CEE,$000E0E7EEEEE7E00
Data.q $EEEEFC0000000000,$0000000000E0E0FC,$00000E0E0EEE7E00,$7C0EFC0000000000,$0000000000007EE0,$0000F0383838FE38,$EEEEEE0000000000,$000000000000FCEE,$0000387CEEEEEE00
Data.q $FEFECE0000000000,$000000000000FCFC,$0000EE7C387CEE00,$EEEEEE0000000000,$00000000003E70FC,$0000FE1C3870FE00,$381E3838F0F00000,$1E1E00000000F038,$00001E3838F03838
EndDataSection
EndModule
Global screenspr.i
InitSprite():InitKeyboard():InitMouse()
ExamineDesktops()
OpenWindow(0, 0,0, DesktopWidth(0)*0.8,DesktopHeight(0)*0.8, "Test",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
petskii::LoadSyStemFont()
screenspr = CreateSprite(#PB_Any,ScreenWidth(),ScreenHeight(),#PB_Sprite_AlphaBlending)
ptz::Open()
Repeat
While WindowEvent():Wend
ClearScreen(0)
ExamineKeyboard()
ExamineMouse()
MouseDeltaX()
ptz::Examine()
If ptz::Getpressure()>0
StartDrawing(SpriteOutput(screenspr))
Circle(ptz::PenScreenX(),ptz::PenScreenY(),ptz::Getpressure()/20,$0000FF)
StopDrawing()
EndIf
DisplayTransparentSprite(screenspr,0,0)
petskii::text(10,60,"Pen in range : "+ Str(ptz::PenInRange()),$00AA00)
petskii::text(10,90,"Pen is close : "+ Str(ptz::PenIsClose()),$00AA00)
petskii::text(10,130,"Pen Raw X : "+ Str(ptz::PenRawX()),$00AA00)
petskii::text(10,160,"Pen Raw Y : "+ Str(ptz::PenRawY()),$00AA00)
petskii::text(10,200,"Pen Screen X : "+ Str(ptz::PenScreenX()),$00AA00)
petskii::text(10,230,"Pen Screen Y : "+ Str(ptz::PenScreenY()),$00AA00)
petskii::text(10,270,"Pen Pressure : "+ Str(ptz::Getpressure()),$00AA00)
petskii::text(10,300,"Pen Button 1 : "+ Str(ptz::PenButton_1()),$00AA00)
petskii::text(10,330,"Pen Button 2 : "+ Str(ptz::PenButton_2()),$00AA00)
petskii::text(10,370,"Left Slider : "+ Str(ptz::GetLeftSlider()),$00AA00)
petskii::text(10,400,"Right Slider : "+ Str(ptz::GetRightSlider()),$00AA00)
petskii::text(10,450,"Left Button 1 : "+ Str(ptz::Leftbutton_1()),$00AA00)
petskii::text(10,480,"Left Button 2 : "+ Str(ptz::Leftbutton_2()),$00AA00)
petskii::text(10,510,"Left Button 3 : "+ Str(ptz::Leftbutton_3()),$00AA00)
petskii::text(10,540,"Left Button 4 : "+ Str(ptz::Leftbutton_4()),$00AA00)
petskii::text(410,450,"Right Button 1 : "+ Str(ptz::Rightbutton_1()),$00AA00)
petskii::text(410,480,"Right Button 2 : "+ Str(ptz::Rightbutton_2()),$00AA00)
petskii::text(410,510,"Right Button 3 : "+ Str(ptz::Rightbutton_3()),$00AA00)
petskii::text(410,540,"Right Button 4 : "+ Str(ptz::Rightbutton_4()),$00AA00)
If ptz::PenInRange() : petskii::text(ptz::PenScreenX(),ptz::PenScreenY(),"W",$0000FF) : EndIf
FlipBuffers() : Delay(1)
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(3)
ptz::Close()
;-=======EXAMPLE END============================================================================