package Ġcom . mq gateway . core . device Ċ Ċ import Ġcom . mq gateway . core . gateway config . Device PropertyType . STATE Ċ import Ġcom . mq gateway . core . gateway config . DeviceType Ċ import Ġcom . mq gateway . core . hardware . Mq Gpio Pin Digital Input Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . Instant Ċ import Ġjava . util . Timer Ċ import Ġjava . util . Timer Task Ċ import Ġkotlin . concurrent . schedule Ċ Ċ private Ġval ĠLOGGER Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠSwitch Button Device ( ĊĠ Ġid : ĠString , ĊĠ Ġprivate Ġval Ġpin : ĠM q Gpio Pin Digital Input , ĊĠ Ġdebounce Ms : ĠInt Ġ= ĠCONFIG _ DE BOUN CE _ DEFAULT , ĊĠ Ġprivate Ġval Ġlong Press Time Ms : ĠLong Ġ= ĠCONFIG _ LONG _ PRESS _ TIME _ MS _ DEFAULT Ċ ) Ġ: ĠDigital Input Device ( id , ĠDevice Type . SWITCH _ BUTTON , Ġpin , Ġdebounce Ms ) Ġ{ ĊĊĠ Ġprivate Ġvar Ġpressed Time : ĠInstant ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġlong Press Timer Ġ= ĠTimer (" Switch Button Long Press _$ id ", Ġfalse ) ĊĠ Ġprivate Ġvar Ġlong Press Timer Task : ĠTimer Task ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġlong Press Done Ġ= Ġfalse ĊĊĠ Ġoverride Ġfun Ġinit Device () Ġ{ ĊĠĠĠ Ġsuper . init Device () ĊĠĠĠ Ġpin . set De bounce ( de bounce Ms ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġup datable Property () Ġ= ĠSTATE ĊĠ Ġoverride Ġfun Ġhigh State Value () Ġ= ĠRELEASE D _ STATE _ VALUE ĊĠ Ġoverride Ġfun Ġlow State Value () Ġ= ĠP RESSED _ STATE _ VALUE ĊĊĠ Ġoverride Ġfun Ġadditional On StateChanged ( newState : ĠString ) Ġ{ ĊĠĠĠ Ġsuper . additional On StateChanged ( newState ) ĊĠĠĠ Ġif Ġ( newState Ġ== ĠP RESSED _ STATE _ VALUE ) Ġ{ ĊĠĠĠĠĠ Ġpressed Time Ġ= ĠInstant . now () ĊĠĠĠĠĠ Ġlong Press Timer Task Ġ= Ġlong Press Timer . schedule ( long Press Time Ms ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pressed Time ?. is Before ( Instant . now (). minus Millis ( long Press Time Ms Ġ- Ġ 1 )) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug Ġ{ Ġ" Switch Button Device Ġ'$ id ' Ġpressed Ġfor Ġmore Ġthen Ġ$ long Press Time Ms Ġms " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġnotify ( up datable Property (), ĠLONG _ PRES SED _ STATE _ VALUE ) ĊĠĠĠĠĠĠĠĠĠ Ġlong Press Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( long Press Done Ġ&& ĠnewState Ġ== ĠRELEASE D _ STATE _ VALUE ) Ġ{ ĊĠĠĠĠĠ ĠLOGGER . debug Ġ{ Ġ" Switch Button Device Ġ'$ id ' Ġreleased Ġafter Ġlong Ġpress " Ġ} ĊĠĠĠĠĠ Ġlong Press Done Ġ= Ġfalse ĊĠĠĠĠĠ Ġpressed Time Ġ= Ġnull ĊĠĠĠĠĠ Ġnotify ( up datable Property (), ĠLONG _ RELEASE D _ STATE _ VALUE ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġlong Press Timer Task ?. cancel () ĊĠĠĠĠĠ Ġpressed Time Ġ= Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠCONFIG _ DE BOUN CE _ DEFAULT Ġ= Ġ 5 0 ĊĊĠĠĠ Ġconst Ġval ĠCONFIG _ LONG _ PRESS _ TIME _ MS _ KEY Ġ= Ġ" long Press Time Ms " ĊĠĠĠ Ġconst Ġval ĠCONFIG _ LONG _ PRESS _ TIME _ MS _ DEFAULT Ġ= Ġ 1 0 0 0 L ĊĊĠĠĠ Ġconst Ġval ĠP RESSED _ STATE _ VALUE Ġ= Ġ" PRES SED " ĊĠĠĠ Ġconst Ġval ĠRELEASE D _ STATE _ VALUE Ġ= Ġ" RELEASE D " ĊĠĠĠ Ġconst Ġval ĠLONG _ PRES SED _ STATE _ VALUE Ġ= Ġ" LONG _ PRES SED " ĊĠĠĠ Ġconst Ġval ĠLONG _ RELEASE D _ STATE _ VALUE Ġ= Ġ" LONG _ RELEASE D " ĊĠ Ġ} Ċ } Ċ