import socket
import datetime
import time

font_library = {
    'CN16':'\\FO000', # 16X16中文字体
    'CN32':'\\FO001',# 32X32中文字体
    'EN16':'\\FE000',# 8X16英文字体
    'EN32':'\\FE001',# 16X32英文字体
    'EN48':'\\FE002' # 32x48英文字体

}
string_color = {
    "UNKNOWN": '',  #
    "RED": '\\C1',  # 红色, 默认
    "GREEN": '\\C2',  # 绿色
    "YELLOW": '\\C3',  # 黄色
    "BLUE": '\\C4',  # 蓝色
    "CYAN": '\\C5',  # 青色
    "PURPLE": '\\C6',  # 紫色
    "WHITE": '\\C7'  # 白色
}
class Area:
    def __init__(self,area_index,x,y,width,height):
        self.area_index = area_index
        self.x = x
        self.y = y
        self.width = width
        self.height = height

class LedProtocol:
    def __init__(self,area_list):

        self.area_dict = {}
        for i in range(0, len(area_list)):
            self.area_dict[i] = Area(i,area_list[i][0],area_list[i][1],area_list[i][2],area_list[i][3])

    def string2bytes(self,area_index,input,en_font,cn_font):
        input = en_font+cn_font+input

        #  area_index = 0  #显示区域编号
        # width = 170  # 显示区域宽,单位像素
        # height = 64  # 显示区域高,单位像素
        # x = area_index * width + area_index  # 显示区域左上角x,单位像素
        # y = 0  # 显示区域左上角y,单位像素

        # msg = bytearray(input, encoding='utf-8')
        msg = bytearray(input, encoding='gbk')

        m_frame_head = bytearray(8)  # 帧头, 默认8个0xA5
        m_frame_head[0:8] = b'\xA5\xA5\xA5\xA5\xA5\xA5\xA5\xA5'

        m_frame_configuration = bytearray(14)  # 包头, 配置参数, 14个byte
        m_frame_configuration[0:12] = b'\xfe\xff\x00\x80\x00\x00\x00\x00\x00\x00\x63\x02'
        # m_frame_configuration 最后2个是 数据域长度,后面在写

        m_cmd_head = bytearray(7)  # 指令头, 默认7个byte
        m_cmd_head[0:7] = b'\xA3\x06\x01\x00\x00\x00\x01'

        m_area_head = bytearray(29)  # 区域头, 默认29个byte
        # m_area_head 前面2个是 区域的数据长度, 后面在写
        m_area_head[2] = 0
        t_area_x = 0x8000 + self.area_dict[area_index].x  # 区域 X 坐标,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位
        m_area_head[3] = t_area_x % 256
        m_area_head[4] = int(t_area_x / 256)
        t_area_y = self.area_dict[area_index].y  # 区域 Y 坐标,以像素点为单位
        m_area_head[5] = t_area_y % 256
        m_area_head[6] = int(t_area_y / 256)
        t_area_width = 0x8000 + self.area_dict[area_index].width  # 区域宽度,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位
        m_area_head[7] = t_area_width % 256
        m_area_head[8] = int(t_area_width / 256)
        t_area_height = self.area_dict[area_index].height  # 区域高度,以像素点为单位
        m_area_head[9] = t_area_height % 256
        m_area_head[10] = int(t_area_height / 256)
        m_area_head[11] = self.area_dict[area_index].area_index
        m_area_head[12:25] = b'\x00\x00\x02\x00\x00\x00\x00\x02\x01\x01\x00\x00\x0a'
        m_area_head[18] = 8 #居中对齐

        m_area_head[19] = 2 #多行显示
        m_area_head[20] = 1 #手动换行
        m_area_head[21] = 1 #0x01——静止显示
        if area_index == 1:
            m_area_head[21] = 3  # 0x03——向左移动
            m_area_head[23] = 6  # 运行速度
            m_area_head[24] = 4  # 停留时间
        # m_area_head后面4个是 显示字符串 的长度, 后续在写.

        # 长度整合
        t_show_string_len = len(msg)
        m_area_head[25] = t_show_string_len % 256
        m_area_head[26] = (int(t_show_string_len / 256)) % 256
        m_area_head[27] = (int(t_show_string_len / 256 / 256)) % 256
        m_area_head[28] = (int(t_show_string_len / 256 / 256 / 256)) % 256
        t_area_data_len = 29 - 2 + len(msg)
        m_area_head[0] = t_area_data_len % 256
        m_area_head[1] = int(t_area_data_len / 256)
        t_data_len = 7 + 29 + len(msg)
        m_frame_configuration[12] = t_data_len % 256
        m_frame_configuration[13] = int(t_data_len / 256)

        # crc校验码
        t_result_src = m_frame_configuration + m_cmd_head + m_area_head + msg
        crc = self.crc16(t_result_src)
        [a1, a2] = self.dec2hex(crc)
        m_frame_crc = bytearray(2)  # crc校验码, 2个byte, 包校验为包头数据和数据域的校验值
        m_frame_crc[0] = a1
        m_frame_crc[1] = a2

        p_src = t_result_src + m_frame_crc
        p_dst = bytearray(1024)
        j = 0
        for i in range(len(p_src)):
            if p_src[i] == 0xA5:
                p_dst[j] = 0xA6
                p_dst[j + 1] = 0x02
                j += 2
            elif p_src[i] == 0xA6:
                p_dst[j] = 0xA6
                p_dst[j + 1] = 0x01
                j += 2
            elif p_src[i] == 0x5A:
                p_dst[j] = 0x5B
                p_dst[j + 1] = 0x02
                j += 2
            elif p_src[i] == 0x5B:
                p_dst[j] = 0x5B
                p_dst[j + 1] = 0x01
                j += 2
            else:
                p_dst[j] = p_src[i]
                j = j + 1

        m_frame_tail = bytearray(1)
        m_frame_tail[0] = 90  # 就是0x5A

        output = m_frame_head + p_dst[0:j] + m_frame_tail
        # print('--------------------------------')
        # print(output)
        # print(len(output))
        return output

    def crc16(self, bytes):
        crc = 0
        for byte in bytes:
            crc = byte ^ crc
            for i in range(8):
                if crc & 0x01 == 1:
                    crc = (crc >> 1) ^ 0xA001
                else:
                    crc = crc >> 1
        return crc

    def dec2hex(self, num):
        a = int(num / 256)
        b = int(num % 256)
        return [b, a]


# AREA_LIST =[
#     [0,0,0,170,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
#     [1,175,0,193,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
#     [2,371,0,205,64]#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
# ]
#
# if __name__=="__main__":
#     led = LedControl("192.168.1.100",5005,AREA_LIST)
#     led.sendLedMsg(0,string_color["WHITE"]+"A1入口",font_library["EN48"],font_library["CN48"])
#     led.sendLedMsg(1,"%s空闲 可进入\\n%s限高: 2.00"%(string_color["GREEN"],string_color["BLUE"]))
#     led.sendLedMsg(2,"%s剩大车位:%d\\n%s剩小车位:%d"%(string_color["RED"],0,string_color["GREEN"],100))

# sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# sock.settimeout(1)
# sock.connect(("192.168.1.163",5005))
#
# print("connected")
#
#
# time.sleep(1)
# bytes=string2bytes(0, '楚天车库', string_color["RED"])
# sock.send(bytes)
# time.sleep(1)
# bytes=string2bytes(1, '停车入口', string_color["GREEN"])
# sock.send(bytes)
# time.sleep(1)
# bytes=string2bytes(2, '暂停服务', string_color["YELLOW"])
# sock.send(bytes)
# #bytes=string2bytes(3, '\\C1暂停\\C2服务', string_color["UNKNOWN"])
# #sock.send(bytes)
#
#
# sock.close()
# print("end")