# tstat.py nanogui demo for the Tstat class

# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2021 Peter Hinch

# Usage:
# import gui.demos.tstat

# hardware_setup must be imported before other modules because of RAM use.
import hardware_setup  # Create a display instance
from gui.core.ugui import Screen, ssd

from gui.widgets import Button, CloseButton, Slider, Label, Meter, Region, LED
from gui.core.writer import CWriter

# Font for CWriter
import gui.fonts.arial10 as arial10
from gui.core.colors import *


class BaseScreen(Screen):

    def __init__(self):
        def btncb(btn, reg, low, high):  # Button callbck
            reg.adjust(low, high)

        def delete_alarm(btn, ts, reg):
            ts.del_region(reg)

        super().__init__()
        wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False)
        col = 2
        row = 10
        sl = Slider(wri, row, col, callback=self.slider_cb,
               bdcolor=RED, slotcolor=BLUE,
               legends=('0.0', '0.5', '1.0'))
        self.ts = Meter(wri, row, sl.mcol + 5, ptcolor=YELLOW, height=100, width=15,
                        style=Meter.BAR, legends=('0.0', '0.5', '1.0'))
        reg = Region(self.ts, 0.4, 0.55, MAGENTA, self.ts_cb)
        al = Region(self.ts, 0.9, 1.0, RED, self.al_cb)
        col = self.ts.mcol + 5
        self.lbl = Label(wri, row, col, 35, bdcolor=RED, bgcolor=BLACK)
        self.alm = LED(wri, self.lbl.mrow + 5, col, height=20, color=RED, bdcolor=BLACK)
        self.led = LED(wri, self.alm.mrow + 5, col, height=20, color=YELLOW, bdcolor=BLACK)
        self.grn = LED(wri, self.led.mrow + 5, col, height=20, color=GREEN, bdcolor=BLACK)
        col = self.lbl.mcol + 5
        btn = Button(wri, row + 30, col, width=0,
                     text='down', litcolor=RED,
                     callback=btncb, args=(reg, 0.2, 0.3))
        btn1 = Button(wri, btn.mrow + 5, col, width=btn.width,
               text='up', litcolor=RED,
               callback=btncb, args=(reg, 0.5, 0.6))
        Button(wri, btn1.mrow + 5, col, width=btn.width,
               text='del', litcolor=RED,
               callback=delete_alarm, args=(self.ts, al))
        CloseButton(wri)

    def after_open(self):
        self.ts.value(0)  # Trigger callback

    def slider_cb(self, s):
        if hasattr(self, 'lbl'):
            v = s()
            self.lbl('{:5.3f}'.format(v))
            self.ts(v)

    def ts_cb(self, reg, reason):
        # Hysteresis
        if reason == reg.EX_WA_IB or reason == reg.T_IB:
            self.led(False)
            self.grn(True)
        elif reason == reg.EX_WB_IA or reason == reg.T_IA:
            self.led(True)
            self.grn(False)

    def al_cb(self, reg, reason):
        if reason == reg.EN_WB or reason == reg.T_IA:  # Logical OR
            self.alm(True)
        elif reason & (reg.EX_WB_IB | reg.EX_WA_IB | reg.T_IB):  # Bitwise OR alternative
            self.alm(False)

def test():
    if ssd.height < 128 or ssd.width < 128:
        print(' This test requires a display of at least 128x128 pixels.')
    else:
        print('Tstat demo.')
        Screen.change(BaseScreen)

test()
