package Ġorg . team 5 4 1 9 . fault . input Ċ Ċ import Ġorg . team 5 4 1 9 . fault . auto . Action Ċ import Ġkotlin . math . absolute Value Ċ Ċ type alias ĠHID Control Listener Ġ= Ġ() Ġ-> ĠUnit Ċ Ċ interface ĠHID Control Ġ{ ĊĠĠĠ Ġfun Ġupdate () Ċ } Ċ class ĠHID Button ( ĊĠĠĠ Ġprivate Ġval Ġsource : ĠHID Source , ĊĠĠĠ Ġprivate Ġval Ġthreshold : ĠDouble , ĊĠĠĠ Ġprivate Ġval Ġwhile On : ĠList < HID Control Listener >, ĊĠĠĠ Ġprivate Ġval Ġwhile Off : ĠList < HID Control Listener >, ĊĠĠĠ Ġprivate Ġval Ġchange To On : ĠList < HID Control Listener >, ĊĠĠĠ Ġprivate Ġval Ġchange To Off : ĠList < HID Control Listener > Ċ ) Ġ: ĠHID Control Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlast Value Ġ= Ġsource (). absolute Value Ġ>= Ġthreshold ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Value Ġ= Ġsource (). absolute Value Ġ>= Ġthreshold ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValue Ġhas Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Value Ġ!= Ġcurrent Value Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ-> Ġchange To On ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġchange To Off ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValue Ġstay ed Ġthe Ġsame ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ-> Ġwhile On ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhile Off ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġlast Value Ġ= Ġcurrent Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk Default Threshold Ġ= Ġ 0 . 5 ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠHID Control Builder ( val Ġsource : ĠHID Source ) Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġbuild (): ĠHID Control Ċ } Ċ class ĠHID Button Builder ( source : ĠHID Source , Ġprivate Ġval Ġthreshold : ĠDouble ) Ġ: ĠHID Control Builder ( source ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġwhile Off Ġ= Ġmutable ListOf < HID Control Listener >() ĊĠĠĠ Ġprivate Ġval Ġwhile On Ġ= Ġmutable ListOf < HID Control Listener >() ĊĠĠĠ Ġprivate Ġval Ġchange To On Ġ= Ġmutable ListOf < HID Control Listener >() ĊĠĠĠ Ġprivate Ġval Ġchange To Off Ġ= Ġmutable ListOf < HID Control Listener >() ĊĊĠĠĠ Ġfun Ġchange To On ( action : ĠAction ) Ġ= Ġchange To On Ġ{ Ġaction . start () Ġ} ĊĠĠĠ Ġfun Ġchange To Off ( action : ĠAction ) Ġ= Ġchange To Off Ġ{ Ġaction . start () Ġ} ĊĊĠĠĠ Ġfun Ġwhile Off ( block : ĠHID Control Listener ) Ġ= Ġalso Ġ{ Ġwhile Off . add ( block ) Ġ} ĊĠĠĠ Ġfun Ġwhile On ( block : ĠHID Control Listener ) Ġ= Ġalso Ġ{ Ġwhile On . add ( block ) Ġ} ĊĠĠĠ Ġfun Ġchange To On ( block : ĠHID Control Listener ) Ġ= Ġalso Ġ{ Ġchange To On . add ( block ) Ġ} ĊĠĠĠ Ġfun Ġchange To Off ( block : ĠHID Control Listener ) Ġ= Ġalso Ġ{ Ġchange To Off . add ( block ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild () Ġ= ĠHID Button ( source , Ġthreshold , Ġwhile On , Ġwhile Off , Ġchange To On , Ġchange To Off ) Ċ } Ċ