From d80e85f2342169caaf8bc873eaf0374089a7af62 Mon Sep 17 00:00:00 2001 From: Steve Le Roy Harris Date: Sat, 8 Oct 2016 14:24:14 +0100 Subject: [PATCH 1/2] Add support for more interfaces --- Analog.cs | 45 +++++++ Button.cs | 48 +++++++ Controller.cs | 99 ++++++++++++++ Direction.cs | 44 +++++++ EyeTracker.cs | 93 +++++++++++++ FreePIE.Core.Contracts.dll | Bin 6656 -> 0 bytes Location2D.cs | 38 ++++++ Locomotion.cs | 48 +++++++ OSVR.ClientKit.dll | Bin 44032 -> 0 bytes OSVR.cs | 201 ----------------------------- OSVRFreePIE.cs | 133 +++++++++++++++++++ OSVRFreePIE.csproj | 12 +- OSVRFreePIE.csproj.user | 4 + README.md | 87 ++++++++++++- Tracker.cs | 126 ++++++++++++++++++ {example => examples}/freetrack.py | 18 +-- examples/hydra.py | 63 +++++++++ {example => examples}/vireio.py | 21 ++- osvr-ver.txt | 1 - 19 files changed, 851 insertions(+), 230 deletions(-) create mode 100644 Analog.cs create mode 100644 Button.cs create mode 100644 Controller.cs create mode 100644 Direction.cs create mode 100644 EyeTracker.cs delete mode 100644 FreePIE.Core.Contracts.dll create mode 100644 Location2D.cs create mode 100644 Locomotion.cs delete mode 100644 OSVR.ClientKit.dll delete mode 100644 OSVR.cs create mode 100644 OSVRFreePIE.cs create mode 100644 Tracker.cs rename {example => examples}/freetrack.py (82%) create mode 100644 examples/hydra.py rename {example => examples}/vireio.py (84%) delete mode 100644 osvr-ver.txt diff --git a/Analog.cs b/Analog.cs new file mode 100644 index 0000000..1d372a8 --- /dev/null +++ b/Analog.cs @@ -0,0 +1,45 @@ +using System; +using OSVR.ClientKit; + + +namespace OSVRFreePIE +{ + public class Analog + { + private AnalogInterface analogInterface; + private double analogValue; + + public Analog(ClientContext context, String path) + { + analogValue = 0.0f; + analogInterface = context.GetAnalogInterface(path); + analogInterface.StateChanged += AnalogInterface_StateChanged; + } + + private void AnalogInterface_StateChanged(object sender, TimeValue timestamp, Int32 sensor, Double report) + { + analogValue = report; + } + + public double value + { + get + { + return analogValue; + } + } + + static public implicit operator float(Analog a) + { + return (float)a.analogValue; + } + + + + static public implicit operator double(Analog a) + { + return a.analogValue; + } + + } +} diff --git a/Button.cs b/Button.cs new file mode 100644 index 0000000..feada75 --- /dev/null +++ b/Button.cs @@ -0,0 +1,48 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class Button + { + private ButtonInterface buttonInterface; + private bool buttonValue; + + public Button(ClientContext context, String path) + { + buttonValue = false; + buttonInterface = context.GetButtonInterface(path); + buttonInterface.StateChanged += ButtonInterface_StateChanged; + } + + public bool value + { + get + { + return buttonValue; + } + } + + private void ButtonInterface_StateChanged(object sender, TimeValue timestamp, int sensor, byte report) + { + buttonValue = (report == ButtonInterface.Pressed); + } + + + static public implicit operator bool(Button b) + { + return b.buttonValue; + } + + public bool __bool__() + { + return buttonValue; + } + + public bool __nonzero__() + { + return buttonValue; + } + + } +} diff --git a/Controller.cs b/Controller.cs new file mode 100644 index 0000000..dc8eb7b --- /dev/null +++ b/Controller.cs @@ -0,0 +1,99 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class Controller + { + private Tracker tracker; + public Button one; + public Button two; + public Button three; + public Button four; + public Button bumper; + public Button joystick; + public Button middle; + public Analog joystickX; + public Analog joystickY; + public Analog trigger; + + public Controller(ClientContext context, String side) + { + tracker = new Tracker(context, "/me/hands/" + side); + one = new Button(context, "/controller/" + side + "/1"); + two = new Button(context, "/controller/" + side + "/2"); + three = new Button(context, "/controller/" + side + "/3"); + four = new Button(context, "/controller/" + side + "/4"); + bumper = new Button(context, "/controller/" + side + "/bumper"); + joystick = new Button(context, "/controller/" + side + "/joystick/button"); + middle = new Button(context, "/controller/" + side + "/middle"); + joystickX = new Analog(context, "/controller/" + side + "/joystick/x"); + joystickY = new Analog(context, "/controller/" + side + "/joystick/y"); + trigger = new Analog(context, "/controller/" + side + "/trigger"); + } + + public Vec3 position + { + get + { + return tracker.position; + } + } + + public Quaternion orientation + { + get + { + return tracker.orientation; + } + } + + public double x + { + get + { + return tracker.x; + } + } + + public double y + { + get + { + return tracker.y; + } + } + + public double z + { + get + { + return tracker.z; + } + } + + public double roll + { + get + { + return tracker.roll; + } + } + + public double pitch + { + get + { + return tracker.pitch; + } + } + + public double yaw + { + get + { + return tracker.yaw; + } + } + } +} diff --git a/Direction.cs b/Direction.cs new file mode 100644 index 0000000..9616910 --- /dev/null +++ b/Direction.cs @@ -0,0 +1,44 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class Direction + { + private DirectionInterface directionInterface; + private Vec3 value; + + public Direction(ClientContext context, String path) + { + directionInterface = context.GetDirectionInterface(path); + directionInterface.StateChanged += DirectionInterface_StateChanged; + } + + private void DirectionInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec3 report) + { + value = report; + } + + public double x + { + get + { + return value.x; + } + } + public double y + { + get + { + return value.y; + } + } + public double z + { + get + { + return value.z; + } + } + } +} diff --git a/EyeTracker.cs b/EyeTracker.cs new file mode 100644 index 0000000..c29f920 --- /dev/null +++ b/EyeTracker.cs @@ -0,0 +1,93 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class EyeTracker + { + private EyeTracker2DInterface eyeTracker2DInterface; + private EyeTracker3DInterface eyeTracker3DInterface; + private EyeTrackerBlinkInterface eyeTrackerBlinkInterface; + + private Vec2 value2D; + private EyeTracker3DState value3D; + private bool valueBlink; + + public EyeTracker(ClientContext context, String path) + { + valueBlink = false; + eyeTracker2DInterface = context.GetEyeTracker2DInterface(path); + eyeTracker3DInterface = context.GetEyeTracker3DInterface(path); + eyeTrackerBlinkInterface = context.GetEyeTrackerBlinkInterface(path); + + eyeTracker2DInterface.StateChanged += EyeTracker2DInterface_StateChanged; + eyeTracker3DInterface.StateChanged += EyeTracker3DInterface_StateChanged; + eyeTrackerBlinkInterface.StateChanged += EyeTrackerBlinkInterface_StateChanged; + } + + private void EyeTracker2DInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec2 report) + { + value2D = report; + } + + private void EyeTracker3DInterface_StateChanged(object sender, TimeValue timestamp, int sensor, EyeTracker3DState report) + { + value3D = report; + } + + + private void EyeTrackerBlinkInterface_StateChanged(object sender, TimeValue timestamp, int sensor, bool report) + { + valueBlink = report; + } + + public bool blink + { + get + { + return valueBlink; + } + } + + public Vec2 direction2D + { + get + { + return value2D; + } + } + + + public Vec3 basePoint3D + { + get + { + return value3D.basePoint; + } + } + + public Vec3 direction3D + { + get + { + return value3D.direction; + } + } + + public bool basePoint3DValid + { + get + { + return value3D.basePointValid; + } + } + + public bool direction3DValid + { + get + { + return value3D.directionValid; + } + } + } +} diff --git a/FreePIE.Core.Contracts.dll b/FreePIE.Core.Contracts.dll deleted file mode 100644 index 455c3e98fe10cd67ad7b4f9a60f052d17ac87eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 diff --git a/Location2D.cs b/Location2D.cs new file mode 100644 index 0000000..a1cd5df --- /dev/null +++ b/Location2D.cs @@ -0,0 +1,38 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class Location2D + { + private Location2DInterface location2DInterface; + private Vec2 value; + + public Location2D(ClientContext context, String path) + { + location2DInterface = context.GetLocation2DInterface(path); + location2DInterface.StateChanged += Location2DInterface_StateChanged; + } + + private void Location2DInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec2 report) + { + value = report; + } + + public double x + { + get + { + return value.x; + } + } + + public double y + { + get + { + return value.y; + } + } + } +} diff --git a/Locomotion.cs b/Locomotion.cs new file mode 100644 index 0000000..9e70477 --- /dev/null +++ b/Locomotion.cs @@ -0,0 +1,48 @@ +using System; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + public class Locomotion + { + private NaviPositionInterface positionInterface; + private NaviVelocityInterface velocityInterface; + private Vec2 positionValue; + private Vec2 velocityValue; + + public Locomotion(ClientContext context, String path) + { + positionInterface = context.GetNaviPositionInterface(path); + velocityInterface = context.GetNaviVelocityInterface(path); + + positionInterface.StateChanged += PositionInterface_StateChanged; + velocityInterface.StateChanged += VelocityInterface_StateChanged; + } + + private void PositionInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec2 report) + { + positionValue = report; + } + + private void VelocityInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec2 report) + { + velocityValue = report; + } + + public Vec2 position + { + get + { + return positionValue; + } + } + + public Vec2 velocity + { + get + { + return velocityValue; + } + } + } +} diff --git a/OSVR.ClientKit.dll b/OSVR.ClientKit.dll deleted file mode 100644 index 623fc06f5f14eff04c0369735b85b67439c1f9d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 zcmeHw37k~bmG^nC_Uf&=dS@+Uv1ppMfyOPUKsN|TL)+afA__%U0VUm4ZB;dkE!vET z8gYw?F*ptyOf+#z)ToJLAnplfG;zL|(HJx)QR5`~#Y{|$=KG&>-+T3{dQluR-^_1P zQ0LzNIp^Mc?z!u`@73#;RacXPh@ANT^{+$^A>_|&p~I7Yh>OR5yO{3xJv;6pZSk|? zIyT1Bp`KK7Ln_i8>Wm~3$xLWnER^a^gyM-%^V0TEcQP8QFDmj+FtTo)N3>XT&|M$Y ztuRYFO!~M2t$^rOaJ-6}IEXNW?_qq20utAi-OO+^;ZH~-0-rw)T6;08^8ajTKxW|+ zLcXVQZX^0f9{FYS;}VpAga7 z`cyjA2_&{1MuaQ6A79&NHkzwG73)euk!>Y1eDE~^7MV>n*8)bQ74_#2+oqF?0-qy# zai`=U{39i04LX$|5iBUx9m!W=u-}~yBB))ihf9h4x??+_Uw3XVLr^be%eCB#RVU#?@ z@Al02c`fvZN;i7AbenZYcnlQuzOkTFi}YlOQPp;aT=Vcaj;vFL)Rm}EcQ{?iqm)Kf zay&=QbJUGc6|D;z6<&f0>*eB7W#5qgZ_^#+AGwc%etIG@3s2%4AJz4b+~sJVv^gz%n$C93un-Q zgi%eUsU7h6$Scs7HNU%3KOc2*_T2!o8;bypdzFJ@WQ2J6Nwt42Q`bE&iM`YdaN z!P=8$g->LYFt9Q7oHDQ_0tSYtVn_rG3~t4c2pH&!iXjm&FefO6M8LotpcoPX0|Q$z zBmxF{i(*Iw3=Cw&kO&y)6pA4c_7krG;wP_0JtHhXg`45f-RP&{qVW7Is@B7pGfi2I z9$u71$^j=@^BoorXYE{vG)%q6nVtpzoX2g(f-pLUz0Dj1D|wnP)s;e!xZAi>U9c>? z1Tl0uw5^NK1;~@tbMU+uMn7_=ChLYOPk`v=Iwrs{2E7{-U>Kv@?L`*ILzU&t=7F-1 zt2_0UnSmwY>$zktwdd!AB6_ep^=?+N ztier~SIKWH*Xe@d39NXNE1M(NMd@PKVEPTyCv?#l-Kn@cS67v9tG9#8{~W6x>#$up=0^`Ik+R&=LIyoP$v`B4SNh8}df!}A~sIz8c2CG>_DO6UutletTs zSbLPMc0Y-&CqbU7_E`p?Y_ zIy!=ScsA>M3v6}7(oG*2pBB76`abPdcy!JXmJtyDr9LQ4>3$qqy+YWP5t}b>f z?$nr~!F1v3T-_$tJ-XP^JyEYpt^-dG!>j(G)C-PhmxB0oI#u~H%Nz+9<*P}aQ4MM%lHHaB%uCL3R>o0)B z)psFi5_KDT4LWBSyF{k!`W)MZ+04(q)3B?H?W$nAuvoz^OmC)L%uses&9m!#v1>cq zh5kLXUCCkW5}C4V7TblH)X$^Du%}p$E=&h>Kl29){eWyq8i_F;cwqH4VlyATuA$Y$9@xS+y*!bG^5#E!v4qx3#(3QROw??XQ_5w?*hWzkrl z-gmMMVtivsF?Gil=zZ{q1q<~)tPU0|5_edzSntD(Z$VrRV%|2P+FPP+hw%euc<1g0 zW7EpBx{2Ti%-JS_A29Kn2!6l}Y$Et!Q5L}um{Uy|{D9ffMDRmP7O@{Ny_v$X@B@ab z1>pxwRu+UGFqv5perU5n_yH4~C50a_vzXBGgM;@jvOg*z-frH8jyB0%TMy(^K#c{Z zSAc$_^uA)(6QJ}4Tl?=Crr(Q9_4|_t>G$_=zaPi_9L)kSc&#r{nm1MhO!`XFk7`sHK>}q7Yrn6l$EV~|KyWVBH zuu{Tbjaj>xq3oKNXV*Dm*Cw_LbLJrD2tP!I<~hQ2waSK{WFrf({*+?8@kg&r{s6pJ zJbHLNa(S7@j}`zQq0h&crbN6AXC-4BJ|g@S=Q5@;{I49UcG?NOa*WIH2DW`8NIDJ@ zhL!#>jKmfrj28A6gwewOF*Cv*J^gDWPnA_-U3`OM;}A8F8$9%3>$$n5dftSOnvhe2tKMDgN>Q+ zU)KA$8hj1Jp>+);;1s05){5h`svS#cWGxk=NWx(S^TW@>9<$jyg=_u*~U5 zrjZBt1KuM{Kv)S|l^Ukz1~YLz_9-}#cm>#f4-$2AqFzp9l{Om+((jxEe^E8^xL`9hY= za_ajdE74%S`Eic!CDmpDwZ~TWp9LeT`p*V6>WP_+YS^zMt{9IIiu1qJ>>BF9p0#|*U z7wqG#^hz<4+iWEAL<{rz9Qw2}r?R%nuZMq&yvm%FWv(gprOr~J{#wJpKqLPxDTv!sF3s z|DdZWs=@1Uh0o_sq&r;B@OE|q`=NG~-p7ub>e2hS^=kD#cJjaz;#1K7%>kUf)Wm!% z&Xe$Dy^lj|pVWGm#cCbNVzmxuu{uZ3Vs+0Ti`D)_Aj9=DHjhL>u8ONWxY+*CPX5j0< z7(cg*kEY~!IjF9L4fjrgQKO;)|lJ z`?p@id2Qx-*NN{KeCOlK`60Q49wUxA8?|)PtL}euyXh^VLC=36-soY@VxeaXtqCw^ zlF<3(CziYED;1Ylxao%@?it~xts|LUF7)|P4~}xvUq-zJS~i+#gV3cyHwxV$^d_MX z3VlxKUq-(jq=m=5?|o`=g<^-JH!@_ z7{{8&2%RHzozM%$aasF7;cUap+^2S6P>-hL(2E$|0@-{Z*3fAOdP=(?V|jo&f&3_i zTQopvk$JH8b1wfNr~oS|gvg3?Em4ZHYR8DrgeC#b}#>c1ayB1uBK?^OEO{k}eFyR^KgXGF>aB9~4weH;e55098^g z#wF+Z7EldMp)X6GnuGJ4X`li@^Ki4CJy-$cqGfcO)f$HfD`i{t4PPSzg zeOF}TfPz2=q=(D^Dxx##agm)SnrG6Jg3c1Onhs&c3D71?F)oVGuOwZ+q}xcp6Tf^3 zr~>W$uAr|Q=nsM(GSHs{9Wu~|f?hI^h7Y`JAeW#I4dfG4;!-6P37TM_QbCOdst~l$ zKsACQ1{y7Bvw_B;xBy)arEbIa2 zcO|_JuFFlJsuue_&p6z)C{XKkQ%B$!=jr{c0<7Oww9U!++~#zZXf==b(;15yCE}@qR-7WMgp)lAZ&_npjcg9!GaojB;yKUU?emWTB^5a{q}} za?ZU%&lk?;LCyBMzUCaCn{KaJ1@GNc!~I0X@2lyx_>a__XT=ZJlv+9mYuM*X|EZeA zR{Z;t&kHsCvGS_;FC_kdZTTOpxzLuUl{RpYHPI7Rp(p>PW~Xm?zjp-FAgG%{BfbcF zw9u&|*pg#~&JyXI5qlwBG-4ZCN?CQVX5V0?&_S_w=?Jc`s_B^{xGrZ2wa3>8Co%-T zbHr`Pf76InT5AYf4BA7To>lO+`aJ2{?CF%9CF3WHF7$NS(A7Xr+7x2huIk4;pU1qp zLm}@oo*QuVbD5wW-XD4Ps)HbCKJI$SvkwpST_>_9H7>zR?;D!`fjqs`Fb;~e!|U;O zVZR#_^eZ2i?x%|k#HAO|Zb6T0Bfa))-_S?KfrJzBkm_WAc}$5`l5|1DaBgcZ(dP8SSxd115OZJ~pO%XA!88M5CNuGP=8(1fB*`h|4B z@X}pqqn-4$fxd+{+DXqF=*N&d7>L{b z5^_#t161$1l+F}%5k^3tekq+JXa}t-+M!=YeS&t;hN33za=O|;eMOh(m(xQAx~k}M zpuZSsf6+DiZkjNOOV~x?Ov4IX0-K1YZ83Vmgbc=o^-DIF&7Tuv=O-~!>!=n53 zYw0}$RTO_$-$SF0R(UoQKcRn-G6q^v{H(s0_8I8>;urLr={W=KFMdtmPq^3-TMiY! zqkoN78tDDv_w~DIr-4S6{8hh~?lsVDcq(=B7bhRKJ;iDXn(49uQoh6eU-=(Jw)Z(4&I7q(` zq;h$T-WQ~Dd7Q$0Y$dbJagN8SS1{#3 z!n$(6@e68@iG$aU=YcjF=xU(X=^qu67W*ZAMUZN-UrPQCS=C;1{K`O2YQew*jyEjS z7Iq80H$%26o9e=P;W1ztKzJ+E7Mms+g#2)MltaPg7m(gW`J;pH< zqk96Yo!Bhl!|1udIwv-&26{hmj?-hIs?ya?zlDx3J;zySp_Qe3v=R&LEIrp5(EeHK z&TX_0PY?dPpdIwZ(jEMGwUW_orTeH{tDMRu?xF`u_W~VbpaZ4nJ1ewB2KrIyMb2t1 zYM_^(IYQfRpkF~YQoF%G?;y|7+P#AI;K{MeoTIguEp)YWj8-jE{T>Pi_c}vbqk&qy zd!0vVO9iRkIzfvHQax*;cAX&ZSzmKb)b16eX0WjKkSrJ`GClZ2@HHnt<*mH?V(?w( z6zza4CVS{NL2}h=KebSyt3i9iKz|61aLv%PX`FHo{UJEXHB$>1=&!*>*YR4Nfm*zc zt`oIW1u3g%X{!Y(t54E)3u3FATqkL_8|kXcT3xfX#|_ltZFSAnelAGm(yYBFNaZq5 zn;?rG=d#8%Pn#`h4^1oUaxKtS8>q$Gvh08>i>?+lJ||s+ zk?y`S&SkA2HG8ksl1e7Cx0%bH(CcN7yCPN(`F+_TSEq%X<$JWKg{sPb?21{aqx@&C zjRv|lbZ+?}SC@q@0qVBU*MJh*W+{CS{jmIiE2;Hc=nbI2OtbF)?&{GREVP$WTB{&l znSbv}Yh8jKC$3*cyGf9$Uq-uA$)tW6ji2G=G5yQ(CaqVSrI7dC@;|$JwPryVk)wj# zz1m7cv$DeN-mG0}prb4H(Pr&_1Jzd)K=!_YK35TRZ_)UyoJ&{&&8^yg18orWoSSZSh0$GEp?x66iY7rj_9)7_^%rI7b<#SL`6_Adr{qoPSW zUwcu|4tlR*FJyIcYR_nvd%JeKplirg+2romo>4OI+{&fyo!VhR+z0p3PVG%Ws%PyK z%ghzQM7$#0=h|h+p41uxXSpx4(Ck3MePvF%Yb;qXaD(ew3pEDLcVni<$3ahOvjbPS z_vWO#*^&hVeXe~LY7Fdkf7wE_19!S_&q?=nOBM`_)b6rSW8mBFdo46O@B{Y)Iq4p< zWWm7m^lb|@27c=PXA8{^yygC0PP!*7SupT5=TjDH47~6DzJ+E7e4c;FN%td577QG# zy2VV2k z3gZ35ot5u+rdsHk$`3rad5;gvUaNF_XIMzDD)k;~q0v>NyeC-b_^PA5vn;ftYP$Cn z3-wl= zD=ZYL{*rfeX=m*FpZlPBp>$1?Ft6%jd zEmT(XjyGkYV`_fn?X}PXpsf~))a=pv^bf7s=0orKdf|!e?TftIYMj39dbyxow6n$! zG{Hha--UXkg+};x=*<>7%6F08VWC>z#d_32(|wod84I20yG-9{p}D@x_3JFO$ajUl z-$HG^tMvOVw90pl{-Ap#$L7a^67(=eVJuaF#Ymp(6N&P}76MU(YSO?&C~_-Ca*(At5V-<9aF|EprNqHKu< z4)b5K_&U7}jss_dIyrGpnAQ2nrsE#TI*-5`oCAACaf(LTIqZQTG@W^xiqH3jD0W6G1a9MhfxaWpd0zCoE1lTm2<;y{3Vr&4{S}=*Kkje>AxD2Fkx z4$a{l>{2zSnVi9;M{3Xibba*jkhF4$y~;k}v1X^dui({iwX~fYiK?Hh1;=UQ+f!*2 z6@ArzRL-i!)eNjg7XKblGxjaW6P8>qoIRkrk;9iPjz)@q8#oTS)8gxtq zz+RNk8ElmCF322Zf6q(+3Tb``S$P;6KqC;ce zz+-;zj(OLIrv%5o;mZ&|9g>mfu`+TeFhl%=NEA6d;K&f)YxQZI=XJ>WHAgw<=kc2& zej=?@8#i{FvmEyp@4=I@Y~f8bX>8hm6V;C0=C9FC7<-|AzoZ%^sYXevQKEmR@Fxg= zg77B@zXqI#X&g#CvET&lzLDFUa}Ynhpho-N*p&rmh$V5M=W0cv{m>Z`YSK=S`;GTY zo^_IEo#a_3c|IciM&UOKzft&)3xAgIX9<6n@SBCxESzTH976mi+@a;C)(#Qh6OBsR zLgMFV4iP`cc8K`SX_xq|koXCl7sUTBi2o0XCrd&1!EdL8PA=MpTI{2jC7%u{u|rDi zkP=@P{%YZ`7XE7C`{drkWm-C8oGh55pP_h-6-*|g*+uUYEOZdYA=QgOKP-N zL#JzRBcFZrHvKU)w&Xo>jhhBqI<5(PZm&Behi?dd7;UUxmq#K zKAG;L8BPzLz5Ooe{X!q2?;-w(#1GIDh(9jzr|D_L4@vwv`hl~UI<)6OyEM+HN9aCK zFBR&S`Mea+uLLdEul0rKBD&I7PkodM)YB%qsH7fGWd9#f#ZOZl{2BBIaN21+;!`9( zl6HghIVu3BN%*JH}xopt62ZPJ+^k@yaw z7YXMUi60dDm~ajYCC7N}TEFJt92^c#J5J(rghqt+3x6LpU-yr9vd(PhceLh$PUmk> z_kJg*-6!;b(8EH1A)4fpoL!tMB=Olon}oAg;{8G|63#w}9}xPOa1Kk{;pQBE;r_kj zq7sLP>3E?{LOX?CB=pNd9~1fup$@O;3vCkGDYV}!mJ2-~^srF!F+U`9w$QbT7P1Zf zh2yn53aE(Vp`!7cUbs)<2M|BAaCWii6pz;)C_GTc@xx`~wM9jT%Q;RJl1k`op=*Wq zSB%$gETT%0R*u(xQnXLv2N16)o?XTKwN>M_?&8A|r|R+A{l)vLxfN&()8EtGK3%)p z_n3aK?+N{zzIPFx<-Fe)$2W;@FTQ>F?!fmFe6PUwT6}NB_n+{+4c|ANcl#dk{hQC@ z-{oIZ5G~kPkSs_SY%931;NpTS3vMXbTkuZ>rA3pAnu`J@$Ck`3IkjX($=M~FN*ve; zIWZ1Lg5s5S9=@^srcf2%?>QC{oF74_h#VNJcsre}U`2Swz8I@mDN-!(9t8cN*NJ;D z`+R4Cenn`zpYN@%6neJMn9z1V>zpmruK#Go1UG(VQ+W`%-B{Uy_$`$ynbssRP93lz zAlC8;CtL0T_2QXCC-?;-sepYL-H-=hFIznUS{h9R4bX*~CGxj=uLsEhGLaIW1 zfzU;GI$XmWt!lve8T_l$oA?cePH*8C6*~Qv#(~b!#?#AV>q3#x8RPuOxe6K+QQl0< zC{478+GsPq33Fgx)%Kz376`x zNqD-BDuCavkCt$me!PS$^c51Gq4!F7roKnQv-AfgT%*4vVMPC^ZreEGqHc=kDJ~Q>@~t;>125X>R6hO zGdiN<4gQHnI1Awk^pWob3Kc;-t0fuj?TVdDOWT*X)i-s;V~NaZ@l1WRtBd9&B3;Q1 z3lo`GYJH?LHg9VtmPp5wiFBSaEwpsjP9rNmHQO#@Y}}Lu1F$gsj8fpL^AQsFWM(P{5A!USVcGM>m--O(t{#$4LN zO_!#{$xiq_nV8;e>p5AbRTpZB;Fqae(IT7C!#U~vt_Xgos@RQ)fGlW9 zWOKYVnT~UYR#7%X29-;y<@}D?cxKyBsRqbtX^O|DRCcgLgNX^Y#RgN(;j`9|H5ee1 zVWk=d&g5738pEnRmf9Rk&FRe~(S|9sJ>_W8;`q8$B(<$IlG!*XlZkb6_poJVnQ3Ha z7Tgr+>RN}vBXzNWt+p0V%@-C_^Nt0xeZpc{bB4vSk3@@UbaD%4m1Z;#!jwT}@wo?> zZJEOyP(RB7R(rI?WHPbU)!-m)%!sN=8$ear0NDx~46C{Zw%0?3oo(`%(L6wD`aqUc z)lf9Nv^>()8|&EC6EkO%mRKedjbtJwRwWtQMq0a*Y%J4728(MwgOE!xM{fc;E z#`Jn#DO9&hOOI6XRk2iZX{sfj=uIz8#1^I(CN@X9;!(<0v7wP@+> z%EUV(=}dF1E4Bf)(Y!=&H_vpcU9t^qPJR@LM%Rc#jQNpLvF_yNSS~L|A-FeqEc&UM+v!0Pz(d8OTwOl^Y0I#Y3(!%3}@y(yX6R3dCV zTH)^GCUhg-eq^zFzkpPCes5P-ZrXtyn3TVbXide^X?Ua!t%My)lpDwz8d>`du`wHM znns$5uo>cCXTuR9QPR>Y%*`&EovWI-&xVIvwL8=WP>0sfn%GzaiiRz^0Q zY&Q)+EEm0d4eE*o=xDrWB6Y}}@evCd6~GCF1|)7xW{BBLd} z-G+E!qNf)-%fX7V?d)>INX(lz-UH_F6_aP4Tt4(MeWvFpQ%WOOs(4Tsn9ve&L~SUd zLnO{>tk2az;qAS$CC?gw!g7_+e=(po$2b>WMl4gIX{63gU|D8J?ao}7h{m=Kubv$i z!`I5lJzqVqiuuN5)zNY6+wg2_H78@~{A4R|iGg|;8~x!cFyOKv6;GzHLp!om)NRZd z(qG$qJ3BGk&|sZ+ur8Y&54Mh~6jjyIJX@)#^erXJ?TVI$*#YegPHQ&M;QaMm#86!f zqEFJX>^TqFouHI$R%O#5omA%MPoO7e=eK`0U0%2O1f6A&Ite8LfM zur0?_n`WLBT_CG5EjGgT_=ZF*x{8+JBuT|u8mMI&wM?g$8Pw89EiFZj(wy4Zr#Yy&J9 zEU^I_U3Gm`-+==F9P#ijSPu4#v84(anAn!HS|D+W(QDsxwPS%vCcE2`>ZD^?8W}H$ zMeKW|ChXf&tkjWQfor`erqo1weG-3E1zUTbE!1(1I&X-h``b&}fc>x0)s2N3gQIC9 zjwE@%V_YA?Ze#ZYRU8~ruksWUXB!wG&oeZn@k5*3y{6L`c!onUjJni;W4iv-SR$5+ zcjD+Ioxzz{XRev3Sk3_qPYcE&3mM%@E=+K7BcZt&F=XnRCz;v?x8V%9GlsNs8E3gK zty*zuqH7z@tavjCm9%Yo#X+&;oE1_xTal}RA&Myo*IeD}y0)<~U~s^iv8ZX)X|Y&O zM`{~iO|j5q+p^}4+lI9V*Y!NMWoTK8Ql2n2sK7RI2bJfYAldWGJ592SveV_DnJPcy zlwwe+eM|5$3bxZGd-2&Ea!;P@I>uIE&;sm-FGDH}>The1X9ooriqXSUp`0GbcvlQ* zuN?tT?Z5&hTyfZ2jF;4`& z=~zngWfpGZn2SzZFOKlLWA(5XXLLQhFvfA6MN4}#nA}qFb-nOOBL6(V$VB!d>VkH& zamlYjis6c$39Xk~1Kkmvv>4afW`w%<{AHawUa@CL2`oyq9$zHGjRwM24<|nv9DP8| zxBzX7o!cA3^u;$DQt6G6t~u$fy~`5akpwpBQ8_*BF|R(esbvLD6B>caau+1Zw^!E3QCe3lLF;~E*Ta=PsTc=og}SW6-FmYhEXTPGx*T_zjz|ha%Q|Pw zy4P4<+hXgD<<(k}I^vnGSXR+msj^3u1BGf|V4PVFChqQuB(@C{sHN7{OU=@nl0Dm` z%M46|{Y^C19Z78(C~88x^`-_f-tb5^g;D+Hcw|E&nZ`La?qJ5&^={a}2jW>Z#e*Yp zTNq7iI?WhwP08*av{A|$aEc)f&&L8=C1&f>Mgy@LMC;;RI8VtIX5A>uvdj`>=YyFo zniVZc;)=JYD~4OM;LqFIiAjj(8SAtiY1hRQG1F*VLSf&?eL|**t|V^2MzLjrDJk5` z=E)3K#BFlmj@tz3WEU>Svc(}$YbHf}6M(OuaQQGNmEtK#_PTO;YnEhoLv)HXWsDG&Qq=X*v`rf!j`x5MG{AhD;B;R!_~$* z$~I&X>ooPIQs`LJg4-`k_?l);c23JWX-;Yb@<^ZpX75{O^plPx$Kc`mPPre0oBdcS zfzdGNx$~2~30t25R1i!8dhiE1rkyeEJop>N!_=0`ft=)jvfDqGP$0X z;JK;}Xf*=k1sNr6kagjU1qGBGcx_Do#hYjvUdtT9!&)f``|!Z%c08!X88W{Qa)s9! zcslT8(O@G@qnE<$R^*Yy%SCZI1w-P9Cycze8fj-3d2KUrqvS=MVKHnyQmHac8`ep+ zv7q4|X@vP}`JOy?Z6q})zrXCa= z!S<#JvIMHYN$c?p8vAky^`h8Zy@k-~0U!GbxNNc%o{%<(8|{*WWHTJmgq-7sgFab) zA-FAqR9&!+`#>BqEZp3h{oftlc=mLz@wsL*>K0@0;H|XFk(>YVISyBWFCS?Il=qj5 z54XVd)Tj1%ZXTbhk@l=x;a475N7^k0%VRhrKc*iK>&hLMt z%B=qzRc1Y=z@aC@pB!n+s2%c*WQDfsdi*N*uU{!djqzsy!T7Us(7SB z;Il4&80Yl=@sm5J8RMN7`HwSig;X5Zns5bQM5x(9?F>J;D?W?ThN<|GPlx|C)mFRt zk1MMUE{?*zyrUn?&D=xT;Y>5wn+@ZL{trHR5BO}1`{aG#vng-5%0HD``9<&{Kg7ys*r2;@TKKfDDO&Sa3AFsP>;VoKd>VI`Ig8n zWw0{xjnCUeelp{EyPytTxC8Rw=B96!LCnW8sUfxzpT0#tzQp{B-S_FbSrq+!j*KWi zANs6YWDat-=bvx%r|L@inexi_w>DfI$Jvi(sQ0nFq)7folpYO)u8Js7yzyFY$uPCqdj4TS2kOPBwwlixD0L z|7h@7C%b+PegeHtni9W;#n9qYXI>dO?2)oIBE}7Go?mZ9oY!PNv(z^6)RpDrTf}QC zTb>Y`_{@`SS&uJ=3D~B}OG3iupgcmj^pNDqV4^w8oox*|k(T19g_6)6A8Qqq;cvs{GRU7Dg*>PjDAV zp$1GXt*K^dgYRha%Ec=>jNI`ul{f|zdFo+(5`U-j^;<5yqpWkzUAGory+8U7UnTE@ z=dE5|(|GtYcSW#JD!y6!G^grVsU_P^~01L+H)Q5}E|z7z1ek=)y5#cgnF_HLPmHzQE7!%M|%ZHTSa z-S`uJoZ%bxoI)%Qvz$fm*+q3QQFprGCMK(aylk6ScY9%*7r2OVk?t-6E*fDrq)>vYp{HNa)9MSMd54}b>aOE%yTgl zZ=sNQY5(p(Y5&!^@H)JANoo25kr+FJ&hC>m9pa!@Ao8d-`|lczFZ&(TY80GS4FuHFpybfrdM`z?|w^%&>G9)}3KQ0^Fm_$+#RH3LQ?94pq9NJUBW>JStZ_Do+;0M=ZcTd6EDscFU}J;=87Bh#Ith6v+~5Px#HG5aYwGW zBRE>tjQ$sc{V!Kr(Zkv3>)GfV+34HZ=sVfyd)eswR&)ntqfRT@{}(H|!<&s3Ru`Ck z74r^{Omq6du*-#Ob78d5rtGqVqFlw*xv;^m%KaD}`9&ECFJhqqI9#p5myPgsBYeXM z-!{T`jPN}pd|!pAzNFvbG(xWt7Rt>3q70=Mc`A)ES;?e<$!vM848IwQoS4)wllhq4 z%w&P?_Va{YI#Y9K<(gNUBq-+c@PNf24PZ^sWmm-;DYx2f6?q((u*;0S7cWHH`Cnl` zbBy6XTh9Nyeq%#c?s2FMmYpubE1Z_4W1-B(SO^bfsYkr=5S4mDI)sO?)Js@G>Uq^r zG7(abv+;9ukcRM!unZpY!<8I%j2YQgPS!AoXs{Aa9}QaxGsx)TLXXZLtNh_URoZ`>s@N#}wX@Nq z93IW(_Bg!W(ndtFUEx)RY5&ziuk(6bUVKVtBT|G<>G9Ch@%18oX#-|nZB#4Xl4Yxe z{dxKSR6SM?nX&Dcjz{El!$A%08Z8;r;@n?K9#P)XkMz^<#%){9`MmlV!Tc+ zH=EpF@f}h7y9k?`CosgYfg$pGJdWaGY;KIL58ilLQQH4J<|~hcvQ;Xh0*@Z_nGCdk zof`}+B)YqXyF^V5hI@@GI1%j8nBKs{{>bNXBd8u-?8R1?H%w}(c+-mwtV|sXH5yUB zWL}5$aD1Kdl=w-T8|!Ck)KOe+iJH|9F8Ep6Ag2jgk`Q#qXjH>LHa6yCJYF0Mixy;f zXtDx-LEePN7{6mA!kgBDoamT#p4L0lb)kicPM*7EVmn2n6Rl_9L*Kh2G`(S3<5ZBD zp&b1Xe*F-VvOD={YW}GQ|KgNTOT2s-AJ~Sf=#?u{k)9>Vg!QDZ{Gv9kCQ+ihKB!y4 z+U%K8U^)-rdn-{}dvp7|w$DxJxHZ~*d+Q~4zjO1izs_koPh5>IkxH+gvv}dWC97N1 zFEysJA*oPm=iZ&5e8A3i>_jR2S&hFejuqReJ>N=7L&kN<-rZ+CGrv&I zGXUyrj2~ssw;3}T&6c;0nt3lr-uy(dI*I2z8<1)mzBB0ryuFdpbc8bzlRpk>)RC>_ zdnze}e6J&0OVcKPZ*lgJIq$d?<$MwM1vK0R#}67L2liSI{Kd6YkF67O$mfOV4)|(1 ztl@h`Q;pb6@P_tiNLqrQVlZvX-h<)N_@;(>^oQHIRoZZ=VF&jfuAk{IMyfT 0.499 * unit) - { // singularity at north pole - yaw = 2 * Math.Atan2(q.x, q.w); - pitch = Math.PI / 2; - roll = 0; - return new Euler(yaw, pitch, roll); - } - if (test < -0.499 * unit) - { // singularity at south pole - yaw = -2 * Math.Atan2(q.x, q.w); - pitch = -Math.PI / 2; - roll = 0; - return new Euler(yaw, pitch, roll); - } - yaw = Math.Atan2(2 * q.y * q.w - 2 * q.x * q.z, sqx - sqy - sqz + sqw); - pitch = Math.Asin(2 * test / unit); - roll = Math.Atan2(2 * q.x * q.w - 2 * q.y * q.z, -sqx + sqy - sqz + sqw); - - if (Double.IsNaN(yaw)) - yaw = 0d; - if (Double.IsNaN(pitch)) - pitch = 0d; - if (Double.IsNaN(roll)) - roll = 0d; - - return new Euler(yaw, pitch, roll); - - } - - - public Action Start() - { - - //OSVR clients need an identifier - context = new ClientContext("com.osvr.freepieClient"); - - //OSVR interface for the head - Interface head = context.getInterface("/me/head"); - - //Orientation Interface - orientationInterface = new OrientationInterface(head); - - //Position Interface - positionInterface = new PositionInterface(head); - - //add callbacks - orientationInterface.StateChanged += OrientationInterface_StateChanged; - positionInterface.StateChanged += PositionInterface_StateChanged; - - context.SetRoomRotationUsingHead(); //recenters the hmd position to the current position - return null; - } - - - private void PositionInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Vec3 report) - { - data[3] = report.x; - data[4] = report.y; - data[5] = report.z; - } - - - private void OrientationInterface_StateChanged(object sender, TimeValue timestamp, int sensor, Quaternion report) - { - Euler euler = quatToEuler(report); - data[0] = euler.yaw; - data[1] = euler.roll; // should be pitch, but for reasons I don't understand roll an pitch are mixed up - data[2] = euler.pitch; //should be roll - } - - //need this for IPlugin interface - public void Stop() - { - - } - - //This method will be executed each iteration of the script - public void DoBeforeNextExecute() - { - //update OSVR context - context.update(); - } - - //need this for IPlugin interface - public bool SetProperties(Dictionary properties) - { - return false; - } - - //need this for IPlugin interface - public bool GetProperty(int index, IPluginProperty property) - { - return false; - } - - - - [Global(Name = "OSVR")] - public class OSVRGlobal - { - private readonly OSVRFreePIE osvr; - - public OSVRGlobal(OSVRFreePIE osvr) - { - this.osvr = osvr; - } - - public double yaw - { - get { return osvr.data[0]; } - } - - public double pitch - { - get { return osvr.data[1]; } - } - - public double roll - { - get { return osvr.data[2]; } - } - - public double x - { - get { return osvr.data[3]; } - } - public double y - { - get { return osvr.data[4]; } - } - public double z - { - get { return osvr.data[5]; } - } - - } -} \ No newline at end of file diff --git a/OSVRFreePIE.cs b/OSVRFreePIE.cs new file mode 100644 index 0000000..8a2deb0 --- /dev/null +++ b/OSVRFreePIE.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using FreePIE.Core.Contracts; +using OSVR.ClientKit; + +namespace OSVRFreePIE +{ + [GlobalType(Type = typeof(OSVRGlobal), IsIndexed = true)] + public class OSVRFreePIE : IPlugin + { + private ClientContext context; + + public event EventHandler Started; + + public OSVRFreePIE() + { + } + + public object CreateGlobal() + { + context = new ClientContext("com.osvr.freepieClient"); + return new OSVRGlobal(this); + } + + public string FriendlyName + { + get { return "OSVR Interface"; } + } + + public bool GetProperty(int index, IPluginProperty property) + { + return false; + } + + public bool SetProperties(Dictionary properties) + { + return false; + } + + public Action Start() + { + context.SetRoomRotationUsingHead(); + return null; + } + + public void Stop() + { + } + + public void DoBeforeNextExecute() + { + context.update(); + } + + static public implicit operator ClientContext(OSVRFreePIE osvrFreePIE) + { + return osvrFreePIE.context; + } + + } + + [Global(Name = "OSVR")] + public class OSVRGlobal + { + private readonly OSVRFreePIE osvr; + + public OSVRGlobal(OSVRFreePIE osvr) + { + this.osvr = osvr; + } + + public Analog analog(String path) + { + return new Analog(osvr, path); + } + + public Button button(String path) + { + return new Button(osvr, path); + } + + public Direction direction(String path) + { + return new Direction(osvr, path); + } + + public EyeTracker eyeTracker(String path) + { + return new EyeTracker(osvr, path); + } + + public Location2D location2D(String path) + { + return new Location2D(osvr, path); + } + + public Locomotion locomotion(String path) + { + return new Locomotion(osvr, path); + } + + public Tracker tracker(String path) + { + return new Tracker(osvr, path); + } + + public Tracker head() + { + return new Tracker(osvr, "/me/head"); + } + + public Tracker leftHand() + { + return new Tracker(osvr, "/me/hands/left"); + } + + public Tracker rightHand() + { + return new Tracker(osvr, "/me/hands/right"); + } + + public Controller leftController() + { + return new Controller(osvr, "left"); + } + + public Controller rightController() + { + return new Controller(osvr, "right"); + } + + } +} \ No newline at end of file diff --git a/OSVRFreePIE.csproj b/OSVRFreePIE.csproj index e3f64af..848eb49 100644 --- a/OSVRFreePIE.csproj +++ b/OSVRFreePIE.csproj @@ -16,7 +16,7 @@ true full false - bin\Debug\ + ..\..\..\..\Program Files %28x86%29\FreePIE\plugins\ DEBUG;TRACE prompt 4 @@ -46,8 +46,16 @@ - + + + + + + + + + - \ No newline at end of file +