from time import sleep
import threading
from pyjuni.robodog import *
from pyjuni.deflib import *


def shift(data, n):
    res = bytearray(8)
    for line in range(0, 8) :
        res[line] = (data[line]<<n)&0xFF
    return res

def shift_overlap(data1, data2, n):
    res = bytearray(8)
    for line in range(0, 8) :
        a = (data1[line]<<n)&0xFF
        b = (data2[line]>>(8-n))&0xFF
        res[line] = (a | b)
    return res


def shift_print(dogs, msg, msgFont):

    howMany = len(dogs)
    for n in range(len(msg)-2*howMany) : 
        for k in range(8) : 
            for p in range(howMany):
                pos = n+2*p
                right = shift_overlap(msgFont[pos], msgFont[pos+1], k)
                left = shift_overlap(msgFont[pos+1], msgFont[pos+2], k)
                dogs[p].headLEDDraw(left, right)
            sleep(0.1)

def ledPrint(dogs, msg, shift=True):
    howMany = len(dogs)
    msgFont = []

    if len(msg) <= howMany*2 :
        msg = msg + bytearray(howMany*2-len(msg))
        shift = False

    for n in range(len(msg)): 
        msgFont.append(DefLib.dotFont[msg[n]])

    if shift == True : 
        _thread = threading.Thread(target=shift_print, kwargs={"dogs": dogs, "msg": msg, "msgFont": msgFont}, daemon=True)
        _thread.start()
    else :
        for n in range(howMany):
            dogs[n].headLEDDraw(bytearray(msgFont[n*2+1]), bytearray(msgFont[n*2])) 



port_list = ["COM2", "COM3", "COM4", "COM5"]
if __name__ == "__main__":
    robodogs = RoboDogMultiOpen(port_list)
    printMsg = bytearray(b'Hello RoboDog!!')
    ledPrint(robodogs, printMsg, True)
    sleep(8)
    RoboDogMultiClose(robodogs)

