"""
An example "program" which can be used with the lcdMenu library, see also main.py
Copyright (C) 2024  Benjamin Burkhardt <bluefox@privacynerd.de>

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.
"""


"""
@ Feature:   Fades "HELLO" over two lines in and out 
"""

import time

line1 = str(chr(0) + chr(2) + chr(1) + chr(0) + chr(4) + " " + chr(1) + " " + chr(1) + " " + chr(0) + chr(3) + chr(1))
line2 = str(chr(0) + chr(3) + chr(1) + chr(0) + chr(5) + " " + chr(6) + chr(7) + chr(6) + chr(7) + chr(0) + chr(2) + chr(1))


def right2left(lcd, line1, line2, speed=0.3):
    padding = "                "  # 16 spaces
    line2 = padding + line2 + padding
    line1 = padding + line1 + padding
    for i in range(32):
        line2 = line2[1:]
        line1 = line1[1:]
        lcd.putstr(line1[0:16] + line2[0:16])
        time.sleep(speed)


def top2bottom(lcd, line1, line2, speed=0.2):
    lcd.clear()
    time.sleep(speed)
    lcd.putstr(line2)
    time.sleep(speed)
    lcd.clear()
    lcd.putstr(line1)
    lcd.move_to(0,1)
    lcd.putstr(line2)
    time.sleep(speed)
    lcd.clear()
    lcd.move_to(0,1)
    lcd.putstr(line1)
    time.sleep(speed)
    lcd.clear()
    time.sleep(speed)

def showAll(lcd, waitAfter=0.5):
    lcd.clear()
    lcd.putstr(line1)
    lcd.move_to(0,1)
    lcd.putstr(line2)
    time.sleep(waitAfter)
    

def run(lcd):  # for the ProgramChooser as callback
    lcd.custom_char(0, bytearray([0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03]))  # right
    lcd.custom_char(1, bytearray([0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18]))  # left
    lcd.custom_char(2, bytearray([0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F]))  # 2-down
    lcd.custom_char(3, bytearray([0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00]))  # 2-up
    lcd.custom_char(4, bytearray([0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x1F]))  # e-up
    lcd.custom_char(5, bytearray([0x1F,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F]))  # e-down
    lcd.custom_char(6, bytearray([0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x1F]))  # l-down
    lcd.custom_char(7, bytearray([0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18]))  # l-right
    right2left(lcd, line1, line2, 0.2)
    top2bottom(lcd, line1, line2, 0.2)
    showAll(lcd)


if __name__ == "__main__":
    from utils import Config
    cfg = Config()
    run(cfg.LCD)  # run once