package Ġorg . erg flow . rub ric Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . text . format . Date Utils Ċ import Ġorg . erg flow . Co ach Ċ import Ġorg . tensorflow . lite . examples . pos enet . lib . Body Part Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . util . Base 6 4 Ċ import Ġkotlin . math . round ToInt Ċ Ċ /** Ċ Ġ* ĠChecks Ġfor Ġproper Ġforward Ġsh in Ġangle Ġat Ġthe Ġcatch . Ċ Ġ*/ Ċ class ĠSh in Angle ( co ach : ĠCo ach ) Ġ: ĠBase Fault Checker ( co ach ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġtitle Ġ= Ġ" Sh in ĠAngle " ĊĠĠĠ Ġoverride Ġval Ġdescription Ġ= Ġ" Checks Ġfor Ġproper Ġforward Ġsh in Ġangle Ġat Ġthe Ġcatch ." ĊĠĠĠ Ġoverride Ġval Ġstroke History Unit Ġ= Ġ" Â° " ĊĠĠĠ Ġprivate Ġvar Ġmin Angle Ġ= Ġ 8 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Angle Ġ= Ġ 1 1 0 ĊĠĠĠ Ġprivate Ġvar Ġprevious Angle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcatch Time Of Bad Stroke Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġbad Angle Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġco ach . listeners . add ( this :: on Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . clear () ĊĠĠĠĠĠĠĠ Ġprevious Angle Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fault Initial Message (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Your Ġsh in Ġangle Ġat Ġthe Ġcatch Ġis Ġ$ previous Angle . ĠIde ally Ġthe Ġsh ins Ġshould Ġbe Ġvertical Ġat Ġthe Ġcatch ." ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fault Reminder Message (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Focus Ġon Ġgetting Ġyour Ġsh ins Ġas Ġclose Ġas Ġpossible Ġto Ġvertical Ġat Ġthe Ġcatch " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Fixed Message (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Threshold Info (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" [$ min Angle , Ġ$ max Angle ] Ġ$ stroke History Unit " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetTotal Mark (): ĠFault Checker . Mark Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFault Checker . Mark ( total Good St ro kes , Ġstroke History . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Event ( event : ĠCo ach . Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== ĠCo ach . Event . CATCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow er . catch Sh in Angle ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCatch Ġangles Ġoutside Ġof Ġ( 3 0 , Ġ 1 8 0 ) Ġrange Ġare Ġprobably Ġdetection Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ> Ġ 3 0 Ġ&& Ġthis Ġ< Ġ 1 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke History . add ( this . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ>= Ġmin Angle Ġ&& Ġthis Ġ<= Ġmax Angle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgood Stroke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbad Stroke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Time Of Bad Stroke Ġ= Ġrow er . catch Sh oulder ?. time Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbad Angle Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Angle Ġ= Ġthis . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Display () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠFault Checker . Status . FAULT _ MESSAGE _ SENT Ġ|| Ġgood Con secutive St ro kes Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco ach . display . show Target ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Body Part . LEFT _ ANK LE , ĠBody Part . LEFT _ K NE E ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco ach . target Positions [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco ach . display . green , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfault Report Description (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< h 2 > Impro per ĠSh in ĠAngle Ġat Ġthe ĠCatch </ h 2 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< p > Ide ally , Ġthe Ġsh ins Ġshould Ġbe Ġvertical Ġat Ġthe Ġcatch .</ p > ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfault Report Image Row (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġrow er . frames . find Ġ{ Ġit . time Ġ== Ġcatch Time Of Bad Stroke Ġ} ĊĠĠĠĠĠĠĠ Ġframe ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . stroke Count Ġ== Ġlast Reported Stroke ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Reported Stroke Ġ= Ġit . stroke Count ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġframe ?. bitmap ?. copy ( frame . bitmap . config , Ġtrue ) Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( copy ) ĊĠĠĠĠĠĠĠ Ġco ach . display . draw Lines ( canvas , Ġframe . points ) ĊĠĠĠĠĠĠĠ Ġval Ġan kle Ġ= Ġframe . points [ Body Part . LEFT _ ANK LE ] Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġknee Ġ= Ġframe . points [ Body Part . LEFT _ K NE E ] Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan kle . x . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan kle . y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan kle . x . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġknee . y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 3 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcopy . compress ( Bitmap . Compress Format . JPEG , Ġ 8 0 , Ġout ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Data Ġ= ĠBase 6 4 . get Encoder (). encode ToString ( out . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠDate Utils . format Elapsed Time ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( frame . time Ġ- Ġrow er . startTime !! ) Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< table > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< tr >< td > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ time Ġstroke Ġ# Ġ${ frame . stroke Count } ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh in Ġangle Ġ${ bad Angle . round ToInt ()} Ġ$ stroke History Unit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ td ></ tr > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ< tr >< td > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< img Ġsrc =" data : image / jpg ; base 6 4 , Ġ$ image Data "/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ td ></ tr > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ</ table > ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ} Ċ } Ċ