' Make-it-with-Micromite
' Part 13 (Practical Electronics: Feb 2020)
'
' MKC_MoodLight.txt (v1)
'
' Uses Blinkt! RGB LED module and IR Receiver
'
' BlinkT data (pin 16 on RPi 40way) = Micromite pin 3 (SPI OUT)
' BlinkT clock (pin 18 on 40way)= Micromite pin 25 (SPI Clk)
'

' SETUP
' =====
OPTION AUTORUN ON
CPU 40                            ' ensure Micromite runs at 40MHz
SPI open 1000000,0,8              ' configure the SPI pins
IR DevCode,KeyCode, IR_Int        ' configure IR interupt

Dim ML_RGB(8,3) As integer        ' 0=Brightness, 1=Red, 2=Green, 3=Blue
Dim ML_Power As integer           ' negative=Off, positive=On
Dim ML_Mode As integer            ' 0=On, 1=Fade, 2=Flash
Dim ML_Brightness As integer      ' 5-bit value between 0 and 31
Dim i, rr, gg, bb As integer      '
Dim P_Brightness As integer       ' Previous Brightness
Dim Prr, Pgg, Pbb As integer      ' Previous RGB values
Dim ML_Speed As integer           '

ML_Power=1                        ' default to Power On
ML_Mode=0                         ' default to Mode: LEDs On (static)
ML_Brightness=31                  ' default to maximum LED Brightness
rr=0:gg=255:bb=0                  ' default to Green colour
ML_Speed=100                      ' default delay


' MAIN PROGRAM
' ============

Do
  If ML_Power>0 Then
    Select Case ML_Mode
    Case 1                        ' Mode=FADE

    Case 2                        ' Mode=FLASH

    Case OTHER                    ' Mode=On (static)
      If (ML_Brightness-P_Brightness) Or (rr-Prr) Or (gg-Pgg) Or (bb-Pbb) Then Update_Blinkt
    End Select
  Else
    If P_Brightness Then tempBrightness=ML_Brightness : ML_Brightness=0 : Update_Blinkt : ML_Brightness=tempBrightness
  End If
Loop

ff:
FadeUpDown(255,20,147)
FadeUpDown(0,255,0)
FadeUpDown(20,147,255)
FadeUpDown(255,0,0)
FadeUpDown(255,255,20)
FadeUpDown(0,0,255)
GoTo ff

GoTo main
End

Sub FadeUpDown(rr,gg,bb)
   For www=1 To 8
    For i=1 To NumLEDs
      aRGB(i,1)=rr
      aRGB(i,2)=gg
      aRGB(i,3)=bb
      aRGB(i,0)=www
    Next i : UpdateAPA :Pause d: Next www
   For www=7 To 0 Step -1
    For i=1 To NumLEDs
      aRGB(i,1)=rr
      aRGB(i,2)=gg
      aRGB(i,3)=bb
      aRGB(i,0)=www
    Next i : UpdateAPA : Pause d: Next www

End Sub


Sub Update_Blinkt
  SPI WRITE 4,0,0,0,0             ' START frame
  For i=1 To 8
    SPI WRITE 4,&b11100000+(31 And ML_Brightness),(bb And 255),(gg And 255), (rr And 255)
  Next i
  SPI WRITE 5,0,0,0,0,0           ' END frame
  Prr=rr:Pgg=gg:Pbb=bb:P_Brightness=ML_Brightness
  Print "UPDATED"
End Sub

Sub UpdateAPA
  'APA Start Frame
  SPI write 4,0,0,0,0

  'LED Data - 32 bits per LED: [Brightness,B,G,R]
  For i=1 To NumLEDs
    SPI write 4,&HE0+aRGB(i,0),aRGB(i,3),aRGB(i,2),aRGB(i,1)
   'Brightness bits: 111bbbbb (value between 0 and 31)
  Next i

  'reset pulse (required by some clone APAs - does not affect genuine APAs)
 SPI write 4,0,0,0,0
  'end frame (need additional clock pulses = to half the number of LEDs)
  SPI write 1,0
End Sub


Sub IR_Int
  If (DevCode=255) And (ML_Power>0) Then
  b$=""
  Select Case KeyCode
    Case 58 :b$="Increase Brightness": If ML_Mode=0 Then ML_Brightness=ML_Brightness+1: If ML_Brightness>31 Then ML_Brightne
ss=31
    Case 186 :b$="Decrease Brightness": If ML_Mode=0 Then ML_Brightness=ML_Brightness-1: If ML_Brightness<1 Then ML_Brightne
ss=1
    Case 130 :b$="Toggle Brightness" : If (ML_Mode=0) And (ML_Brightness>10) Then ML_Brightness=1 Else ML_Brightness=31
    Case 2 :b$="Power": ML_Power=ML_Power * -1

    Case 26 :b$="RED": rr=255:gg=0:bb=0
    Case 154 :b$="GREEN": rr=0:gg=255:bb=0
    Case 162 :b$="BLUE": rr=0:gg=0:bb=255
    Case 34 :b$="WHITE": rr=255:gg=255:bb=255

    Case 42
    Case 170 :b$="PALE GREEN": rr=0:gg=128:bb=0
    Case 146 :b$="PALE BLUE": rr=0:gg=0:bb=128
    Case 18

    Case 10
    Case 138
    Case 178
    Case 50

    Case 56
    Case 184
    Case 120 :b$="MAGENTA": rr=255:gg=0:bb=255
    Case 248

    Case 24 :b$="YELLOW": rr=255:gg=255:bb=0
    Case 152
    Case 88
    Case 216

    Case 40 :b$="Increase RED"
    Case 168 :b$="Increase GREEN"
    Case 104 :b$="Increase BLUE"
    Case 232 :b$="QUICK"

    Case 8 :b$="Decrease RED"
    Case 136 :b$="Decrease GREEN"
    Case 72 :b$="Decrease BLUE"
    Case 200 :b$="SLOW"

    Case 48 :b$="DIY 1"
    Case 176 :b$="DIY 2"
    Case 112 :b$="DIY 3"
    Case 240 :b$="AUTO"

    Case 16 :b$="DIY 4"
    Case 144 :b$="DIY 5"
    Case 80 :b$="DIY 6"
    Case 208 :b$="FLASH"

    Case 32 :b$="JUMP3"
    Case 160 :b$="JUMP7"
    Case 96 :b$="FADE3"
    Case 224 :b$="FADE7"
  End Select
  Print Str$(KeyCode)+"  "+b$+"  ["+Str$(ML_Brightness)+", "+Str$(rr)+", "+Str$(gg)+", "+Str$(bb)+"]"
Else
  If DevCode=255 And KeyCode=2 Then ML_Power=ML_Power*-1
End If
End Sub

Sub q
  update_blinkt
End Sub