package Ġmessage Ċ Ċ import Ġboard . Pin Ċ import Ġjava . nio . charset . Charset Ċ import Ġkotlin . experimental . and Ċ import Ġkotlin . experimental . or Ċ Ċ open Ġclass ĠMessage ( var arg Ġvar Ġcontent : ĠByte ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlast Index : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontent . size Ġ- Ġ 1 ĊĊĠĠĠ Ġval Ġfirst N ib ble Ġget (): ĠByte Ġ= Ġfirst Byte Ġand Ġ 0 xF 0 . to Byte () ĊĊĠĠĠ Ġval Ġsecond N ib ble Ġget (): ĠByte Ġ= Ġfirst Byte Ġand Ġ 0 x 0 F . to Byte () ĊĊĠĠĠ Ġval Ġsy sex Content Ġget (): ĠMessage Ġ= Ġpartial ( 1 Ġuntil Ġlast Index Ġ- Ġ 1 ) ĊĊĠĠĠ Ġval Ġfirst Byte Ġget (): ĠByte Ġ= Ġcontent . first () ĊĊĠĠĠ Ġval Ġstring Message Ġget (): ĠString Ġ= ĠString ( content , ĠCharset . default Charset ()) ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠByte Ġ= Ġcontent [ index ] ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠMessage ): ĠMessage Ġ= ĠMessage (* content , Ġ* other . content ) ĊĊĠĠĠ Ġprivate Ġfun Ġpartial ( range : ĠInt Range ): ĠMessage Ġ= ĠMessage (* content . slice ( range ). toByteArray ()) ĊĊĠĠĠ Ġin fix Ġfun Ġstarting At ( from : ĠInt ): ĠMessage Ġ= Ġpartial ( from .. last Index ) ĊĊĠĠĠ Ġin fix Ġfun Ġending At ( to : ĠInt ): ĠMessage Ġ= Ġpartial ( 0 .. to ) ĊĊĠĠĠ Ġfun Ġis Sy sex (): ĠBoolean Ġ= ĠM idi . START _ SY SE X Ġcorresponds To Ġfirst Byte ĊĊĊĠĠĠ Ġfun Ġprint () Ġ= Ġprintln (" Message : Ġ${ as HexString () }") ĊĊĊĠĠĠ Ġfun Ġsplit All ( byte : ĠByte ): ĠArray < Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Message >() ĊĠĠĠĠĠĠĠ Ġvar Ġelement Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠ Ġcontent . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġbyte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Message (* element . toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas HexString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhex Array Ġ= Ġchar ArrayOf (' 0 ', Ġ' 1 ', Ġ' 2 ', Ġ' 3 ', Ġ' 4 ', Ġ' 5 ', Ġ' 6 ', Ġ' 7 ', Ġ' 8 ', Ġ' 9 ', Ġ' A ', Ġ' B ', Ġ' C ', Ġ' D ', Ġ' E ', Ġ' F ') ĊĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġ""; ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġcontent . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġcontent [ j ]. toInt () Ġand Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġ" 0 x ${ hex Array [ v Ġ ush r Ġ 4 ]} ${ hex Array [ v Ġand Ġ 0 x 0 F ]} Ġ" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġother Ġas ĠMessage ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent . content Equals ( other . content ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent . content HashCode () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ġanalog Ġ 1 4 - bit Ġdata Ġformat Ċ Ġ* Ġ 0 Ġ Ġanalog Ġpin , Ġ 0 xE 0 - 0 xEF , Ġ( MIDI ĠP itch ĠW heel ) Ċ Ġ* Ġ 1 Ġ Ġanalog Ġleast Ġsignificant Ġ 7 Ġbits Ċ Ġ* Ġ 2 Ġ Ġanalog Ġmost Ġsignificant Ġ 7 Ġbits Ċ Ġ*/ Ċ class ĠAn alog Message ( pin : ĠPin , Ġvar arg Ġcontent : ĠByte ) Ġ: ĠMessage ( ĊĠĠĠ Ġ( Midi . AN ALOG _ MESSAGE . toInt () Ġor Ġ( pin . position Ġand Ġ 0 x 0 F )). to Byte (), Ġ* content Ċ ) Ċ Ċ /** Ġtwo Ġbyte Ġdigital Ġdata Ġformat , Ġsecond Ġnib ble Ġof Ġbyte Ġ 0 Ġgives Ġthe Ġport Ġnumber Ġ( e . g . Ġ 0 x 9 2 Ġis Ġthe Ġthird Ġport , Ġport Ġ 2 ) Ċ Ġ* Ġ 0 Ġ Ġdigital Ġdata , Ġ 0 x 9 0 - 0 x 9 F , Ġ( MIDI ĠNote On , Ġbut Ġdifferent Ġdata Ġformat ) Ċ Ġ* Ġ 1 Ġ Ġdigital Ġpins Ġ 0 - 6 Ġbit mask Ċ Ġ* Ġ 2 Ġ Ġdigital Ġpin Ġ 7 Ġbit mask Ċ Ġ*/ Ċ class ĠDigital Message ( pin : ĠPin , Ġcontent : ĠByte ) Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . DIG ITAL _ MESSAGE . get (), Ġ( pin . position Ġand Ġ 0 x 7 F ). to Byte (), Ġcontent Ċ ) ĊĊ Ċ /** Ġtoggle Ġanalog In Ġreporting Ġby Ġpin Ċ Ġ* Ġ 0 Ġ Ġtoggle Ġanalog In Ġreporting Ġ( 0 xC 0 - 0 x CF ) Ġ( MIDI ĠProgram ĠChange ) Ċ Ġ* Ġ 1 Ġ Ġdisable ( 0 )/ enable ( non - zero ) Ċ Ġ*/ Ċ open Ġclass ĠAn alog Report Message ( pin : ĠPin , Ġenable : ĠBoolean ) Ġ: ĠMessage ( ĊĠĠĠ Ġ( Midi . REPORT _ AN ALOG . toInt () Ġor Ġ( pin . position )). to Byte (), Ġif Ġ( enable ) Ġ 1 Ġelse Ġ 0 Ċ ) Ċ Ċ class ĠAn alog Report Message Enable ( pin : ĠPin ) Ġ: ĠAn alog Report Message ( pin , Ġtrue ) Ċ class ĠAn alog Report Message Disable ( pin : ĠPin ) Ġ: ĠAn alog Report Message ( pin , Ġfalse ) Ċ Ċ /** Ġtoggle Ġdigital Ġport Ġreporting Ġby Ġport Ġ( second Ġnib ble Ġof Ġbyte Ġ 0 ), Ġe . g . Ġ 0 xD 1 Ġis Ġport Ġ 1 Ġis Ġpins Ġ 8 Ġto Ġ 1 5 , Ċ Ġ* Ġ 0 Ġ Ġtoggle Ġdigital Ġport Ġreporting Ġ( 0 xD 0 - 0 x DF ) Ġ( MIDI ĠAfter touch ) Ċ Ġ* Ġ 1 Ġ Ġdisable ( 0 )/ enable ( non - zero ) Ċ Ġ*/ Ċ open Ġclass ĠDigital Report Message ( set : ĠInt , Ġenable : ĠBoolean ) Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . REPORT _ DIG ITAL . get () Ġor Ġ( set . to Byte () Ġand Ġ 0 x 0 F ), Ġif Ġ( enable ) Ġ 1 Ġelse Ġ 0 Ċ ) Ċ Ċ class ĠDigital Report Message Enable ( set : ĠInt ) Ġ: ĠDigital Report Message ( set , Ġtrue ) Ċ class ĠDigital Report Message Disable ( set : ĠInt ) Ġ: ĠDigital Report Message ( set , Ġfalse ) Ċ Ċ /** Ġset Ġpin Ġmode Ċ Ġ* Ġ 1 Ġ Ġset Ġdigital Ġpin Ġmode Ġ( 0 xF 4 ) Ġ( MIDI ĠUndefined ) Ċ Ġ* Ġ 2 Ġ Ġpin Ġnumber Ġ( 0 - 1 2 7 ) Ċ Ġ* Ġ 3 Ġ Ġstate Ġ( INPUT / OUTPUT / AN ALOG / PWM / SER VO , Ġ 0 / 1 / 2 / 3 / 4 ) Ċ Ġ*/ Ċ class ĠPin Mode Message ( pin : ĠPin , Ġmode : ĠPin . MODE ) Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . SET _ PIN _ MODE . get (), Ġpin . position . to Byte (), Ġmode . hex Ċ ) Ċ Ċ /** Ġrequest Ġversion Ġreport Ċ Ġ* Ġ 0 Ġ Ġrequest Ġversion Ġreport Ġ( 0 xF 9 ) Ġ( MIDI ĠUndefined ) Ċ Ġ*/ Ċ class ĠVersion Request Message Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . REPORT _ VERSION . get () Ċ ) Ċ Ċ /** Ġfirmware Ġname Ġand Ġversion Ċ Ġ* Ġ------------------------------------------------ - Ċ Ġ* Ġ 0 Ġ ĠSTART _ SY SE X ĠĠĠĠĠĠ Ġ( 0 xF 0 ) Ċ Ġ* Ġ 1 Ġ Ġquery Firmware ĠĠĠĠ Ġ( 0 x 7 9 ) Ċ Ġ* Ġ 2 Ġ Ġmajor Ġversion ĠĠĠĠ Ġ( 0 - 1 2 7 ) Ċ Ġ* Ġ 3 Ġ Ġminor Ġversion ĠĠĠĠ Ġ( 0 - 1 2 7 ) Ċ Ġ* Ġ 4 Ġ Ġfirst Ġchar Ġof Ġfirmware Ġname Ġ( LSB ) Ċ Ġ* Ġ 5 Ġ Ġfirst Ġchar Ġof Ġfirmware Ġname Ġ( MSB ) Ċ Ġ* Ġ 6 Ġ Ġsecond Ġchar Ġof Ġfirmware Ġname Ġ( LSB ) Ċ Ġ* Ġ 7 Ġ Ġsecond Ġchar Ġof Ġfirmware Ġname Ġ( MSB ) Ċ Ġ* Ġ... Ġfor Ġas Ġmany Ġbytes Ġas Ġit Ġneeds Ċ Ġ* ĠN Ġ ĠEND _ SY SE X ĠĠĠĠĠĠĠĠ Ġ( 0 xF 7 ) Ċ Ġ*/ Ċ class ĠF irmware Name And Version Message Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠNot Ġimplemented Ġyet Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġcapability Ġquery Ġprovides Ġa Ġlist Ġof Ġall Ġmodes Ġsupported Ġby Ġeach Ġpin . Ċ Ġ* ĠEach Ġmode Ġis Ġdescribed Ġby Ġ 2 Ġbytes Ġwhere Ġthe Ġfirst Ġbyte Ġis Ġthe Ġpin Ġmode Ċ Ġ* Ġ( such Ġas Ġdigital Ġinput , Ġdigital Ġoutput , ĠPWM ) Ġand Ġthe Ġsecond Ġbyte Ġis Ġthe Ċ Ġ* Ġresolution Ġ( or Ġsometimes Ġthe Ġtype Ġof Ġpin Ġsuch Ġas ĠRX Ġor ĠTX Ġfor Ġa ĠUART Ġpin ). Ċ Ġ* ĠA Ġvalue Ġof Ġ 0 x 7 F Ġis Ġused Ġas Ġa Ġseparator Ġto Ġmark Ġthe Ġend Ġeach Ġpin 's Ġlist Ġof Ġmodes . Ċ Ġ* ĠThe Ġnumber Ġof Ġpins Ġsupported Ġis Ġinferred Ġby Ġthe Ġmessage Ġlength . Ċ Ġ* Ġ 0 Ġ ĠSTART _ SY SE X ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 xF 0 ) Ċ Ġ* Ġ 1 Ġ ĠCAP ABILITY _ QUERY ĠĠĠĠĠĠĠĠ Ġ( 0 x 6 B ) Ċ Ġ* Ġ 2 Ġ ĠEND _ SY SE X ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 xF 7 ) Ċ Ġ*/ Ċ class ĠCap ability Query Message Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . START _ SY SE X . get (), ĊĠĠĠ ĠSy sex . CAP ABILITY _ QUERY . get (), ĊĠĠĠ ĠM idi . END _ SY SE X . get () Ċ ) Ċ Ċ /** Ċ Ġ* ĠSerial ĠConfig Ċ Ġ* ĠConfig ures Ġthe Ġspecified Ġhardware Ġor Ġsoftware Ġserial Ġport . Ċ Ġ* ĠRX Ġand ĠTX Ġpins Ġare Ġoptional Ġand Ġshould Ġonly Ġbe Ġspecified Ġif Ċ Ġ* Ġthe Ġplatform Ġrequires Ġthem Ġto Ġbe Ġset . Ċ Ġ*/ Ċ class ĠSerial Config Message ( port : ĠSerial . Port , Ġbaud : ĠByteArray , Ġrx : ĠByte , Ġtx : ĠByte ) Ġ: ĊĠĠĠ ĠMessage ( ĊĠĠĠĠĠĠĠ ĠM idi . START _ SY SE X . get (), ĊĠĠĠĠĠĠĠ ĠSy sex . SERIAL _ DATA . get (), ĊĠĠĠĠĠĠĠ ĠSerial . SERIAL _ CONFIG . get () Ġor Ġport . get (), ĊĠĠĠĠĠĠĠ Ġ* ba ud , ĊĠĠĠĠĠĠĠ Ġrx , ĊĠĠĠĠĠĠĠ Ġtx , ĊĠĠĠĠĠĠĠ ĠM idi . END _ SY SE X . get () ĊĠĠĠ Ġ) Ċ Ċ /** Ċ Ġ* ĠSerial ĠRead Ċ Ġ* ĠBoard Ġ-> ĠF irm ata Ġclient Ċ Ġ* ĠRead Ġcontents Ġof Ġserial Ġbuffer Ġand Ġsend Ġto ĠF irm ata Ġclient Ġ( send Ġwith ĠSERIAL _ REPLY ). Ċ Ġ* Ġmax Bytes To Read Ġoptionally Ġspecifies Ġhow Ġmany Ġbytes Ġto Ġread Ġfor Ġeach Ġiteration . Ċ Ġ* ĠSet Ġto Ġ 0 Ġ( or Ġdo Ġnot Ġdefine ) Ġto Ġread Ġall Ġavailable Ġbytes . ĠIf Ġthere Ġare Ġless Ġbytes Ċ Ġ* Ġin Ġthe Ġbuffer Ġthan Ġthe Ġnumber Ġof Ġbytes Ġspecified Ġby Ġmax Bytes To Read Ġthen Ġthe Ġless er Ċ Ġ* Ġnumber Ġof Ġbytes Ġwill Ġbe Ġreturned . Ċ Ġ*/ Ċ class ĠSerial Read Message ( port : ĠSerial . Port , Ġmode : ĠSerial . Read Mode ) Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . START _ SY SE X . get (), ĊĠĠĠ ĠSy sex . SERIAL _ DATA . get (), ĊĠĠĠ ĠSerial . SERIAL _ READ . get () Ġor Ġport . get (), ĊĠĠĠ Ġmode . get (), ĊĠĠĠ ĠM idi . END _ SY SE X . get () Ċ ) Ċ Ċ /** Ċ Ġ* ĠSerial ĠWrite Ċ Ġ* ĠF irm ata Ġclient Ġ-> ĠBoard Ċ Ġ* Ċ Ġ* ĠReceive Ġserial Ġdata Ġfrom ĠF irm ata Ġclient , Ġre assemble Ġand Ġwrite Ġfor Ġeach Ġbyte Ġreceived . Ċ Ġ*/ Ċ class ĠSerial Write Message ( port : ĠSerial . Port , Ġvar arg Ġdata : ĠByte ) Ġ: ĠMessage ( ĊĠĠĠ ĠM idi . START _ SY SE X . get (), ĊĠĠĠ ĠSy sex . SERIAL _ DATA . get (), ĊĠĠĠ ĠSerial . SERIAL _ WRITE . get () Ġor Ġport . get (), ĊĠĠĠ Ġ* data , ĊĠĠĠ ĠM idi . END _ SY SE X . get () Ċ )