'''
Angle/accelerometer or by build-in buttons controlled version. 2018-May-10
Rain pattern version
A simple script that produces 
a "rain" pattern in resting state,

the m-bit is twisted in the corresponding direction, or
left or right moving arrows if buttons A or B are pressed 

or a break indicator/alert pattern if the m-bit is bent backwards
or both buttons are pressed. 

Might be used for a bicycle helmet backlight or similar.

Build for the mu micro python editor by Dr H.
https://www.instructables.com/id/A-Microbit-Direction-Indicator-for-Biking-Helmets/
'''

from microbit import *

import random

random.seed(3433)   # enter your lucky number 

de = 100   # sets display delay time in ms
ff1 = 100    # sets firefly delay time 1 in ms
ff2 = 50    # sets firefly delay time 2 in ms
fn = 3     # sets number of firefly seed points
thresh_z = 80
thresh_x = 350

# define images

image_l_1 = Image(   
    "00900:"
    "09000:"
    "97531:"
    "09000:"
    "00900")
              
image_l_2 = Image(   
    "09000:"
    "90000:"
    "75319:"
    "90000:"
    "09000")
                         
image_l_3 = Image(   
    "90000:"
    "00009:"
    "53197:"
    "00009:"
    "90000")
              
image_l_4 = Image(   
    "00009:"
    "00090:"
    "31975:"
    "00090:"
    "00009")
    
image_l_5 = Image(   
    "00090:"
    "00900:"
    "19753:"
    "00900:"
    "00090")
    
image_r_1 = Image(   
    "00900:"
    "00090:"
    "13579:"
    "00090:"
    "00900")
              
image_r_2 = Image(   
    "00090:"
    "00009:"
    "91357:"
    "00009:"
    "00090") 
    
image_r_3 = Image(   
    "00009:"
    "90000:"
    "79135:"
    "90000:"
    "00009")  
    
image_r_4 = Image(   
    "90000:"
    "09000:"
    "57913:"
    "09000:"
    "90000")   
    
image_r_5 = Image(   
    "09000:"
    "00900:"
    "35791:"
    "00900:"
    "09000")
    
image_z_1 = Image(   
    "90009:"
    "00000:"
    "00900:"
    "00000:"
    "90009")

image_z_2 = Image(   
    "09090:"
    "90009:"
    "00000:"
    "90009:"
    "09090")    

# start the program    
while True: 
    
    print((accelerometer.get_x(), accelerometer.get_y(), accelerometer.get_z()))
    # to be used with serial monitor or plotter for threshold value optimization; 
    # mute with '#' if not used
    
    if ((accelerometer.get_z() > thresh_z)      # head bent back, adjust if required
            or (button_a.is_pressed() and button_b.is_pressed())):   # for control purposes
           
        display.show(Image.DIAMOND_SMALL) 
        sleep(de) 
        display.show(Image.DIAMOND)
        sleep(de)
        display.show(image_z_2) 
        sleep(de)  
        display.show(image_z_1) 
        sleep(de)               
        display.clear()
        
    elif ((accelerometer.get_x() < (-1*thresh_x)) 
            # direction indicator left; bend head about 20 degrees left
            # adjust as needed
            or button_a.is_pressed()):    # for testing purposes 
                
        display.show(image_l_1)
        sleep(de)
        display.show(image_l_2)
        sleep(de)
        display.show(image_l_3)
        sleep(de) 
        display.show(image_l_4)
        sleep(de)
        display.show(image_l_5)
        sleep(de)
        display.clear()
        
    elif ((accelerometer.get_x() > thresh_x)  
            # direction indicator right; to activate bend head about 20 degrees right
            or button_b.is_pressed()): 
        
        display.show(image_r_1)
        sleep(de)
        display.show(image_r_2)
        sleep(de)
        display.show(image_r_3)
        sleep(de) 
        display.show(image_r_4)
        sleep(de)
        display.show(image_r_5)
        sleep(de)  
        display.clear()
             
    else:          # 'firefly' pattern generator
        # reduces intensity of all pixels by one step
        for p in range(0, 4):                # for the lowest four rows            
            for i in range(0, 5):            # for every pixel in the row
                j = 4 - p
                b = display.get_pixel(i, j-1)  # get current intensity pixel in row above
                # print((i, j, b))
                if (b > 1):                  # if 1+
                    f = b - 1                # reduce brightness by one
                else: 
                    f = 0                    # sets 0 as lowest allowed value
                display.set_pixel(i, j, f)
        # sleep(ff2)
        
        for h in range(0, 5): 
            k = random.randint(0, 9)   # set brightness for seed pixel
            m = random.randint(0, 100)   # define probability 1
            if (m < 30):               # define probability 2
                display.set_pixel(h, 0, k)  # seed pixels at top row
                
        sleep(ff2)       
