Monday, 24 August 2015

Reversing sceLibCamera

Well, first thanks to all people involved in WebKit exploit. Without their tools i could't dump module and reverse it.

1) We need dump the module. Load libSceCamera.sprx its id is 31. So load it first.

2) Dump it. its index is 20 when it is loaded.

3) Idapro to the rescue. We need offset for all functions that can be called from other modules. Only a brief view and you can see that Sony is using printf("%s ...\n",__FUNCTION__,..) in his code (Thanks of this help Sony) so many function names are you waiting for you with the offset ready :P and plenty of them are the same names that we know from vita and ps3.

you can use getFunctionAddressByName sycall 591 with the names that you see in idapro so you can confirm all function names and the offsets.

The list is:

sceCameraAudioOpen Offset = 0x6d00
sceCameraClose Offset = 0x5550
sceCameraCloseByHandle Offset = 0x55b0
sceCameraGetAttribute Offset = 0x5a10
sceCameraGetAutoExposureGain Offset = 0x5ba0
sceCameraGetAutoWhiteBalance Offset = 0x5d00
sceCameraGetConfig Offset = 0x5710
sceCameraGetContrast Offset = 0x5e60
sceCameraGetDefectivePixelCancellation Offset = 0x5fc0
sceCameraGetDeviceConfig Offset = 0x6dc0
sceCameraGetDeviceInfo Offset = 0x5af0
sceCameraGetExposureGain Offset = 0x6120
sceCameraGetFrameData Offset = 0x5950
sceCameraGetGamma Offset = 0x62c0
sceCameraGetHue Offset = 0x6460
sceCameraGetLensCorrection Offset = 0x65c0
sceCameraGetSaturation Offset = 0x6720
sceCameraGetSharpness Offset = 0x6880
sceCameraGetWhiteBalance Offset = 0x69e0
sceCameraIsAttached Offset = 0x6bd0
sceCameraIsValidFrameData Offset = 0x59b0
sceCameraOpen Offset = 0x5430
sceCameraOpenByModuleId Offset = 0x54c0
sceCameraSetAttribute Offset = 0x5a80
sceCameraSetAutoExposureGain Offset = 0x5c50
sceCameraSetAutoWhiteBalance Offset = 0x5db0
sceCameraSetCalibData Offset = 0x6c70
sceCameraSetConfig Offset = 0x5610
sceCameraSetConfigInternal Offset = 0x5690
sceCameraSetContrast Offset = 0x5f10
sceCameraSetDefectivePixelCancellation Offset = 0x6070
sceCameraSetExposureGain Offset = 0x6200
sceCameraSetGamma Offset = 0x63a0
sceCameraSetHue Offset = 0x6510
sceCameraSetLensCorrection Offset = 0x6670
sceCameraSetSaturation Offset = 0x67d0
sceCameraSetSharpness Offset = 0x6930
sceCameraSetWhiteBalance Offset = 0x6ac0
sceCameraStart Offset = 0x5790
sceCameraStartByHandle Offset = 0x5810
sceCameraStop Offset = 0x5890
sceCameraStopByHandle Offset = 0x58f0

there are more but are internals and you can't use it outside the module.

4) Now fun job. Dissasemble each function that you can use from WebKit. You will see that Sony is using the same error Codes than in vita so this will help you to follow better the code. For example function sceCameraStop is at offset 0x5890 you can see its code in the next capture:



Remember:
"The first is placed in rdi, the second in rsi, the third in rdx, and then rcx, r8 and r9. Only the 7th argument and onwards are passed on the stack
For calls that may call functions that use varargs or stdargs (prototype-less
calls or calls to functions containing ellipsis (. . . ) in the declaration)
%al is used as hidden argument to specify the number of vector registers used."

so here we go:

edi contains parameter passed to the function. It is comparing with itself so basically if it is less or equal to 0 go to loc_58c7.

You will see that in loc_58c7 it is using something like:

printf("%s invalid handle:%d\n",__FUNCTION,arg1);

then you will see our old friend 802E0000h aka SCE_CAMERA_ERROR_PARAM well known in psp2sdk. So if you pass an arg1 less or equal than 0 to this function  you will get that.

So now what happen if you pass a valid handle greater than 0. When you open it will give you handle 1. If you are not open previously the camera what happen? Test and error and you will see.

if handle >0 it will call loc_58e3 with 2 parameter first is our handle and second you can see in the code. Result is saved on rsx and if it is not 0 (our old friend SCE_OK) it will return code error. For example try to call close before open and it will return  0x802e0004 aka SCE_CAMERA_ERROR_NOT_OPEN

Easy don't you?

int sceCameraClose(int handle) 0 on success error codes on fail

5) Follow reversing functions. Advice some function are using structures in their parameter so it check if these structures are not NULL and depend of the function check the first 32 bits in these structures it is harcoded on the code so it you can call with a valid chain.data from WebKit and set the correct values on that first 32 bits you can call all the functions described with success.

6) What do you wait to help to open sdk?

sample output from ps4:

https://gist.github.com/psxdev/0aec149948e0dbb3c382

The best is yet to come ;) (greets to Kojima san)





Sunday, 15 February 2015

Reversing PlayStation 4 Camera

I have been working with PlayStation 4 Camera since 2013. So i want to share with you all things learned since then.

First of all, if device has not a public/free driver , you need to make reverse engineering  and you need to look for information about its chipset and make a research about it. So you need to open the device and look for information about its different chips. After making some research we can show the next high level design diagram:


PlayStation 4 Camera is using a propietary connector called AUX, however it is a USB 3 cable so our first goal was to cut off the AUX connector and connect it to  an USB3 male connector, after this we can connect directly to Mac/PC with USB3 female ports.  Next step was to get an USB sniffer capture from PlayStation 4 with a beagle device in the middle, without this we could not have learnt about how to initialize the device and their different options.

Chips description:

  • OV580. It is an asic from Omnivision a typical custom USB bridge solution to manage all other chip. No information or datasheet about it without signing a NDA with Omnivision. Other companies using it are Mantis Vision and LeapMotion. I have worked with others Omnivision USB bridge solutions included in PlayStation EyeToy(OV519) and PlayStation Eye(OV534) so basically it is the same work i made with other drivers for Omnivision.

  • OV9713.  Two cmos sensors well documented with full datasheet available in google.

  • AK5703. An analogical to digital converter connected with an microphone array (4). Datasheet is available.  The datasheet was very helpfull to get audio properly from PlayStation 4 Camera.

  • 4g51A. An eeprom chip. It contains the initial configuration for PlayStation 4 Camera.

When you connect device to a Mac/PC  with  USB3 it  is in boot mode waiting for loading firmware. Analizing sniffer capture we got the firmware and steps needed  to load it  to device. So after loading firmware you have and special UVC Camera device and you can learn about their different streaming modes.

Interface 1 alt setting 0 describe all video modes with these possible options:

  •     mode 0 fps 60(default), 30, 15, 8 video left and video right frames 1280x800

  •     mode 1 fps 120(default), 60, 30, 15, 8 video left and video right frames 640x400

  •     mode 2 fps 240(default), 120, 60, 30 video left and video right frames 320x192

OV580 is delivering in each mode:

  •     mode 0 3448x2x808 bytes frame each row with:
        header 32 bytes
        audio 64 bytes
        video left 1280x2 bytes
        video right 1280x2 bytes
        video interleave 840x2 bytes

  •     mode 1 1748x2x408 bytes frame each row with:
        header 32 bytes
        audio 64 bytes
        video left 640x2 bytes
        video right 640x2 bytes
        video interleave 420x2 bytes
  •     mode 2 898x2x200 bytes frame each row with
        header 32 bytes
        audio 64 bytes
        video left 320x2 bytes
        video right 320x2 bytes
        video interleave 210x2 bytes

Part of Header is showed in the next screenshot:


Part of Audio is showed in the next screenshot:


Audio has 4 channel i use Audicity tool loading a 10 second capture a reproducing 4 audio channels with success.  AK5703 datasheet was very helpfull. An screenshot from audicity tool:

Videl Left and Right can be converted to RGB with CV_YUV2RGB_YUY2 conversion:

cv::Mat yuv(size_y,size_x,CV_8UC2 ,in);
cv::Mat rgb(size_y,size_x,CV_8UC3, out);
 cv::cvtColor(yuv, rgb, CV_YUV2RGB_YUY2);

Video interleave it is also the same video format but it is making a mix of two sensor

A sample application made using basic PS4EYECam driver showing a 640x400 mode for two PlayStation Cameras at the same time:






Low level usb stuff is implemented and available in my repository. EyeLab  is a  poc of multi camera   application using PS4EYECam driver and it is not in the repository,  you don't need to make changes  in the driver to support multi cameras you need to do it at application level.

So after this i can say that PlayStation 4 Camera is full documented and it can be supported on other platforms. All information needed is here and in my repository.

PlayStation 4 receives frames with format explained here. I suppose that secondary processor makes all the job to parse frames(video and audio) and connect with image/audio libraries from sdk(if someone want to share it with me you can contact with me :P).  PlayStation 4 only has 1 AUX port so a multicam solution would be hard to implement like i am doing now in Osx.




Sunday, 21 September 2014

PS4EYECam released

I had released the first public version of PS4EYECam driver.

You can get full information in my PS4EYECam repository

It is the first public driver for PlayStation 4 Camera licensed under gpl.

I have free afternoons availables if someone is interested to offer me a partial job :P

Enjoy and remember the best is yet to come....




Thursday, 28 February 2013

ps3dev builder with Osx Mountain Lion

i have just released a tool to let you build under Osx Mountain Lion:
- Sony binutils and toolchain gcc 4.1.1 for SDK 3.60. Don't ask about how to get SDK 3.60
- ps3dev binutils,toolchain , psl1ght and ps3libraries

More details at:

https://github.com/bigboss-ps3dev/ps3dev-mountain-lion

Enjoy more to come...

Sunday, 27 January 2013

gemlight new libgem sample

New sample available using libgem. It shows how to use PlayStation Move without PlayStation Eye. It is not a graphic sample, you will need your pc/mac listening to show debug messages.

You can get it here

Working now in something for osx's users more to come...



Sunday, 2 October 2011

Eskiss and video output added to gemsample

This weekend KaKaRoToKS released Eskiss with Move support, some parts of gemsaple was added to efl ecore_psl1ght, very cool indeed. Check an enjoy downloading here

Video output is commited now to gemsample in my repo and will be on psl1ght repo soon!!


time to test efl stuff and finish kinect stuff...



Saturday, 24 September 2011

Let's "Move" the Scene

At last good values from sensors :)

I have updated libgem, added libspurs and 2 samples to psl1ght

My repository
https://github.com/bigboss-ps3dev/PSL1GHT

Output from gemsample

Waiting for connection...
Receiving data... (0x00012200/0x00051b90)
Launching...
Loading modules
laod camera module return 0
load gem module return 0
sysSpuInitialize return 0
sysThreadGetId return 0 ppu_thread_id 14500e1
sysThreadGetPriority return 0 ppu_prio 1001
Initializing spurs
Initializing spurs attribute
Setting name prefix
Initializing with attribute
SPURS 5 spu threads availables
SPU Number:0 SPU Thread ID:400100
SPU Number:1 SPU Thread ID:1400100
SPU Number:2 SPU Thread ID:2400100
SPU Number:3 SPU Thread ID:3400100
SPU Number:4 SPU Thread ID:4400100

checking SpursInfo
SpursInfo:
nSpus=5
spuGroupPriority=250
ppuThreadPriority=1000
exitIfNoWork=1
namePrefix=gemsample
SPU Number:0 SPU Thread ID:400100
SPU Number:1 SPU Thread ID:1400100
SPU Number:2 SPU Thread ID:2400100
SPU Number:3 SPU Thread ID:3400100
SPU Number:4 SPU Thread ID:4400100
SPURS initialized correctly!!!
return from GemGetMemorySize 120000 size in bytes needed for move device to init libgem
preparing GemAttribute structure with sprus and memory stuff is very important align correctly spurs structure
calling GemInit with GemAttribute structure version=2 max_connect=1 spurs=40000480 memory_ptr=42100010
return from GemInit 0
GemPrepareCamera return 0 exposure set to 128 and quality to 0.5
GemReset return 0
sysMemContainerCreate() for camera container returned 0
cameraInit() returned 0
Buffer at 00000000
Buffer at 00000000
Buffer at 00000000
Found me an eye, arrr!
cameraOpenEx returned 00000000
Video dimensions: 640x480
Buffer at 30012800
pbuf0 Buffer at 00000000
pbuf0 Buffer at 00000000
camInf.info_ver 101
Setting CameraReadEx 30012800 buffer to cameraInfoex buffer
GemPrepareCamera return 0 exposure set to 128 and quality to 0.5 before cameraStart
lets go!! It's time to look your face in Sony Bravia :P
cameraStart return 0
Move pressed
Cross pressed
X,Y,Z position (mm) 189.509033 -434.033752 1296.131104
accelerometer device coordinates [6.500000,7.700000,103.000000,1.000000]
Cross pressed
X,Y,Z position (mm) 205.927002 -436.941956 1308.244629
accelerometer device coordinates [6.500000,7.700000,103.000000,1.000000]
Cross pressed
X,Y,Z position (mm) 480.563812 -408.114563 1329.933350
accelerometer device coordinates [6.500000,7.700000,103.000000,1.000000]
Cross pressed
X,Y,Z position (mm) 451.881927 -410.955933 1318.307007
accelerometer device coordinates [6.500000,7.700000,103.000000,1.000000]
T pressed value 3
Frame 37710 center of the sphere in world coordinates 225.594498 -426.935089 1311.220947 1.000000
T pressed value 65
Frame 37784 center of the sphere in world coordinates 234.835403 -410.534790 1307.632690 1.000000
T pressed value 56
Frame 37830 center of the sphere in world coordinates 257.285767 -395.657898 1304.284424 1.000000
T pressed value 40
Frame 37870 center of the sphere in world coordinates 184.035355 -413.298737 1293.195068 1.000000
T pressed value 28
Frame 37913 center of the sphere in world coordinates -25.703981 -418.746521 1424.280518 1.000000
T pressed value 34
Frame 37954 center of the sphere in world coordinates -150.024338 -483.764923 1466.980103 1.000000
T pressed value 3
Frame 37996 center of the sphere in world coordinates -139.128952 -504.165009 1442.249023 1.000000
T pressed value 56
Frame 38022 center of the sphere in world coordinates -135.642822 -500.102112 1434.872437 1.000000
T pressed value 6
Frame 38046 center of the sphere in world coordinates -132.609375 -498.069946 1420.702271 1.000000
T pressed value 82
Frame 38091 center of the sphere in world coordinates -118.836090 -498.801636 1414.320679 1.000000
T pressed value 53
Frame 38262 center of the sphere in world coordinates 219.987030 -379.421387 1404.661133 1.000000
T pressed value 10
Frame 38472 center of the sphere in world coordinates 323.159851 -448.891632 1547.447510 1.000000
T pressed value 26
Frame 38831 center of the sphere in world coordinates 522.609131 -434.194733 1562.819214 1.000000
T pressed value 8
Frame 38886 center of the sphere in world coordinates 510.464722 -425.098969 1531.408203 1.000000
Triangle pressed
u [467.616608]
v [243.786667]
r [7.523668]
projectionx [0.274799]
projectiony [-0.007953]
distance [1611.913208]
visible=1 r_valid=1
tiemestamp=1831793693
Triangle pressed
u [374.323914]
v [255.018234]
r [7.731226]
projectionx [0.101714]
projectiony [-0.028791]
distance [1568.638672]
visible=1 r_valid=1
tiemestamp=1834009472
Triangle pressed
u [417.485352]
v [243.696060]
r [7.827722]
projectionx [0.181791]
projectiony [-0.007785]
distance [1549.301392]
visible=1 r_valid=1
tiemestamp=1835225555
Triangle pressed
u [458.676208]
v [247.511475]
r [7.927076]
projectionx [0.258212]
projectiony [-0.014864]
distance [1529.883179]
visible=1 r_valid=1
tiemestamp=1836075268
Triangle pressed
u [475.832306]
v [252.331787]
r [7.865773]
projectionx [0.290041]
projectiony [-0.023807]
distance [1541.806519]
visible=1 r_valid=1
tiemestamp=1836741731
Triangle pressed
u [485.739349]
v [256.604187]
r [7.828753]
projectionx [0.308422]
projectiony [-0.031733]
distance [1549.097290]
visible=1 r_valid=1
tiemestamp=1837424876
Triangle pressed
u [494.324524]
v [259.002686]
r [7.882169]
projectionx [0.324350]
projectiony [-0.036183]
distance [1538.599487]
visible=1 r_valid=1
tiemestamp=1838124604
Triangle pressed
u [505.946564]
v [267.037445]
r [7.904655]
projectionx [0.345912]
projectiony [-0.051090]
distance [1534.222534]
visible=1 r_valid=1
tiemestamp=1838824246
Triangle pressed
u [515.426575]
v [277.453888]
r [7.867825]
projectionx [0.363500]
projectiony [-0.070415]
distance [1541.404663]
visible=1 r_valid=1
tiemestamp=1839690729
Triangle pressed
u [521.867493]
v [291.747559]
r [7.855508]
projectionx [0.375450]
projectiony [-0.096934]
distance [1543.821289]
visible=1 r_valid=1
tiemestamp=1840573715
Triangle pressed
u [523.607788]
v [300.297150]
r [7.867825]
projectionx [0.378679]
projectiony [-0.112796]
distance [1541.404663]
visible=1 r_valid=1
tiemestamp=1841906582
Triangle pressed
u [515.597290]
v [275.254120]
r [7.760409]
projectionx [0.363817]
projectiony [-0.066334]
distance [1562.739868]
visible=1 r_valid=1
tiemestamp=1842589508
Triangle pressed
u [502.364777]
v [261.510590]
r [7.853453]
projectionx [0.339267]
projectiony [-0.040836]
distance [1544.225220]
visible=1 r_valid=1
tiemestamp=1842989369
Triangle pressed
u [460.853729]
v [242.027481]
r [7.995967]
projectionx [0.262252]
projectiony [-0.004689]
distance [1516.702148]
visible=1 r_valid=1
tiemestamp=1843489242
Triangle pressed
u [432.043274]
v [235.523392]
r [8.025161]
projectionx [0.208800]
projectiony [0.007378]
distance [1511.184692]
visible=1 r_valid=1
tiemestamp=1843839141
Triangle pressed
u [406.969330]
v [215.424347]
r [8.167543]
projectionx [0.162281]
projectiony [0.044667]
distance [1484.840576]
visible=1 r_valid=1
tiemestamp=1844322311
Triangle pressed
u [380.524200]
v [214.097504]
r [8.175434]
projectionx [0.113217]
projectiony [0.047129]
distance [1483.407471]
visible=1 r_valid=1
tiemestamp=1844855363
Triangle pressed
u [407.755707]
v [227.469681]
r [8.104139]
projectionx [0.163740]
projectiony [0.022320]
distance [1496.457520]
visible=1 r_valid=1
tiemestamp=1845171952
Triangle pressed
u [441.074799]
v [243.503540]
r [8.030184]
projectionx [0.225556]
projectiony [-0.007428]
distance [1510.239502]
visible=1 r_valid=1
tiemestamp=1845455027
Triangle pressed
u [471.704102]
v [261.234985]
r [7.781185]
projectionx [0.282382]
projectiony [-0.040325]
distance [1558.567261]
visible=1 r_valid=1
tiemestamp=1845804868
Triangle pressed
u [493.436279]
v [285.374908]
r [7.687237]
projectionx [0.322702]
projectiony [-0.085111]
distance [1577.614990]
visible=1 r_valid=1
tiemestamp=1846371549
Triangle pressed
u [481.684326]
v [268.126495]
r [7.666198]
projectionx [0.300899]
projectiony [-0.053110]
distance [1581.944580]
visible=1 r_valid=1
tiemestamp=1847037968
Triangle pressed
u [451.177032]
v [236.552795]
r [7.835966]
projectionx [0.244299]
projectiony [0.005468]
distance [1547.671387]
visible=1 r_valid=1
tiemestamp=1847870924
Triangle pressed
u [439.619263]
v [226.912308]
r [7.913836]
projectionx [0.222856]
projectiony [0.023354]
distance [1532.442749]
visible=1 r_valid=1
tiemestamp=1848687293
Triangle pressed
u [431.101837]
v [226.425247]
r [7.954504]
projectionx [0.207053]
projectiony [0.024257]
distance [1524.608154]
visible=1 r_valid=1
tiemestamp=1849287046
Triangle pressed
u [415.781769]
v [230.620239]
r [8.017118]
projectionx [0.178630]
projectiony [0.016475]
distance [1512.700684]
visible=1 r_valid=1
tiemestamp=1849953468
Triangle pressed
u [396.752502]
v [239.167206]
r [8.079232]
projectionx [0.143326]
projectiony [0.000617]
distance [1501.070923]
visible=1 r_valid=1
tiemestamp=1850886468
Triangle pressed
u [439.451355]
v [247.016159]
r [8.085217]
projectionx [0.222544]
projectiony [-0.013945]
distance [1499.959961]
visible=1 r_valid=1
tiemestamp=1851619412
Triangle pressed
u [449.005798]
v [250.121674]
r [8.072244]
projectionx [0.240270]
projectiony [-0.019706]
distance [1502.370483]
visible=1 r_valid=1
tiemestamp=1852535657
Triangle pressed
u [426.747223]
v [241.951523]
r [8.129959]
projectionx [0.198974]
projectiony [-0.004548]
distance [1491.704956]
visible=1 r_valid=1
tiemestamp=1853435393
Triangle pressed
u [417.064728]
v [235.196320]
r [8.006046]
projectionx [0.181011]
projectiony [0.007985]
distance [1514.792725]
visible=1 r_valid=1
tiemestamp=1854118583
Triangle pressed
u [431.997528]
v [245.086334]
r [8.540620]
projectionx [0.208715]
projectiony [-0.010364]
distance [1419.979004]
visible=1 r_valid=1
tiemestamp=1854701741
Triangle pressed
u [441.774719]
v [259.114746]
r [8.790345]
projectionx [0.226855]
projectiony [-0.036391]
distance [1379.638672]
visible=1 r_valid=1
tiemestamp=1855251396
Triangle pressed
u [446.370483]
v [267.522522]
r [9.159265]
projectionx [0.235381]
projectiony [-0.051990]
distance [1324.069214]
visible=1 r_valid=1
tiemestamp=1855701256
Triangle pressed
u [445.791107]
v [279.648895]
r [9.489860]
projectionx [0.234306]
projectiony [-0.074488]
distance [1277.943115]
visible=1 r_valid=1
tiemestamp=1856167655
Triangle pressed
u [442.675964]
v [279.683411]
r [9.940524]
projectionx [0.228527]
projectiony [-0.074552]
distance [1220.006104]
visible=1 r_valid=1
tiemestamp=1856684264
Triangle pressed
u [427.323761]
v [287.231140]
r [10.420423]
projectionx [0.200044]
projectiony [-0.088555]
distance [1163.820435]
visible=1 r_valid=1
tiemestamp=1857200662
Triangle pressed
u [413.394775]
v [295.300568]
r [10.901438]
projectionx [0.174202]
projectiony [-0.103526]
distance [1112.468018]
visible=1 r_valid=1
tiemestamp=1857817071
Triangle pressed
u [422.021118]
v [291.990326]
r [10.733618]
projectionx [0.190206]
projectiony [-0.097385]
distance [1129.861328]
visible=1 r_valid=1
tiemestamp=1858116898
Triangle pressed
u [434.123077]
v [283.060028]
r [10.246875]
projectionx [0.212659]
projectiony [-0.080816]
distance [1183.531616]
visible=1 r_valid=1
tiemestamp=1858400227
Triangle pressed
u [443.127686]
v [282.977173]
r [9.432184]
projectionx [0.229365]
projectiony [-0.080663]
distance [1285.757446]
visible=1 r_valid=1
tiemestamp=1858683554
Triangle pressed
u [447.493805]
v [285.821014]
r [8.890385]
projectionx [0.237465]
projectiony [-0.085939]
distance [1364.114258]
visible=1 r_valid=1
tiemestamp=1858916672
Triangle pressed
u [447.327820]
v [279.390198]
r [7.987894]
projectionx [0.237157]
projectiony [-0.074008]
distance [1518.235107]
visible=1 r_valid=1
tiemestamp=1859366488
Triangle pressed
u [446.239929]
v [278.633667]
r [7.527963]
projectionx [0.235139]
projectiony [-0.072604]
distance [1610.993652]
visible=1 r_valid=1
tiemestamp=1859683058
Triangle pressed
u [447.631439]
v [277.551575]
r [7.298936]
projectionx [0.237721]
projectiony [-0.070597]
distance [1661.543579]
visible=1 r_valid=1
tiemestamp=1859949639
Triangle pressed
u [447.413574]
v [274.575653]
r [6.932533]
projectionx [0.237316]
projectiony [-0.065075]
distance [1749.360596]
visible=1 r_valid=1
tiemestamp=1860232971
Triangle pressed
u [447.619263]
v [271.980255]
r [6.581963]
projectionx [0.237698]
projectiony [-0.060260]
distance [1842.535645]
visible=1 r_valid=1
tiemestamp=1860566060
Triangle pressed
u [446.398590]
v [269.859192]
r [6.447278]
projectionx [0.235433]
projectiony [-0.056325]
distance [1881.026611]
visible=1 r_valid=1
tiemestamp=1860782653
Triangle pressed
u [448.356293]
v [269.602325]
r [6.319905]
projectionx [0.239065]
projectiony [-0.055848]
distance [1918.937134]
visible=1 r_valid=1
tiemestamp=1861082429
Triangle pressed
u [447.650391]
v [266.737183]
r [6.123670]
projectionx [0.237756]
projectiony [-0.050533]
distance [1980.430176]
visible=1 r_valid=1
tiemestamp=1861415768
Unloading modules
unload gem module return 0
unload camera module return 0

more to come....