import os
import csv
import pandas as pd
import traceback
from openpyxl import Workbook


def OpenTxtFile(FileName: str) -> str:
    # 打开文件并读取内容
    with open(FileName, 'r', encoding='utf-8') as file:
        content = file.read()  # 读取整个文件内容
        return content


# 逐行读取并处理文件内容
def savexls(filename, dict1: dict):
    # 创建一个DataFrame对象
    df = pd.DataFrame({
        'MOSI': dict1["MOSI"],
        'MISO': dict1["MISO"]
    })

    # 将DataFrame保存为Excel文件
    # df.to_excel(filename,"sheet1", index=False)
    '''
    df1 = pd.DataFrame({
        'SPI': dict1["SPI"]
    })
    df1.to_excel(filename, "sheet2", index=False)
    '''

    # 创建一个新的工作簿
    wb = Workbook()
    ws = wb.active  # 获取活动工作表

    # 初始化行号
    row_num = 1
    col_num = 1
    # 遍历字符串列表
    for s in dict1["SPI"]:
        # 在当前行的第一列写入字符串
        ws.cell(row=row_num, column=col_num, value=s)
        col_num += 1
        if s == "":
            # 增加行号，即使字符串为空也增加
            row_num += 1
            col_num = 1

    # 保存工作簿到文件
    wb.save(filename)

    print('')


def ProcessTxt(FileName: str):
    listMISO = []
    listMOSI = []
    with open(FileName, 'r', encoding='utf-8') as file:
        for line in file:
            data = ''
            pin_MISO = ''
            pin_MOSI = ''
            strFieldName = ''
            strFieldValue = ''
            # 去除行尾的换行符，并打印每一行
            strs = line.partition(':')
            if len(strs) > 2:
                data = strs[2]

                pins = data.partition(':')
                if len(pins) > 2:
                    if pins[0].__contains__('MISO data'):
                        strFieldValue = pins[2]
                        strFieldName = 'MISO'
                        listMISO.append(strFieldValue)
                    if pins[0].__contains__('MOSI data'):
                        strFieldValue = pins[2]
                        strFieldName = 'MOSI'
                        listMOSI.append(strFieldValue)
                    '''
                    if pins[0].__contains__('MOSI bits'):
                        strFieldValue = pins[2]
                        strFieldName = 'MOSI'
                    if pins[0].__contains__('MISO bits'):
                        strFieldValue = pins[2]
                        strFieldName = 'MISO'
                    '''
                #
            #
        #

        # 假设这是你的原始文件名和路径
        dict1 = {"MOSI": listMOSI, "MISO": listMISO}
        processSPIInfo(dict1)
        SaveXlsx(FileName, dict1)


def processSPIInfo(dict1: dict):
    listSPIInfo = []
    nListLen = 0
    nLists = list(dict1.values())
    TxList = dict1["MOSI"]
    # 求TxList的数据类型
    txtype = type(TxList)
    # 求TxList的数据长度
    nListLen = len(TxList)
    i = 0
    while i < nListLen:
        regAddr = int(nLists[0][i], 16)
        i += 1
        if(regAddr == 0x7):
            listSPIInfo.append("")
        listSPIInfo.append(f"{regAddr:03d}")
        listSPIInfo.append(f"{regAddr:02X}")
        if (regAddr < 0x80):  #写入
            if regAddr == 0x32:  #FIFO
                len1 = int(nLists[0][i], 16)
                listSPIInfo.append(f"{len1:02X}")
                i += 1
                while len1 > 0:
                    regv = int(nLists[0][i], 16)
                    listSPIInfo.append(f"{regv:02X}")
                    i += 1
                    len1 -= 1
            else:  # 写FIFO
                regH = int(nLists[0][i], 16)
                i += 1
                regL = int(nLists[0][i], 16)
                i += 1
                listSPIInfo.append(f"{regH:02X}")
                listSPIInfo.append(f"{regL:02X}")
        else:
            if regAddr == (0x32 + 0x80):  #FIFO
                len1 = int(nLists[1][i], 16)  #len
                listSPIInfo.append(f"{len1:02X}")
                i += 1
                while len1 > 0:
                    regv = int(nLists[1][i], 16)
                    listSPIInfo.append(f"{regv:02X}")
                    i += 1
                    len1 -= 1
            else:  # 写FIFO
                regH = int(nLists[1][i], 16)
                i += 1
                regL = int(nLists[1][i], 16)
                i += 1
                listSPIInfo.append(f"{regH:02X}")
                listSPIInfo.append(f"{regL:02X}")

        listSPIInfo.append("")
    dict1["SPI"] = listSPIInfo
    pass


def SaveXlsx(FileName: str, dict1):
    # 分离文件名和扩展名
    base_name, extension = os.path.splitext(FileName)
    # 新的扩展名
    new_extension = '.xlsx'
    # 组合新的文件名（不需要os.path.join()，因为只是简单拼接）
    new_file_path = base_name + new_extension
    savexls(new_file_path, dict1)


if __name__ == "__main__":
    try:
        # 这里放可能会抛出异常的代码
        ProcessTxt('444.txt')
    except Exception as e:  # 可以使用更通用的 Exception 来捕获所有异常
        # 这里处理异常，并显示异常的完整堆栈跟踪
        print("捕获到异常:", e)
        traceback.print_exc()  # 这将打印出异常的完整堆栈跟踪，包括异常的原因

    # 使用print函数来输出文本
