# -*- coding:utf-8 -*-
import serial
import serial.tools.list_ports
import struct
import time
import sys
import random
import threading
import datetime


###############################################################################
#文件设置
###############################################################################
writesize = 50*1024
# readsize = 0*1024
filesize = 5*1024*1024
###############################################################################
#COM设置
###############################################################################
loopbackcom = "COM21"
baudrate = 2000000
###############################################################################
#单串口回环任务
###############################################################################
def loopback_tx_thread(func):
    print("loopback thread start")
    txalllen = 0
    txdatalen = 0
    txflag = 0
    txendtime = datetime.datetime.now()
    rxalllen = 0
    rxdatalen = 0
    rxflag = 0
    rxendtime = datetime.datetime.now()
    begin = datetime.datetime.now()
    while True:
        if txflag == 0:
            if txalllen < filesize:
                loopback_send_data = loopback_send_obj.read(writesize)
                txdatalen = loopback_serial.write(loopback_send_data)
                txalllen += txdatalen
            else:
                txflag = 1
                print("loopback send end")
                break
    end = datetime.datetime.now()
    k = end - begin
    print("loopback tx time cost:", k)
    time.sleep(0.2)
    print("loopback tx thread end")

###############################################################################
#单串口回环任务
###############################################################################
def loopback_rx_thread(func):
    print("loopback thread start")
    txalllen = 0
    txdatalen = 0
    txflag = 0
    txendtime = datetime.datetime.now()
    rxalllen = 0
    rxdatalen = 0
    rxflag = 0
    rxendtime = datetime.datetime.now()
    begin = datetime.datetime.now()
    while True:
        if rxalllen < filesize:
            loopback_recv_data = loopback_serial.read(writesize)
            rxdatalen = loopback_recv_obj.write(loopback_recv_data)
            rxalllen += rxdatalen
        else:
            rxflag = 1
            print("loopback recv end")
            break
    end = datetime.datetime.now()
    k = end - begin
    print("loopback rx time cost:", k)
    time.sleep(0.2)
    print("loopback rx thread end")

###############################################################################
#创建原始文件
###############################################################################
#create usb send file
begin = datetime.datetime.now()
loopback_send_obj = open("loopback_send_file.txt", "w+")
for i in range(filesize):
    loopback_send_obj.write(str(random.randint(0, 9)))
loopback_send_obj.close()
end = datetime.datetime.now()
k = end - begin
print("file time cost:", k)

#create uart receive file
loopback_recv_obj = open("loopback_recv_file.txt", "w+")
loopback_recv_obj.close()

print("files created")

###############################################################################
#打开原始文件
###############################################################################
#open source file for read
loopback_send_obj = open("loopback_send_file.txt", "rb+")

#open target file for write
loopback_recv_obj = open("loopback_recv_file.txt", "wb+")

print("files opened")

###############################################################################
#打开USB和UART串口
#PC端serial的波特率不准确，比606稍快，在发送内容较短时可通过减小PC端波特率解决
#uart_serial = serial.Serial("COM15", 2500000 - 20000, timeout = 2)
#uart_serial = serial.Serial("COM15", 5000000 - 100000, timeout = 2)
###############################################################################
#open usb serial for read & write
loopback_serial = serial.Serial(loopbackcom, baudrate, timeout = 0)
loopback_serial.set_buffer_size(rx_size = 1024 * 1024, tx_size = 1024 * 1024)

print("serial opened")

###############################################################################
#将各任务加入线程列表
###############################################################################
#threads list
threads = []
loopback_tx_th = threading.Thread(target=loopback_tx_thread, args=("1",))
loopback_rx_th = threading.Thread(target=loopback_rx_thread, args=("2",))
threads.append(loopback_tx_th)
threads.append(loopback_rx_th)
###############################################################################
#####################################MAIN######################################
###############################################################################
if __name__ == '__main__':
    time.sleep(1)
    loopback_tx_th.setDaemon(True)
    loopback_rx_th.setDaemon(True)
    loopback_rx_th.start()
    loopback_tx_th.start()
    loopback_rx_th.join()
    loopback_tx_th.join()
    loopback_send_obj.close()
    loopback_recv_obj.close()
    loopback_serial.close()
    print("all end")
    print("")
###############################################################################
