import gui
import backlight
import vts
import vbox

# LiveDisplayVal class. Used to make data that is going to change.
class LiveDisplayVal:
    def __init__(self, init_val=0,format='{}'):
        self.val = init_val
        self.format = format
        self.disp_val = [self.format.format(self.val)]
    
    # Used to change the value of the data in this object.
    def update(self, val):
        self.val = val
        self.disp_val[0] = self.format.format(self.val)

# A class of globally accessed vars. Not necessary but it is neater than global vars.
class globally_accessed:
    clock_time = vts.clock_get()
    LED_state = LiveDisplayVal("OFF", "Current LED Status: {}")
    lightsensor = LiveDisplayVal(0, "Light Sensor Value: {}")
    frames_passed = LiveDisplayVal(0, "Frames Passed: {}")
    time_h = LiveDisplayVal(clock_time['hours'],'{:02d}')
    time_m = LiveDisplayVal(clock_time['minutes'],'{:02d}')
    time_s = LiveDisplayVal(clock_time['seconds'],'{:02d}')
    count = LiveDisplayVal(0, 'Count: {}')

# applies updates to values and then redraws the page.
def vsync_cb(l):
    globally_accessed.frames_passed.update(globally_accessed.frames_passed.val+1)
    globally_accessed.lightsensor.update(backlight.lightsensor())

    clock_time = vts.clock_get()
    globally_accessed.time_h.update(clock_time['hours'])
    globally_accessed.time_m.update(clock_time['minutes'])
    globally_accessed.time_s.update(clock_time['seconds'])

    gui.redraw()

# Used to change toggle the LEDs to a random colour.
def LED_button_cb(b):
    if globally_accessed.LED_state.val == "OFF":
        globally_accessed.LED_state.update("ON")
        led_cols = []
        for x in range(0, 3):
            # Uses the rand32 function from vts which returns a random 32-bit number.
            # As LEDs can have a max value of 255 this needs to be modulo (%) 256.
            led_cols.append(vts.rand32()%256)

        led_cols = led_cols*4
        vts.leds(*led_cols)

    else:
        globally_accessed.LED_state.update("OFF")
        vts.leds(*([0]*12))

# Increments the count button every time it is pressed
def count_button_cb(b):
    globally_accessed.count.update(globally_accessed.count.val + 1)

def press_cb(b):
    if b[0] == 1:
        if b[1] == 255:
            import screenshot
            screenshot.screenshot_cb(None)

# Gets all the values and shows them
def main():
    display_l = [[gui.EVT_VSYNC, vsync_cb],[gui.EVT_PRESS, press_cb]]
    display_l.extend([
        [gui.CTRL_TEXT, 30, 120, 30, 0, globally_accessed.lightsensor.disp_val],
        [gui.CTRL_TEXT, 30, 200, 30, 0, globally_accessed.frames_passed.disp_val],
        [gui.CTRL_TEXT, 30, 280, 30, 0, 'RTC TIME:'],
        [gui.CTRL_TEXT, 30, 320, 30, 0, globally_accessed.time_h.disp_val],
        [gui.CTRL_TEXT, 68, 318, 30, 0, ":"],
        [gui.CTRL_TEXT, 80, 320, 30, 0, globally_accessed.time_m.disp_val],
        [gui.CTRL_TEXT, 120, 318, 30, 0, ":"],
        [gui.CTRL_TEXT, 130, 320, 30, 0, globally_accessed.time_s.disp_val],
        [gui.CTRL_BUTTON, 430, 120, 300, 100, 29, globally_accessed.LED_state.disp_val, LED_button_cb],
        [gui.CTRL_BUTTON, 430, 280, 300, 100, 30, globally_accessed.count.disp_val, count_button_cb],
        ])
    gui.show(display_l)
    # The program runs off of callbacks from here on.

if __name__ == '__main__':
    main()