package Ġutils Ċ // virtual Robot Support Q ak . kt Ċ Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . net . Socket Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . BufferedReader Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġjava . io . InputStream Reader Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . Job Ċ import Ġutils . Messages Ċ import Ġit . uni bo . k actor . Actor Basic ĊĠĊ Ġ// A Ġsupport Ġfor Ġusing Ġthe Ġvirtual Ġrobot ĊĠ Ċ @ kotlin x . coroutines . Obsolete Cor outines Api Ċ @ kotlin x . coroutines . Experimental Cor outines Api Ċ object Ġvirtual Robot Support Q ak Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhost Name Ġ= Ġ" localhost " ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġport ĠĠĠĠ Ġ= Ġ 8 9 9 9 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsep ĠĠĠĠĠ Ġ= Ġ";" ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġout ToServer Ġ: ĠPrintWriter ? ĠĠĠĠ Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġowner Ġ: ĠActor Basic ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġap pl Cmd set Ġ= Ġset Of (" w "," s "," a "," d "," z "," x "," r "," l "," h " Ġ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsensor Observer Ġ: ĠJob ? Ġ= Ġnull ĊĉĊĉ ĊĠĠĠĠĠĠĠ Ġvar Ġtrace On Ġ= Ġfalse ĊĉĊ ĉ fun Ġtrace ( Ġmsg : ĠString Ġ){ Ċĉ ĉ if ( Ġtrace On Ġ) Ġ Ġprintln (" ĉĉ ĉ *** Ġvirtual Robot Support Q ak Ġ| Ġ$ msg ") Ċ ĉ } ĊĊ ĉ fun Ġinit Client Conn ( Ġowner : ĠActor Basic , Ġhost Name Str : ĠString Ġ= Ġhost Name , Ġport Str : ĠString Ġ= Ġ"$ port " Ġ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Name ĠĠĠĠĠĠĠĠ Ġ= Ġhost Name Str ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠInteger . parseInt ( port Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Socket Ġ= ĠSocket ( host Name , Ġport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace (" CONNECTION ĠDONE Ġwith Ġ$ port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout ToServer Ġ Ġ= ĠPrintWriter ( client Socket . get OutputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Sensor Observer ( Ġowner , Ġclient Socket Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch ( Ġe : Exception Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĉĉ ĉ *** Ġvirtual Robot Support Q ak Ġ| ĠERROR Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ ĉ } Ċ Ċ /* ĊĠ ĉ Per forms Ġa Ġmove Ġ Ċ */ ĉĉ ĊĠĠĠĠĠĠĠ Ġfun Ġdom ove ( cmd : ĠString ) Ġ{ ĉ // cmd Ġis Ġwritten Ġin Ġcr il ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject ( cmd Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"$ sep ${ jsonObject . toString ()} $ sep " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout ToServer ?. println ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout ToServer ?. flush () ĊĠĠĠĠĠĠĠ Ġ} Ċ // trans lates Ġapplication - language Ġin Ġcr il ĊĠĠĠĠĠĠĠ Ġfun Ġtranslate ( cmd : ĠString ) Ġ: ĠString { Ġ// cmd Ġis Ġwritten Ġin Ġapplication - language Ċĉ ĉ var Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' alarm ', Ġ' arg ': Ġ- 1 Ġ}" Ċĉĉ ĉ when ( Ġcmd Ġ){ Ċĉĉĉ ĉ " msg ( w )", Ġ" w " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' move Forward ', Ġ Ġ' arg ': Ġ- 1 Ġ}" Ċĉĉĉ ĉ " msg ( s )", Ġ" s " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' move Backward ', Ġ' arg ': Ġ- 1 Ġ}" Ċĉĉĉ ĉ " msg ( a )", Ġ" a " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Left ', Ġ Ġ' arg ': Ġ- 1 Ġ Ġ}" Ċĉĉĉ ĉ " msg ( d )", Ġ" d " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Right ', Ġ' arg ': Ġ- 1 Ġ Ġ}" Ċĉĉĉ ĉ " msg ( l )", Ġ" l " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Left ', Ġ Ġ' arg ': Ġ 3 0 0 Ġ}" Ċĉĉĉ ĉ " msg ( r )", Ġ" r " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Right ', Ġ' arg ': Ġ 3 0 0 Ġ}" Ċĉĉĉ ĉ " msg ( z )", Ġ" z " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Left ', Ġ Ġ' arg ': Ġ- 1 Ġ Ġ}" Ċĉĉĉ ĉ " msg ( x )", Ġ" x " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' turn Right ', Ġ' arg ': Ġ- 1 Ġ Ġ}" Ċĉĉĉ ĉ " msg ( h )", Ġ" h " Ġ-> Ġjson Msg Ġ= Ġ"{ Ġ' type ': Ġ' alarm ', ĠĠĠĠ Ġ' arg ': Ġ 1 0 0 Ġ}" Ċĉĉĉ ĉ else Ġ-> Ġprintln (" virtual Robot Support Q ak Ġcommand Ġ$ cmd Ġunknown ") Ċĉĉ ĉ } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject ( Ġjson Msg Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"$ sep ${ jsonObject . toString ()} $ sep " Ċĉĉ ĉ return Ġmsg Ċĉ ĉ } Ċĉ ĊĉĠĠĠ Ġfun Ġhalt (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdom ove ("{ Ġ' type ': Ġ' alarm ', ĠĠĠĠ Ġ' arg ': Ġ 1 0 0 Ġ} ") ĊĠĠĉ ĉ } ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġdo Ap pl Move ( cmd : ĠString ) Ġ{ ĉ // cmd Ġis Ġwritten Ġin Ġapplication - language Ċĉĉ ĉ halt () ĉ // def ensive Ġ... Ċĉĉ ĉ val Ġmsg Ġ= Ġtranslate ( Ġcmd Ġ) Ċĉĉ ĉ trace (" do Ap pl Move Ġ Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout ToServer ?. println ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout ToServer ?. flush () Ċĉĉ ĉ if ( Ġcmd ==" l " Ġ|| Ġcmd Ġ= =" r ") Ġ{ Ġdelay ( Ġ 3 0 0 Ġ) Ġ} ĠĊĠĠĠĠĠĠĠ Ġ} Ċĉ ĊĊĉ Ċĉ Ċ @ kotlin x . coroutines . Obsolete Cor outines Api Ċ @ kotlin x . coroutines . Experimental Cor outines Api ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstart Sensor Observer ( Ġowner : ĠActor Basic , Ġclient Socket Ġ: ĠSocket Ġ) Ġ{ Ċĉ ĉ val Ġin From Server Ġ= ĠBufferedReader ( InputStream Reader ( client Socket . getInputStream ())) Ċĉ ĉ val Ġscope Ġ: ĠCor outine Scope Ġ= ĠCor outine Scope ( ĠDispatch ers . Default Ġ) ĊĉĠĠĠ Ġsensor Observer Ġ= Ġscope . launch Ġ{ ĊĠ ĉĉĉ ĉ println (" ĉĉ ĉ *** Ġvirtual Robot Support Q ak Ġ| Ġsensor Observer ĠSTART S Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin pu Str Ġ= Ġin From Server . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Msg Str Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin pu Str !!. split ("; ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// trace (" in pu Str = Ġ$ json Msg Str ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject ( json Msg Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// trace ( Ġ" type : Ġ" Ġ+ ĠjsonObject . getString (" type ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( jsonObject . getString (" type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" web page - ready " Ġ-> Ġtrace (" web page - ready Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sonar - activated " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Arg ĠĠ Ġ= ĠjsonObject . getJSONObject (" arg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson ar Name Ġ= Ġjson Arg . getString (" sonar Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ Ġ= Ġjson Arg . getInt (" distance ") ĉĉĉĉĉĉĉ ĠĊĠ ĉĉĉĉĉĉĉ ĉ /* ĊĠ ĉĉĉĉĉĉĉĉ ĉ Transforms Ġthe Ġowner Ġas Ġa Ġsource Ġof Ġevents ĊĠ ĉĉĉĉĉĉĉ ĉ */ Ċĉĉĉĉĉĉĉ ĉ val Ġm 1 Ġ= Ġ" sonar ($ sonar Name , Ġ$ distance , Ġavatar Ġ= Ġtrue )" Ċĉĉĉĉĉĉĉ ĉ owner . emit (" sonar ", m 1 ) ĊĠ ĉĉĉĉĉĉĉ ĉ // Messages . emit ( Ġ" vr ", Ġ" sensor ", Ġ Ġ" sensor ($ sonar Name ,$ distance )", Ġowner Ġ Ġ) ĊĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" collision " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Arg ĠĠĠ Ġ= ĠjsonObject . getJSONObject (" arg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Name Ġ= Ġjson Arg . getString (" objectName ") Ċĉĉĉĉĉĉĉ ĉ // println (" virtual Robot Support Q ak Ġcollision Ġ$ objectName ") Ċĉĉĉĉĉĉĉ ĉ /* ĊĠ ĉĉĉĉĉĉĉĉ ĉ Transforms Ġthe Ġowner Ġas Ġa Ġsource Ġof Ġevents ĊĠ ĉĉĉĉĉĉĉ ĉ */ Ċĉĉĉĉĉĉĉ ĉ owner . emit (" collision ", Ġ Ġ" collision ( Ġ$ objectName , Ġavatar Ġ= Ġtrue Ġ) ") ĊĠ ĉĉĉĉĉĉĉ ĉ // Messages . emit ( Ġ" vr ", Ġ" collision ", Ġ Ġ" collision ( Ġ$ objectName Ġ) ", Ġowner Ġ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ}// start Sensor Observer ĠĊ Ċ fun Ġterminate vr (){ Ċ ĉ if ( Ġsensor Observer != Ġnull Ġ) Ġsensor Observer !!. cancel () Ċ ĉ trace (" TERMIN ATES Ġsensor Observer ") Ċ } Ċ Ċ } ĊĊĠ ĊĊĊĊĊĊĊĊ