From 799590bc1dd9b9faee90d554f54d6ad46e8b8ddd Mon Sep 17 00:00:00 2001 From: lumos Date: Thu, 17 Jul 2025 17:54:51 +0800 Subject: [PATCH] Init --- .gitignore | 1 + SP713.pro | 48 + apps/crc16/crc.cpp | 42 + apps/crc16/crc.h | 10 + apps/icd/app_icd.cpp | 315 +++++ apps/icd/app_icd.h | 142 ++ drivers/log/logHandler.cpp | 56 + drivers/log/logHandler.h | 31 + drivers/spi/drv_spi.cpp | 102 ++ drivers/spi/drv_spi.h | 72 + drivers/uart/drv_uart.cpp | 155 +++ drivers/uart/drv_uart.h | 75 + libs/CH347DLL.H | 645 +++++++++ libs/CH347DLLA64.LIB | Bin 0 -> 29644 bytes libs/CH347Handler.dll | Bin 0 -> 262656 bytes libs/CH347Handler.lib | Bin 0 -> 4248 bytes libs/Common.h | 37 + libs/SpiApi.h | 46 + main.cpp | 11 + mainwindow.cpp | 422 ++++++ mainwindow.h | 78 ++ mainwindow.ui | 1204 +++++++++++++++++ sp713.ico | Bin 0 -> 312065 bytes .../Vse_psi_-13.00_theta_13.53_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_-14.00_theta_13.53_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_-15.00_theta_13.53_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_-16.00_theta_13.52_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_0.00_theta_13.52_opa_1.txt | 0 .../Vse_psi_11.00_theta_13.52_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_16.00_theta_13.53_opa_1.txt | 1024 ++++++++++++++ .../Vse_psi_5.00_theta_13.53_opa_1.txt | 1024 ++++++++++++++ ...Vse_psi_水平角度_theta_垂直角度_opa_opa标号.txt | 0 32 files changed, 10660 insertions(+) create mode 100644 .gitignore create mode 100755 SP713.pro create mode 100755 apps/crc16/crc.cpp create mode 100755 apps/crc16/crc.h create mode 100755 apps/icd/app_icd.cpp create mode 100755 apps/icd/app_icd.h create mode 100755 drivers/log/logHandler.cpp create mode 100755 drivers/log/logHandler.h create mode 100755 drivers/spi/drv_spi.cpp create mode 100755 drivers/spi/drv_spi.h create mode 100755 drivers/uart/drv_uart.cpp create mode 100755 drivers/uart/drv_uart.h create mode 100755 libs/CH347DLL.H create mode 100755 libs/CH347DLLA64.LIB create mode 100755 libs/CH347Handler.dll create mode 100755 libs/CH347Handler.lib create mode 100755 libs/Common.h create mode 100755 libs/SpiApi.h create mode 100755 main.cpp create mode 100755 mainwindow.cpp create mode 100755 mainwindow.h create mode 100755 mainwindow.ui create mode 100755 sp713.ico create mode 100755 voltage_file/Vse_psi_-13.00_theta_13.53_opa_1.txt create mode 100755 voltage_file/Vse_psi_-14.00_theta_13.53_opa_1.txt create mode 100755 voltage_file/Vse_psi_-15.00_theta_13.53_opa_1.txt create mode 100755 voltage_file/Vse_psi_-16.00_theta_13.52_opa_1.txt create mode 100755 voltage_file/Vse_psi_0.00_theta_13.52_opa_1.txt create mode 100755 voltage_file/Vse_psi_11.00_theta_13.52_opa_1.txt create mode 100755 voltage_file/Vse_psi_16.00_theta_13.53_opa_1.txt create mode 100755 voltage_file/Vse_psi_5.00_theta_13.53_opa_1.txt create mode 100755 voltage_file/命名规范:Vse_psi_水平角度_theta_垂直角度_opa_opa标号.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c795b05 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/SP713.pro b/SP713.pro new file mode 100755 index 0000000..214bebd --- /dev/null +++ b/SP713.pro @@ -0,0 +1,48 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +RC_ICONS = sp713.ico + +SOURCES += \ + apps/crc16/crc.cpp \ + apps/icd/app_icd.cpp \ + drivers/log/logHandler.cpp \ + drivers/spi/drv_spi.cpp \ + drivers/uart/drv_uart.cpp \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + apps/crc16/crc.h \ + apps/icd/app_icd.h \ + drivers/log/logHandler.h \ + drivers/spi/drv_spi.h \ + drivers/uart/drv_uart.h \ + libs/CH347DLL.H \ + libs/Common.h \ + libs/SpiApi.h \ + mainwindow.h + +FORMS += \ + mainwindow.ui + +#add libs +LIBS += -L$$PWD/libs -lCH347DLLA64 +INCLUDEPATH += $$PWD/libs +win32:LIBS += $$PWD/libs/CH347DLLA64.LIB + +LIBS += -L$$PWD/libs -lCH347Handler +INCLUDEPATH += $$PWD/libs +win32:LIBS += $$PWD/libs/CH347Handler.lib + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/apps/crc16/crc.cpp b/apps/crc16/crc.cpp new file mode 100755 index 0000000..4a595e9 --- /dev/null +++ b/apps/crc16/crc.cpp @@ -0,0 +1,42 @@ +#include "crc.h" + +// 函数声明 +// void generate_crc16_reverse_table(quint16 *table); +// QByteArray crc16Reverse(const QByteArray& data); + +static void generate_crc16_reverse_table(quint16 table[256], quint16 poly = 0x8408) +{ + for (int i = 0; i < 256; ++i) { + quint16 crc = static_cast(i); + for (int j = 0; j < 8; ++j) { + if (crc & 0x0001) + crc = (crc >> 1) ^ poly; + else + crc >>= 1; + } + table[i] = crc; + } +} + +// 计算反射型CRC16-CCITT +QByteArray crc16Reverse(const QByteArray& data) +{ + static quint16 table[256]; + static bool tableInited = false; + if (!tableInited) { + generate_crc16_reverse_table(table); + tableInited = true; + } + + quint16 crc = 0x6363; + for (auto b : data) + crc = (crc >> 8) ^ table[(crc ^ static_cast(b)) & 0xFF]; + + QByteArray result; + // 经过和python程序对比,说明CRC16的两个byte位置需调换 + // result.append(static_cast((crc >> 8) & 0xFF)); + // result.append(static_cast(crc & 0xFF)); + result.append(static_cast(crc & 0xFF)); + result.append(static_cast((crc >> 8) & 0xFF)); + return result; +} diff --git a/apps/crc16/crc.h b/apps/crc16/crc.h new file mode 100755 index 0000000..6d37821 --- /dev/null +++ b/apps/crc16/crc.h @@ -0,0 +1,10 @@ +#ifndef CRC_H +#define CRC_H + +#include + +// 直接计算反射型CRC16-CCITT,输出低字节在前的QByteArray +QByteArray crc16Reverse(const QByteArray& data); +// void generate_crc16_reverse_table(quint16 table[256]); + +#endif // CRC_H diff --git a/apps/icd/app_icd.cpp b/apps/icd/app_icd.cpp new file mode 100755 index 0000000..3ccbd61 --- /dev/null +++ b/apps/icd/app_icd.cpp @@ -0,0 +1,315 @@ +#include "app_icd.h" +#include // 用于调试输出 +#include "apps/crc16/crc.h" +#include +#include + +APP_Icd::APP_Icd(QObject *parent) : QObject(parent) +{ + // 创建驱动实例 + this->m_spiDriver = new DRV_Spi(this); + this->m_uartDriver = new DRV_Uart(this); + // 初始化协议帧相关参数的大小 + this->ICD_ctrlPara.resize(11); + this->ICD_volValuePara.resize(320); + this->ICD_allData.resize(340); + // 初始化协议帧相关参数的初值 + this->ICD_allData.fill(0x00); + this->ICD_ctrlPara.fill(0x00); + this->ICD_volValuePara.fill(0x00); + // 设置包头 + this->ICD_allData[0] = 0x9F; + this->ICD_allData[1] = 0xE4; +} + +APP_Icd::~APP_Icd() +{ + +} + +bool APP_Icd::ICD_init() +{ + if(!ICD_initSpi()) { + qWarning() << "SPI initialization failed"; + return false; + } + + if(!ICD_initUart()) { + qWarning() << "UART initialization failed"; + return false; + } + + return true; +} + +bool APP_Icd::ICD_initSpi() +{ + // 这里添加SPI初始化逻辑 + return true; +} + +bool APP_Icd::ICD_initUart() +{ + // //枚举当前的uart设备号 + // this->m_uartDriver->Uart_enumDevice(); + return true; +} + +/** + * @brief 计算QByteArray的累加和校验 + * @param data 输入数据 + * @param endPos 截止位置(-1表示计算到末尾) + * @return 累加和(溢出自动截断为8位) + */ +quint8 APP_Icd::ICD_calcChecksum(const QByteArray &data, int endPos) +{ + quint8 sum = 0; + if (data.isEmpty()) return sum; + + // 计算有效长度 + int length = (endPos < 0 || endPos >= data.size()) ? + data.size() : endPos + 1; + + // 累加计算 + for (int i = 0; i < length; ++i) { + sum += static_cast(data.at(i)); // 自动处理溢出 + } + + return sum; +} + +// 电压命令编码 +bool APP_Icd::ICD_volCMDProtoEncode(uint8_t CMD, uint8_t group, uint8_t subGroup) +{ + //判断值是否超出范围 + if((CMD > 0x03) || (group > 0xAA) || (subGroup > 0xAA)) + return false; + + // 设置控制字参数 + this->ICD_ctrlPara[0] = group; + this->ICD_ctrlPara[1] = subGroup; + + // 调用主协议编码函数 + return this->ICD_sumProtoEncode(CMD, this->ICD_ctrlPara); +} + +// 写寄存器命令编码 +bool APP_Icd::ICD_regWCMDProtoEncode(uint8_t dacID, uint8_t dacCH, uint8_t funcEN, uint8_t adcCurrConfig) +{ + //判断值是否超出范围 + // if((funcEN > 0x0F)) + // return false; + + // 填充默认值0 + this->ICD_ctrlPara.fill(0x00); + + // 设置控制字参数 + this->ICD_ctrlPara[0] = dacID; + this->ICD_ctrlPara[1] = dacCH; + this->ICD_ctrlPara[2] = funcEN; + this->ICD_ctrlPara[3] = adcCurrConfig; + + // 调用主协议编码函数 + return this->ICD_sumProtoEncode(SP_CMD_REG_WR, this->ICD_ctrlPara); +} + +// 写寄存器命令编码 +bool APP_Icd::ICD_regRCMDProtoEncode(uint8_t dacID) +{ + //判断值是否超出范围 + if((dacID > 0x14)) + return false; + + // 填充默认值0 + this->ICD_ctrlPara.fill(0x00); + + // 设置控制字参数 + this->ICD_ctrlPara[0] = dacID; + + // 调用主协议编码函数 + return this->ICD_sumProtoEncode(SP_CMD_REG_RD, this->ICD_ctrlPara); +} + +bool APP_Icd::ICD_sumProtoEncode(uint8_t CMD, const QByteArray &ctrl_data) +{ +// this->ICD_allData.resize(338); + // 设置控制字指令 + this->ICD_allData[2] = CMD; + // 将控制字参数添加到主协议帧上 + this->ICD_allData.replace(3, ctrl_data.size(), ctrl_data); + // 设置帧计数 + this->ICD_allData[14] = this->ICD_allData[14] + 1; + // 设置校验和 + this->ICD_allData[15] = this->ICD_calcChecksum(this->ICD_allData, 14); + // 设置电压类型:同值为0x01,异值为0x02 + if((CMD == SP_CMD_SAME_VALUE) || (CMD == SP_CMD_DIF_VALUE)){ + this->ICD_allData[16] = CMD - 1; + }else{ + this->ICD_allData[16] = 0; + } + // 将256个10bit数据转化为320个字节的数据 + this->ICD_pack10BitData(this->DAC256_10bit_data); + // 将电压参数赋值到allData中 + this->ICD_allData.replace(17, ICD_volValuePara.size(), ICD_volValuePara); + // 计算320个字节的CRC16校验和 + QByteArray crc16Result = crc16Reverse(this->ICD_volValuePara); + // 将CRC16校验和添加到ICD_allData中 + this->ICD_allData.replace(337, crc16Result.size(), crc16Result); + // 设置校验和 + this->ICD_allData[339] = this->ICD_calcChecksum(this->ICD_allData, 338); + // 调用串口/SPI发送函数 + if(this->m_uartDriver->m_DRV_Uart_Infors.devIsOpened){ + // 串口发送数据 + this->m_uartDriver->Uart_Write(this->ICD_allData); + // 记录数据 + this->ICD_addContextToDataRecordingFile(true, this->ICD_allData); + } + + return true; +} + +// 设置DAC256 10Bit参数 +bool APP_Icd::ICD_setDAC256Data10bit(int row, int col, int value) +{ + if((row > 15) || (col > 15) || (value > 1023)) + return false; + this->DAC256_10bit_data[row][col] = value; + return true; +} + +// 将256个10bit的数据转化为320个8bit数据 +QByteArray APP_Icd::ICD_pack10BitData(int data[16][16]) { + + quint32 bitBuffer = 0; // 32位缓冲区 + int bitsInBuffer = 0; // 缓冲区中当前位数 + + this->ICD_volValuePara.clear(); + + for (int row = 0; row < 16; ++row) { + for (int col = 0; col < 16; ++col) { + // 确保数据是10位 (0-1023) + quint32 value = static_cast(data[row][col]) & 0x3FF; + + // 将10位值添加到缓冲区 + bitBuffer = (bitBuffer << 10) | value; + bitsInBuffer += 10; + + // 每当缓冲区有至少8位时,提取一个字节 + while (bitsInBuffer >= 8) { + bitsInBuffer -= 8; + quint8 byte = static_cast((bitBuffer >> bitsInBuffer) & 0xFF); + this->ICD_volValuePara.append(byte); + } + } + } + + // 处理缓冲区中剩余的位(如果有) + if (bitsInBuffer > 0) { + quint8 lastByte = static_cast((bitBuffer << (8 - bitsInBuffer)) & 0xFF); + this->ICD_volValuePara.append(lastByte); + } + + // 确保输出正好是320字节(不足补零) + while (this->ICD_volValuePara.size() < 320) { + this->ICD_volValuePara.append('\0'); + } + + return this->ICD_volValuePara; +} + +// 创建数据记录文件 +bool APP_Icd::ICD_newDataRecordingFile(void) +{ + // 生成带时间戳的文件名 + QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"); + QString fileName = QString("%1_%2.txt").arg("SP713_UART_SPI_Data_Recording").arg(timestamp); + + // 创建文件并检查是否成功 + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + return false; + } + // 关闭文件 + file.close(); + // 设置数据记录文件名 + this->dataRecordingFile = fileName; + return true; +} + +// 添加记录至txt文件 +bool APP_Icd::ICD_addContextToDataRecordingFile(bool isWrite, QByteArray &Data) +{ + if (this->dataRecordingFile.isEmpty()) + { + return false; + } + + // 打开文件(追加模式) + QFile file(this->dataRecordingFile); + if (!file.open(QIODevice::Append | QIODevice::Text)) + { + return false; + } + + QTextStream out(&file); + + // 写入时间戳和特定字符串 + QString timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); + if(isWrite){ + out << timestamp << " tx data: "; // 时间戳和特定字符串 + }else{ + out << timestamp << " rx data: "; // 时间戳和特定字符串 + } + + // 将QByteArray转换为16进制字符串,用空格分隔 + QString hexData = Data.toHex(' ').toUpper(); + out << hexData << "\n"; // 写入16进制数据并换行 + + file.close(); + return true; +} + +// 解析函数 +ParsedData APP_Icd::ICD_parseRegisterData(const QByteArray &revData) { + ParsedData result = {}; + + // 检查数据长度 (至少需要7个字节: REG7-REG1) + if(revData.size() < 7) { + qWarning() << "Invalid data length, expected at least 7 bytes"; + return result; + } + + // 从REG7到REG1解析 (数据顺序是REG7在前) + const uchar *data = reinterpret_cast(revData.constData()); + + // REG2 (索引5,因为数据顺序是REG7(0),REG6(1),...,REG1(6)) + result.EN_TADC = (data[5] >> 7) & 0x01; + result.N_CLKDIV18 = ((data[5] >> 5) & 0x03); // 取B6和B5 + result.VCON = ((data[5] >> 2) & 0x03); // 取B4和B3 + result.CH_TEST = ((data[5] >> 1) & 0x01) << 8; // CH_TEST[8] + result.FBK_EN = (data[5]) & 0x01; + + // REG3 (索引4) + result.TEMPTEST_EN = (data[4] >> 7) & 0x01; + result.TRIG_TADC = (data[4] >> 6) & 0x01; + result.TEST_TADC = (data[4] >> 5) & 0x01; + result.ICON18 = (data[4]) & 0x0F; // 取B4-B1 + + // REG4 (索引3) + result.CH_TEST |= data[3]; // CH_TEST[7:0] + + // REG5 (索引2) + result.ADC_OUT = data[2]; // ADC_OUT[7:0] + + // REG6 (索引1) + result.EOC = (data[1] >> 7) & 0x01; + result.ADC_OUT |= ((data[1] & 0x03) << 8); // ADC_OUT[9:8] + + result.D_FB = ((data[1] >> 2) & 0x03); // D_FB[9:8] + + // REG7 (索引0) + result.D_FB = (result.D_FB << 8) | data[0]; // D_FB[7:0] + + return result; +} diff --git a/apps/icd/app_icd.h b/apps/icd/app_icd.h new file mode 100755 index 0000000..4cfce15 --- /dev/null +++ b/apps/icd/app_icd.h @@ -0,0 +1,142 @@ +#ifndef _APP_ICD_H__ +#define _APP_ICD_H__ + +#include +#include +#include +#include + +#include "drivers/spi/drv_spi.h" +#include "drivers/uart/drv_uart.h" + +// typedef struct _USB_DEVICE_DESCRIPTOR { +// UCHAR bLength; +// UCHAR bDescriptorType; +// USHORT bcdUSB; +// UCHAR bDeviceClass; +// UCHAR bDeviceSubClass; +// UCHAR bDeviceProtocol; +// UCHAR bMaxPacketSize0; +// USHORT idVendor; +// USHORT idProduct; +// USHORT bcdDevice; +// UCHAR iManufacturer; +// UCHAR iProduct; +// UCHAR iSerialNumber; +// UCHAR bNumConfigurations; +// } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +// typedef struct _DRV_SPI_INFO +// { +// CHAR bDeviceName[256]; //设备名称 +// mDeviceInforS SpiI2cDevInfor[16]; //spiI2c设备信息 +// ULONG ulDevCnt; //设备数量 +// BOOL devIsOpened; //设备开启标志位 +// ULONG opendDevIndex; //当前设备索引号 +// }mDRV_Spi_Infors; + +// 使用结构体存储更复杂的数据 +// struct ComboBoxSubGroupItem { +// QString displayText; +// int value; +// }; + +// 解析结果结构体 +struct ParsedData { + quint8 EN_TADC; + quint8 N_CLKDIV18; // 2位组合值 + quint8 VCON; // 2位组合值 + quint16 CH_TEST; // 9位组合值 (CH_TEST[8:0]) + quint8 FBK_EN; + quint8 TEMPTEST_EN; + quint8 TRIG_TADC; + quint8 TEST_TADC; + quint8 ICON18; // 4位组合值 + quint16 ADC_OUT; // 10位组合值 (ADC_OUT[9:0]) + quint8 EOC; + quint16 D_FB; // 10位组合值 (D_FB[9:0]) +}; + +// 命令枚举值 +enum { + SP_CMD_NA = 0x00, // 无效命令 + SP_CMD_ZERO = 0x01, // 参数归零命令 + SP_CMD_SAME_VALUE = 0x02, // 同值配置命令 + SP_CMD_DIF_VALUE = 0x03, // 异值配置命令 + SP_CMD_REG_WR = 0x04, // 寄存器配置命令 + SP_CMD_REG_RD = 0x05, // 寄存器读取命令 +}; + +class APP_Icd : public QObject +{ + Q_OBJECT // 如果需要使用QT的信号槽机制 + +public: + /** + * @brief 构造函数 + * @param parent 父对象指针 + */ + explicit APP_Icd(QObject *parent = nullptr); + + /** + * @brief 析构函数 + */ + virtual ~APP_Icd(); + + /*************函数定义*************/ + bool ICD_init(); // ICD初始化 + bool ICD_setDAC256Data10bit(int row, int col, int value); // 设置DAC256 10bit数组的值大小 + bool ICD_volCMDProtoEncode(uint8_t CMD, uint8_t group, uint8_t subGroup); + quint8 ICD_calcChecksum(const QByteArray &data, int endPos); + bool ICD_sumProtoEncode(uint8_t CMD, const QByteArray &ctrl_data); + QByteArray ICD_pack10BitData(int data[16][16]); + bool ICD_regWCMDProtoEncode(uint8_t dacID, uint8_t dacCH, uint8_t funcEN, uint8_t adcCurrConfig); + bool ICD_regRCMDProtoEncode(uint8_t dacID); + bool ICD_newDataRecordingFile(void); + bool ICD_addContextToDataRecordingFile(bool isWrite, QByteArray &Data); + ParsedData ICD_parseRegisterData(const QByteArray &revData); + + /*************变量定义*************/ + // mDRV_Spi_Infors m_DRV_Spi_Infors; //Spi驱动相关信息 + DRV_Spi *m_spiDriver; // SPI驱动实例 + DRV_Uart *m_uartDriver; // UART驱动实例 + + // 定义子分组的所有名称数据集 + QMap comboBox_subGroupInfo = { + {0, {"所有DAC"}}, // 对应选项1 + {1, {"A分组所有DAC", "B分组所有DAC"}}, // 对应选项2 + {2, {"OPA分组0", "OPA分组1", "OPA分组2", "OPA分组3", "OPA分组4"}}, // 对应选项3 + {3, {"编号1", "编号2", "编号3", "编号4", "编号5", // 对应选项3 + "编号6", "编号7", "编号8", "编号9", "编号10", + "编号11", "编号12", "编号13", "编号14", "编号15", + "编号16", "编号17", "编号18", "编号19", "编号20" + } + } + }; + // 256个10bit数据 + int DAC256_10bit_data[16][16] = {{0}}; + // 控制字参数 + QByteArray ICD_ctrlPara; + // 电压值参数 + QByteArray ICD_volValuePara; + // 整体帧 + QByteArray ICD_allData; + QString dataRecordingFile; + +signals: + // 可以添加DAC特定的信号 + // void outputChanged(int channel, double value); + +private: + // 私有成员变量 + // double m_currentValues[]; // 当前各通道输出值(假设有多个通道) + + // 私有方法 + bool ICD_initSpi(); + bool ICD_initUart(); + + // 私有方法 + +}; + +#endif diff --git a/drivers/log/logHandler.cpp b/drivers/log/logHandler.cpp new file mode 100755 index 0000000..9455a08 --- /dev/null +++ b/drivers/log/logHandler.cpp @@ -0,0 +1,56 @@ +#include "LogHandler.h" +#include +#include +#include + +// 初始化静态成员 +LogHandler* LogHandler::s_instance = nullptr; +QMutex LogHandler::s_mutex; + +LogHandler::LogHandler(QObject *parent) : QObject(parent), m_logWidget(nullptr) { + +} + +// 获取单例实例(线程安全) +LogHandler* LogHandler::log_instance() { + if (!s_instance) { + QMutexLocker locker(&s_mutex); + if (!s_instance) { + s_instance = new LogHandler(); + } + } + return s_instance; +} + +// 初始化日志输出目标 +void LogHandler::log_init(QPlainTextEdit *logWidget) { + LogHandler *handler = log_instance(); + handler->m_logWidget = logWidget; + qInstallMessageHandler(log_handleMessage); // 注册消息处理器 +} + +// 静态消息处理函数 +void LogHandler::log_handleMessage(QtMsgType type, const QMessageLogContext &, const QString &msg) { + LogHandler *handler = log_instance(); + if (!handler) return; + + // 格式化日志消息(添加时间和日志级别) + QString timestamp = QDateTime::currentDateTime().toString("[hh:mm:ss.zzz] "); + QString level; + switch (type) { + case QtDebugMsg: level = "DEBUG"; break; + case QtInfoMsg: level = "INFO"; break; + case QtWarningMsg: level = "WARN"; break; + case QtCriticalMsg: level = "ERROR"; break; + case QtFatalMsg: level = "FATAL"; break; + } + QString formattedMsg = QString("%1[%2] %3").arg(timestamp, level, msg); + + // 如果有UI组件,通过信号槽更新(线程安全) + if (handler->m_logWidget) { + emit handler->log_messageLogged(formattedMsg); + } else { + // 无UI时输出到控制台 + std::cerr << formattedMsg.toStdString() << std::endl; + } +} diff --git a/drivers/log/logHandler.h b/drivers/log/logHandler.h new file mode 100755 index 0000000..30cf0d8 --- /dev/null +++ b/drivers/log/logHandler.h @@ -0,0 +1,31 @@ +#ifndef __LOG_HANDLER_H__ +#define __LOG_HANDLER_H__ + +#include +#include +#include + +class LogHandler : public QObject { + Q_OBJECT +public: + // 获取单例实例 + static LogHandler* log_instance(); + + // 初始化日志输出目标(UI控件) + static void log_init(QPlainTextEdit *logWidget = nullptr); + + // Qt 消息处理函数(静态) + static void log_handleMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg); + +signals: + // 日志信号(用于跨线程传递) + void log_messageLogged(const QString &formattedMsg); + +private: + explicit LogHandler(QObject *parent = nullptr); + static LogHandler *s_instance; // 单例实例 + static QMutex s_mutex; // 线程安全锁 + QPlainTextEdit *m_logWidget; // 日志输出UI组件 +}; + +#endif diff --git a/drivers/spi/drv_spi.cpp b/drivers/spi/drv_spi.cpp new file mode 100755 index 0000000..9d31ef0 --- /dev/null +++ b/drivers/spi/drv_spi.cpp @@ -0,0 +1,102 @@ +#include "drv_spi.h" +#include // 用于调试输出 + +DRV_Spi::DRV_Spi(QObject *parent) + : QObject(parent) // 假设有8个通道 +{ + +} + +DRV_Spi::~DRV_Spi() +{ + +} + +//枚举当前的所有SPI设备:返回搜索到的设备数目 +ULONG DRV_Spi::spi_enumDevice() +{ + ULONG i; + + mDeviceInforS DevInfor = {0}; + + UCHAR iDriverVer = 0; + UCHAR iDLLVer = 0; + UCHAR ibcdDevice = 0; + UCHAR iChipType = 0; + + // 当前设备数目清零 + this->m_DRV_Spi_Infors.ulDevCnt = 0; + + // 依次搜索设备 + for(i=0;i<16;i++) + { + // 打开设备 + if(CH347OpenDevice(i) != INVALID_HANDLE_VALUE) + { + // 获取设备信息 + CH347GetDeviceInfor(i,&DevInfor); + // 输出设备信息 + DbgPrint("Manufacturer:%s Product:%s.", DevInfor.ManufacturerString, DevInfor.ProductString); + + if(DevInfor.ChipMode == 3) //模式3此接口为JTAG/I2C + continue; + // 格式化设备名称 + sprintf(this->m_DRV_Spi_Infors.bDeviceName, "%d# %s",i,DevInfor.FuncDescStr); + // 输出设备名称 + DbgPrint("Dev Name:%s.", this->m_DRV_Spi_Infors.bDeviceName); + // copy设备信息至SpiI2cDevInfor结构体 + memcpy(&this->m_DRV_Spi_Infors.SpiI2cDevInfor[this->m_DRV_Spi_Infors.ulDevCnt], &DevInfor,sizeof(DevInfor)); + // 设备数量自增 + this->m_DRV_Spi_Infors.ulDevCnt++; + // 获取版本号 + CH347GetVersion(i, &iDriverVer, &iDLLVer, &ibcdDevice, &iChipType); + // 输出版本号 + DbgPrint("Version: DV:%02x DLLV:%02x BCD:%02x CT:%02x.", iDriverVer, iDLLVer, ibcdDevice, iChipType); + } + // 关闭设备 + CH347CloseDevice(i); + } + return this->m_DRV_Spi_Infors.ulDevCnt; +} + +//打开设备 +bool DRV_Spi::spi_openDevice(ULONG SpiI2cGpioDevIndex) +{ + // 获取所选的设备序号 + if((SpiI2cGpioDevIndex < 0) || (SpiI2cGpioDevIndex > this->m_DRV_Spi_Infors.ulDevCnt)) + { + DbgPrint("device index error!"); + return false; + } + // 打开设备 + this->m_DRV_Spi_Infors.devIsOpened = (CH347OpenDevice(SpiI2cGpioDevIndex) != INVALID_HANDLE_VALUE); + // 设置USB数据读写超时时间 + CH347SetTimeout(SpiI2cGpioDevIndex,500,500); + // 输出调试信息 + DbgPrint("Open the device...%s",this->m_DRV_Spi_Infors.devIsOpened?"Success":"Failed"); + if(!this->m_DRV_Spi_Infors.devIsOpened) + return false; + // 设置当前打开设备的索引号 + this->m_DRV_Spi_Infors.opendDevIndex = SpiI2cGpioDevIndex; + return true; +// CH347InitSpi(); +} + +//关闭设备 +bool DRV_Spi::spi_closeDevice() +{ + // 判断当前设备是否开启 + if(!this->m_DRV_Spi_Infors.devIsOpened) + { + DbgPrint("The Device not open!"); + return false; + } + // 关闭当前正在开启的设备 + CH347CloseDevice(this->m_DRV_Spi_Infors.opendDevIndex); + // 设置设备打开标志位为FALSE + this->m_DRV_Spi_Infors.devIsOpened = FALSE; + // 输出信息 + DbgPrint("Close the Device!"); + + return TRUE; +} diff --git a/drivers/spi/drv_spi.h b/drivers/spi/drv_spi.h new file mode 100755 index 0000000..312a33c --- /dev/null +++ b/drivers/spi/drv_spi.h @@ -0,0 +1,72 @@ +#ifndef _DRV_SPI_H__ +#define _DRV_SPI_H__ + +#include + +#include "libs/CH347DLL.H" + +#define DbgPrint(format, ...) qDebug().nospace() << QString::asprintf(format, ##__VA_ARGS__) + +typedef struct _USB_DEVICE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT bcdUSB; + UCHAR bDeviceClass; + UCHAR bDeviceSubClass; + UCHAR bDeviceProtocol; + UCHAR bMaxPacketSize0; + USHORT idVendor; + USHORT idProduct; + USHORT bcdDevice; + UCHAR iManufacturer; + UCHAR iProduct; + UCHAR iSerialNumber; + UCHAR bNumConfigurations; +} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +typedef struct _DRV_SPI_INFO +{ + CHAR bDeviceName[256]; //设备名称 + mDeviceInforS SpiI2cDevInfor[16]; //spiI2c设备信息 + ULONG ulDevCnt; //设备数量 + BOOL devIsOpened; //设备开启标志位 + ULONG opendDevIndex; //当前设备索引号 +}mDRV_Spi_Infors; + +class DRV_Spi : public QObject +{ + Q_OBJECT // 如果需要使用QT的信号槽机制 + +public: + /** + * @brief 构造函数 + * @param parent 父对象指针 + */ + explicit DRV_Spi(QObject *parent = nullptr); + + /** + * @brief 析构函数 + */ + virtual ~DRV_Spi(); + + /*************函数定义*************/ + ULONG spi_enumDevice(); // 枚举SPI设备 + bool spi_openDevice(ULONG SpiI2cGpioDevIndex); // 打开设备 + bool spi_closeDevice(); // 关闭设备 + + /*************变量定义*************/ + mDRV_Spi_Infors m_DRV_Spi_Infors; //Spi驱动相关信息 + +signals: + // 可以添加DAC特定的信号 + // void outputChanged(int channel, double value); + +private: + // 私有成员变量 + // double m_currentValues[]; // 当前各通道输出值(假设有多个通道) + + // 私有方法 + +}; + +#endif diff --git a/drivers/uart/drv_uart.cpp b/drivers/uart/drv_uart.cpp new file mode 100755 index 0000000..ceac193 --- /dev/null +++ b/drivers/uart/drv_uart.cpp @@ -0,0 +1,155 @@ +#include "drv_uart.h" +#include +#include // 用于调试输出 +#include + +DRV_Uart::DRV_Uart(QObject *parent) + : QObject(parent) // 假设有8个通道 +{ + +} + +DRV_Uart::~DRV_Uart() +{ + +} + +// 枚举当前的所有UART设备:返回搜索到的设备数目 +ULONG DRV_Uart::Uart_enumDevice() +{ + ULONG i; + + mDeviceInforS DevInfor = {0}; + + // 当前设备数目清零 + this->m_DRV_Uart_Infors.ulDevCnt = 0; + + // 依次搜索设备 + for(i=0;i<16;i++) + { + // 打开设备 + if(CH347Uart_Open(i) != INVALID_HANDLE_VALUE) + { + // 获取设备信息 + CH347Uart_GetDeviceInfor(i,&DevInfor); + // 格式化设备名称 + sprintf(this->m_DRV_Uart_Infors.bDeviceName[this->m_DRV_Uart_Infors.ulDevCnt], "%d# %s", i,DevInfor.FuncDescStr); + // 输出设备名称 + DbgPrint("UART:%s.", this->m_DRV_Uart_Infors.bDeviceName[this->m_DRV_Uart_Infors.ulDevCnt]); + + // copy设备信息至SpiI2cDevInfor结构体 + memcpy(&this->m_DRV_Uart_Infors.UartDevInfor[this->m_DRV_Uart_Infors.ulDevCnt], &DevInfor,sizeof(DevInfor)); + // 设备数量自增 + this->m_DRV_Uart_Infors.ulDevCnt++; + } + // 关闭设备 + CH347CloseDevice(i); + } + return this->m_DRV_Uart_Infors.ulDevCnt; +} + +//打开设备 +BOOL DRV_Uart::Uart_openDevice(ULONG UartIndex) +{ + // 判断设备的索引是否在正确的范围内,否则直接跳出 + if((this->m_DRV_Uart_Infors.ulDevCnt == 0) || (UartIndex >= this->m_DRV_Uart_Infors.ulDevCnt)) + { + DbgPrint("Failed to open the device. Please refresh device first!"); + return FALSE; + } + // 打开串口设备 + this->m_DRV_Uart_Infors.devIsOpened = (CH347Uart_Open(UartIndex) != INVALID_HANDLE_VALUE); + // 判断是否打开成功 + if(this->m_DRV_Uart_Infors.devIsOpened){ + // 设置当前的设备索引号 + this->m_DRV_Uart_Infors.opendDevIndex = UartIndex; + // 设置默认的延迟时间 + CH347Uart_SetTimeout(UartIndex,500,500); + // 设置接收和发送线程 + // StopTxThread = FALSE; + // StopRxThread = FALSE; + } + // 显示日志信息 + DbgPrint(">>%d#Open Device...%s",UartIndex,this->m_DRV_Uart_Infors.devIsOpened?"Success":"Failed"); + return this->m_DRV_Uart_Infors.devIsOpened; +} + +//关闭设备 +BOOL DRV_Uart::Uart_closeDevice() +{ + // 设置接收和发送线程 + // StopTxThread = TRUE; + // StopRxThread = TRUE; + // 判断是否打开成功 + if(this->m_DRV_Uart_Infors.devIsOpened){ + Sleep(300); + CH347Uart_Close(this->m_DRV_Uart_Infors.opendDevIndex); + this->m_DRV_Uart_Infors.devIsOpened = FALSE; + DbgPrint(">>%d#Close device",this->m_DRV_Uart_Infors.opendDevIndex); + } + return TRUE; +} + +//设置串口参数 +BOOL DRV_Uart::Uart_setPara(ULONG Baudrate, UCHAR StopBits, UCHAR Parity, UCHAR DataSize, UCHAR Timeout) +{ + BOOL RetVal = FALSE; + + if(this->m_DRV_Uart_Infors.devIsOpened){ + RetVal = CH347Uart_Init(this->m_DRV_Uart_Infors.opendDevIndex,Baudrate,DataSize,Parity,StopBits,Timeout); + DbgPrint("Uart_Set %s,Baudrate:%d,DataSize:%d,Parity:%d,StopBits:%d,Timeout:%d",RetVal?"succ":"failure", + Baudrate,DataSize,Parity,StopBits,Timeout); + } + return RetVal; +} + +//串口发送数据 +BOOL DRV_Uart::Uart_Write(QByteArray &sendData) +{ + // 获取数据包的长度 + ULONG OutLen = sendData.length(); + // 将QByteArray转化为UCHAR + const UCHAR *OutBuf = reinterpret_cast(sendData.constData()); + + BOOL RetVal = FALSE; + // 调用底层串口发送函数发送数据 + RetVal = CH347Uart_Write(this->m_DRV_Uart_Infors.opendDevIndex, (UCHAR *)OutBuf, &OutLen); + // 日志窗口输出调试信息 + DbgPrint("frame:%d,Uart_Write %dBytes %s.",sendData.at(14), OutLen,RetVal?"succ":"failure"); + + return RetVal; +} + +//读取串口缓冲区数据大小 +LONGLONG DRV_Uart::Uart_readRxBufcnt(void) +{ + LONGLONG rxBufSize = 0; + + BOOL RetVal = FALSE; + // 调用底层串口接收数据缓冲区的大小 + RetVal = CH347Uart_QueryBufUpload(this->m_DRV_Uart_Infors.opendDevIndex, &rxBufSize); + // 日志窗口输出调试信息 + DbgPrint("read uart rx buf count:%d.", rxBufSize, RetVal?"succ":"failure"); + + return rxBufSize; +} + +BOOL DRV_Uart::Uart_Read(QByteArray &revData) +{ + ULONG InLen = 4096; // 设置读取的长度,读取完后会将该值赋值为真实的长度 + UCHAR InBuf[4096] = {0x00}; + + BOOL RetVal = FALSE; + + // 读取串口数据 + RetVal = CH347Uart_Read(this->m_DRV_Uart_Infors.opendDevIndex,InBuf,&InLen); + + DbgPrint("CH347Uart_Read %dB %s.",InLen,RetVal?"succ":"failure"); + + if(RetVal) + { + //将数据存入revData变量中,返回给调用的函数 + revData = QByteArray::fromRawData(reinterpret_cast(InBuf), InLen); + } + return RetVal; +} diff --git a/drivers/uart/drv_uart.h b/drivers/uart/drv_uart.h new file mode 100755 index 0000000..9e5c0f7 --- /dev/null +++ b/drivers/uart/drv_uart.h @@ -0,0 +1,75 @@ +#ifndef _DRV_UART_H__ +#define _DRV_UART_H__ + +#include + +#include "libs/CH347DLL.H" + +#define DbgPrint(format, ...) qDebug().nospace() << QString::asprintf(format, ##__VA_ARGS__) + +// typedef struct _USB_DEVICE_DESCRIPTOR { +// UCHAR bLength; +// UCHAR bDescriptorType; +// USHORT bcdUSB; +// UCHAR bDeviceClass; +// UCHAR bDeviceSubClass; +// UCHAR bDeviceProtocol; +// UCHAR bMaxPacketSize0; +// USHORT idVendor; +// USHORT idProduct; +// USHORT bcdDevice; +// UCHAR iManufacturer; +// UCHAR iProduct; +// UCHAR iSerialNumber; +// UCHAR bNumConfigurations; +// } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +typedef struct _DRV_UART_INFO +{ + CHAR bDeviceName[2][256]; //设备名称 + mDeviceInforS UartDevInfor[16]; //spiI2c设备信息 + ULONG ulDevCnt; //设备数量 + BOOL devIsOpened; //设备开启标志位 + ULONG opendDevIndex; //当前设备索引号 +}mDRV_Uart_Infors; + +class DRV_Uart : public QObject +{ + Q_OBJECT // 如果需要使用QT的信号槽机制 + +public: + /** + * @brief 构造函数 + * @param parent 父对象指针 + */ + explicit DRV_Uart(QObject *parent = nullptr); + + /** + * @brief 析构函数 + */ + virtual ~DRV_Uart(); + + /*************函数定义*************/ + ULONG Uart_enumDevice(); // 枚举UART设备 + BOOL Uart_openDevice(ULONG UartIndex); // 打开设备 + BOOL Uart_closeDevice(); // 关闭设备 + BOOL Uart_setPara(ULONG Baudrate, UCHAR StopBits, UCHAR Parity, UCHAR DataSize, UCHAR Timeout);// 设置参数 + BOOL Uart_Write(QByteArray &sendData); + LONGLONG Uart_readRxBufcnt(void); + BOOL Uart_Read(QByteArray &revData); + /*************变量定义*************/ + mDRV_Uart_Infors m_DRV_Uart_Infors; //Spi驱动相关信息 + +signals: + // 可以添加DAC特定的信号 + // void outputChanged(int channel, double value); + +private: + // 私有成员变量 + // double m_currentValues[]; // 当前各通道输出值(假设有多个通道) + + // 私有方法 + +}; + +#endif diff --git a/libs/CH347DLL.H b/libs/CH347DLL.H new file mode 100755 index 0000000..ca485fd --- /dev/null +++ b/libs/CH347DLL.H @@ -0,0 +1,645 @@ +/***************************************************************************** +** Copyright (C) WCH 2001-2025 ** +** Web: http://wch.cn ** +******************************************************************************/ +// USB߽ӿоƬCH341/7Ӧòӿڿ,CH347/9480MbpsUSBչUART/SPI/I2C/JTAG/SWD +// CH346480MbpsUSBչUART/SPI SLAVE,UART/PARALLEL SLAVE +// CH347-DLL V1.4 +// л: Windows 98/ME, Windows 2000/XP, WIN7/8/10/11,and later. +// support USB chip: CH341, CH341A,CH347,CH339W +// USB => Parallel, I2C, SPI, JTAG, SWD, PARALLEL,UART ... +//Notes: +//Copyright (C) 2025 Nanjing Qinheng Microelectronics Co., Ltd. + + + +#ifndef _CH347_DLL_H +#define _CH347_DLL_H + +#include // ȷ LONG Ͷ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _WIN64 +#define mOFFSET( s, m ) ( (ULONG_PTR) & ( ( ( s * ) 0 ) -> m ) ) // ȡṹԱƫƵַĺ +#else +#define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // ȡṹԱƫƵַĺ +#endif + +#ifndef max +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // ϴֵ +#endif + +#ifndef min +#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // Сֵ +#endif + +#ifdef ExAllocatePool +#undef ExAllocatePool // ɾTAGڴ +#endif + +#ifndef NTSTATUS +typedef LONG NTSTATUS; // ״̬ +#endif + +//CH31DLLCH341WDM +#ifndef _CH341_DLL_H +typedef struct _USB_SETUP_PKT { // USBƴĽ׶εṹ + UCHAR mUspReqType; // 00H + UCHAR mUspRequest; // 01H + union { + struct { + UCHAR mUspValueLow; // 02H ֵֽ + UCHAR mUspValueHigh; // 03H ֵֽ + }; + USHORT mUspValue; // 02H-03H ֵ + }; + union { + struct { + UCHAR mUspIndexLow; // 04H ֽ + UCHAR mUspIndexHigh; // 05H ֽ + }; + USHORT mUspIndex; // 04H-05H + }; + USHORT mLength; // 06H-07H ݽ׶εݳ +} mUSB_SETUP_PKT, *mPUSB_SETUP_PKT; + + +typedef struct _WIN32_COMMAND { // WIN32ӿڽṹ + union { + ULONG mFunction; // ʱָܴ߹ܵ + NTSTATUS mStatus; // ʱز״̬ + }; + ULONG mLength; // ȡ,غݵij + union { + mUSB_SETUP_PKT mSetupPkt; // USBƴĽ׶ε + UCHAR mBuffer[ 512]; // ݻ,Ϊ0255B + }; +} mWIN32_COMMAND, *mPWIN32_COMMAND; +// WIN32Ӧòӿ +#define IOCTL_CH341_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f34 << 2 | METHOD_BUFFERED ) // רýӿ + +#define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32ӿڵͷ + +#define mCH341_MAX_NUMBER 32 // ͬʱӵCH341/7豸 + +#define mMAX_BUFFER_LENGTH 0x1000 // ݻ󳤶4096 + +#define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // ݳȼṹͷij + +#define mDEFAULT_BUFFER_LEN 0x0400 // ݻĬϳ1024 + +#define mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // Ĭݳȼṹͷij + +// CH341˵ַ +#define mCH347_ENDP_DATA_UP 0x86 // CH347ݿϴ˵ĵַ +#define mCH347_ENDP_DATA_DOWN 0x06 // CH347ݿ´˵ĵַ + +// 豸ӿṩĹܵ +#define mPipeDeviceCtrl 0x00000004 // CH347ۺϿƹܵ +#define mPipeDataUp 0x00000006 // CH347ݿϴܵ +#define mPipeDataDown 0x00000007 // CH347ݿ´ܵ + +// ӦòӿڵĹܴ +#define mFuncNoOperation 0x00000000 // ޲ +#define mFuncGetVersion 0x00000001 // ȡ汾 +#define mFuncGetConfig 0x00000002 // ȡUSB豸 +#define mFuncSetTimeout 0x00000009 // USBͨѶʱ +#define mFuncSetExclusive 0x0000000b // öռʹ +#define mFuncResetDevice 0x0000000c // λUSB豸 +#define mFuncResetPipe 0x0000000d // λUSBܵ +#define mFuncAbortPipe 0x0000000e // ȡUSBܵ +#define mFuncBufferMode 0x00000020 // 趨ϴģʽѯеݳ +#define mFuncBufferModeDn 0x00000021 // 趨´ģʽѯеݳ +#define mFuncGetVersionEx 0x00000022 // ȡ汾żоƬͺ +// USB豸׼ +#define mUSB_CLR_FEATURE 0x01 +#define mUSB_SET_FEATURE 0x03 +#define mUSB_GET_STATUS 0x00 +#define mUSB_SET_ADDRESS 0x05 +#define mUSB_GET_DESCR 0x06 +#define mUSB_SET_DESCR 0x07 +#define mUSB_GET_CONFIG 0x08 +#define mUSB_SET_CONFIG 0x09 +#define mUSB_GET_INTERF 0x0a +#define mUSB_SET_INTERF 0x0b +#define mUSB_SYNC_FRAME 0x0c + +// CH341ƴijר +#define mCH341_VENDOR_READ 0xC0 // ͨƴʵֵCH341רö +#define mCH341_VENDOR_WRITE 0x40 // ͨƴʵֵCH341רд + +#define mCH341A_CMD_I2C_STREAM 0xAA // I2Cӿڵ,ӴֽڿʼΪI2C +#define mCH341A_CMD_UIO_STREAM 0xAB // UIOӿڵ,ӴֽڿʼΪ +#define mCH341A_CMD_PIO_STREAM 0xAE // PIOӿڵ,ӴֽڿʼΪ +// CH341Aƴijר +#define mCH341A_BUF_CLEAR 0xB2 // δɵ +#define mCH341A_I2C_CMD_X 0x54 // I2Cӿڵ,ִ +#define mCH341A_DELAY_MS 0x5E // Ϊλʱָʱ +#define mCH341A_GET_VER 0x5F // ȡоƬ汾 + +#define mCH341A_CMD_I2C_STM_STA 0x74 // I2Cӿڵ:ʼλ +#define mCH341A_CMD_I2C_STM_STO 0x75 // I2Cӿڵ:ֹͣλ +#define mCH341A_CMD_I2C_STM_OUT 0x80 // I2Cӿڵ:,λ5-λ0Ϊ,ֽΪ,0ֻһֽڲӦ +#define mCH341A_CMD_I2C_STM_IN 0xC0 // I2Cӿڵ:,λ5-λ0Ϊ,0ֻһֽڲӦ +#define mCH341A_CMD_I2C_STM_MAX ( min( 0x3F, mCH341_PACKET_LENGTH ) ) // I2Cӿڵݵ󳤶 +#define mCH341A_CMD_I2C_STM_SET 0x60 // I2Cӿڵ:ò,λ2=SPII/O(0=뵥,1=˫˫),λ1λ0=I2Cٶ(00=,01=׼,10=,11=) +#define mCH341A_CMD_I2C_STM_US 0x40 // I2Cӿڵ:΢Ϊλʱ,λ3-λ0Ϊʱֵ +#define mCH341A_CMD_I2C_STM_MS 0x50 // I2Cӿڵ:Ϊλʱ,λ3-λ0Ϊʱֵ +#define mCH341A_CMD_I2C_STM_DLY 0x0F // I2Cӿڵʱֵ +#define mCH341A_CMD_I2C_STM_END 0x00 // I2Cӿڵ:ǰ + +#define mCH341A_CMD_UIO_STM_IN 0x00 // UIOӿڵ:D7-D0 +#define mCH341A_CMD_UIO_STM_DIR 0x40 // UIOӿڵ:趨I/OD5-D0,λ5-λ0Ϊ +#define mCH341A_CMD_UIO_STM_OUT 0x80 // UIOӿڵ:D5-D0,λ5-λ0Ϊ +#define mCH341A_CMD_UIO_STM_US 0xC0 // UIOӿڵ:΢Ϊλʱ,λ5-λ0Ϊʱֵ +#define mCH341A_CMD_UIO_STM_END 0x20 // UIOӿڵ:ǰ + +#define MAX_DEVICE_PATH_SIZE 128 // 豸Ƶַ +#define MAX_DEVICE_ID_SIZE 64 // 豸IDַ +#endif _CH341_DLL_H + +// ӿ +#define CH347_USB_VENDOR 0 +#define CH347_USB_HID 2 +#define CH347_USB_VCP 3 + +// CH347_USB_VENDOR֧CH341/CH347T/CH347F/CH339W +#define CHIP_TYPE_CH341 0 +#define CHIP_TYPE_CH347 1 +#define CHIP_TYPE_CH347F 2 +#define CHIP_TYPE_CH339W 3 +#define CHIP_TYPE_CH347T CHIP_TYPE_CH347 + +// оƬܽӿ +#define CH347_FUNC_UART 0 +#define CH347_FUNC_SPI_IIC 1 +#define CH347_FUNC_JTAG_IIC 2 +#define CH347_FUNC_JTAG_IIC_SPI 3 // CH347Fͬʱ֧SPI\I2C\JTAGӿ + +#define DEFAULT_READ_TIMEOUT 500 // Ĭ϶ʱ +#define DEFAULT_WRITE_TIMEOUT 500 // Ĭдʱ + +#define mCH347_PACKET_LENGTH 512 // CH347ֵ֧ݰij + +#pragma pack(1) + +//SPI +typedef struct _SPI_CONFIG{ + UCHAR iMode; // 0-3:SPI Mode0/1/2/3 + UCHAR iClock; // 0=60MHz, 1=30MHz, 2=15MHz, 3=7.5MHz, 4=3.75MHz, 5=1.875MHz, 6=937.5KHz7=468.75KHz + UCHAR iByteOrder; // 0=λǰ(LSB), 1=λǰ(MSB) + USHORT iSpiWriteReadInterval; // SPIӿڳȡдλΪuS + UCHAR iSpiOutDefaultData; // SPIʱĬ + ULONG iChipSelect; // Ƭѡ, λ7Ϊ0Ƭѡ, λ7Ϊ1Ч: λ1λ0Ϊ00/01ֱѡCS1/CS2Ϊ͵ƽЧƬѡ + UCHAR CS1Polarity; // λ0ƬѡCS1Կƣ0͵ƽЧ1ߵƽЧ + UCHAR CS2Polarity; // λ0ƬѡCS2Կƣ0͵ƽЧ1ߵƽЧ + USHORT iIsAutoDeativeCS; // ɺǷԶƬѡ + USHORT iActiveDelay; // Ƭѡִждʱʱ,λus + ULONG iDelayDeactive; // Ƭѡִждʱʱ,λus +}mSpiCfgS,*mPSpiCfgS; + +//豸Ϣ +typedef struct _DEV_INFOR{ + UCHAR iIndex; // ǰ + UCHAR DevicePath[MAX_PATH]; // 豸,CreateFile + UCHAR UsbClass; // 0:CH347_USB_CH341, 2:CH347_USB_HID, 3:CH347_USB_VCP + UCHAR FuncType; // 0:CH347_FUNC_UART, 1:CH347_FUNC_SPI_I2C, 2:CH347_FUNC_JTAG_I2C, 3:CH347_FUNC_JTAG_IIC_SPI + CHAR DeviceID[64]; // USB\VID_xxxx&PID_xxxx + UCHAR ChipMode; // оƬģʽ,0:Mode0(UART0/1); 1:Mode1(Uart1+SPI+I2C); 2:Mode2(HID Uart1+SPI+I2C) 3:Mode3(Uart1+Jtag) 4:CH347F(Uart*2+Jtag/SPI/IIC) + HANDLE DevHandle; // 豸 + USHORT BulkOutEndpMaxSize; // ϴ˵С + USHORT BulkInEndpMaxSize; // ´˵С + UCHAR UsbSpeedType; // USBٶͣ0:FS,1:HS,2:SS + UCHAR CH347IfNum; // USBӿں: CH347T: IF0:UART; IF1:SPI/IIC/JTAG/GPIO + // CH347F: IF0:UART0; IF1:UART1; IF 2:SPI/IIC/JTAG/GPIO + UCHAR DataUpEndp; // ϴ˵ַ + UCHAR DataDnEndp; // ´˵ַ + CHAR ProductString[64]; // USBƷַ + CHAR ManufacturerString[64]; // USBַ + ULONG WriteTimeout; // USBдʱ + ULONG ReadTimeout; // USBʱ + CHAR FuncDescStr[64]; // ӿڹ + UCHAR FirewareVer; // ̼汾,ʮֵ +}mDeviceInforS,*mPDeviceInforS; + +#pragma pack() + +// CH347ģʽú,֧CH347ģʽµĴ򿪡رաUSBUSBдHID +//USB豸 +HANDLE WINAPI CH347OpenDevice(ULONG DevI); // ָ豸 + +//رUSB豸 +BOOL WINAPI CH347CloseDevice(ULONG iIndex); // ָ豸 + +// ȡ豸USBк +BOOL WINAPI CH347GetSerialNumber(ULONG iIndex, // ָ豸 + PUCHAR iSerialNumberStr); // ָȡ豸к + +// ȡ豸Ϣ +BOOL WINAPI CH347GetDeviceInfor(ULONG iIndex, // ָ豸 + mDeviceInforS *DevInformation); // ָȡ豸Ϣ + +// ȡCH347оƬ:0:CHIP_TYPE_CH3411:CHIP_TYPE_CH347/CHIP_TYPE_CH347T,2:CHIP_TYPE_CH347F3:CHIP_TYPE_CH339W +UCHAR WINAPI CH347GetChipType(ULONG iIndex ); // ָ豸 + +// ȡ汾汾豸汾оƬ(CH341(FS)/CH347HS) +BOOL WINAPI CH347GetVersion(ULONG iIndex, + PUCHAR iDriverVer, + PUCHAR iDLLVer, + PUCHAR ibcdDevice, + PUCHAR iChipType); //CHIP_TYPE_CH341/7 + +typedef VOID ( CALLBACK * mPCH347_NOTIFY_ROUTINE ) ( // 豸֪ͨ¼ص + ULONG iEventStatus ); // 豸¼͵ǰ״̬(ж): 0=豸γ¼, 3=豸¼ + +#define CH347_DEVICE_ARRIVAL 3 // 豸¼,Ѿ +#define CH347_DEVICE_REMOVE_PEND 1 // 豸Ҫγ +#define CH347_DEVICE_REMOVE 0 // 豸γ¼,Ѿγ + +// 趨豸¼֪ͨ +BOOL WINAPI CH347SetDeviceNotify(ULONG iIndex, // ָ豸,0Ӧһ豸 + PCHAR iDeviceID, // ѡ,ַָ,ָص豸ID,ַ\0ֹ + mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // ָ豸¼ص,ΪNULLȡ¼֪ͨ,ڼ⵽¼ʱøó + +// ȡUSBݿ +BOOL WINAPI CH347ReadData( ULONG iIndex, // ָ豸 + PVOID oBuffer, // ָһ㹻Ļ,ڱȡ + PULONG ioLength ); // ָ򳤶ȵԪ,ʱΪ׼ȡij,غΪʵʶȡij + +// дȡUSBݿ +BOOL WINAPI CH347WriteData(ULONG iIndex, // ָ豸 + PVOID iBuffer, // ָһ,׼д + PULONG ioLength ); // ָ򳤶ȵԪ,ʱΪ׼дij,غΪʵдij + +// USBݶдijʱ +BOOL WINAPI CH347SetTimeout(ULONG iIndex, // ָ豸 + ULONG iWriteTimeout, // ָUSBдݿijʱʱ,ԺmSΪλ,0xFFFFFFFFָʱ(Ĭֵ) + ULONG iReadTimeout ); // ָUSBȡݿijʱʱ,ԺmSΪλ,0xFFFFFFFFָʱ(Ĭֵ) + +/***************SPI********************/ +// SPIʼ +BOOL WINAPI CH347SPI_Init(ULONG iIndex, // ָ豸 + mSpiCfgS *SpiCfg); // ָSPIýṹ + +// SPIʱƵʣøýӿںµCH347SPI_Initгʼ +BOOL WINAPI CH347SPI_SetFrequency(ULONG iIndex, // ָ豸 + ULONG iSpiSpeedHz);// SPIʱӣλΪHZ + +// SPIλ +BOOL WINAPI CH347SPI_SetDataBits(ULONG iIndex, // ָ豸 + UCHAR iDataBits); // 0=8bit1=16bit + +// ȡSPIϢ +BOOL WINAPI CH347SPI_GetCfg(ULONG iIndex,mSpiCfgS *SpiCfg); + +// Ƭѡ״̬,ʹǰȵCH347SPI_InitCS +BOOL WINAPI CH347SPI_ChangeCS(ULONG iIndex, // ָ豸 + UCHAR iStatus); // 0=Ƭѡ,1=Ƭѡ + +// SPIƬѡ +BOOL WINAPI CH347SPI_SetChipSelect(ULONG iIndex, // ָ豸 + USHORT iEnableSelect, // ͰλΪCS1߰λΪCS2; ֵֽΪ1=CS,Ϊ0=ԴCS + USHORT iChipSelect, // ͰλΪCS1߰λΪCS2;Ƭѡ,0=Ƭѡ,1=Ƭѡ + ULONG iIsAutoDeativeCS, // 16λΪCS116λΪCS2;ɺǷԶƬѡ + ULONG iActiveDelay, // 16λΪCS116λΪCS2;Ƭѡִждʱʱ,λus + ULONG iDelayDeactive); // 16λΪCS116λΪCS2;Ƭѡִждʱʱ,λus + +// SPI4д +BOOL WINAPI CH347SPI_Write(ULONG iIndex, // ָ豸 + ULONG iChipSelect, // Ƭѡ, λ7Ϊ0Ƭѡ, λ7Ϊ1Ƭѡ + ULONG iLength, // ׼ֽ + ULONG iWriteStep, // ׼ȡĵij + PVOID ioBuffer); // ָһ,׼MOSIд + +// SPI4.дݣЧʽCH347SPI_WriteReadߺܶ +BOOL WINAPI CH347SPI_Read(ULONG iIndex, // ָ豸 + ULONG iChipSelect, // Ƭѡ, λ7Ϊ0Ƭѡ, λ7Ϊ1Ƭѡ + ULONG oLength, // ׼ֽ + PULONG iLength, // ׼ֽ + PVOID ioBuffer); // ָһ,׼DOUTд,غǴDIN + +// SPI,4߽ӿ +BOOL WINAPI CH347SPI_WriteRead(ULONG iIndex, // ָ豸 + ULONG iChipSelect, // Ƭѡ, λ7Ϊ0Ƭѡ, λ7Ϊ1Ƭѡ + ULONG iLength, // ׼ֽ + PVOID ioBuffer ); // ָһ,׼DOUTд,غǴDIN + +// SPI,4߽ӿ +BOOL WINAPI CH347StreamSPI4(ULONG iIndex, // ָ豸 + ULONG iChipSelect, // Ƭѡ, λ7Ϊ0Ƭѡ, λ7Ϊ1Ч + ULONG iLength, // ׼ֽ + PVOID ioBuffer ); // ָһ,׼DOUTд,غǴDIN + +/***************JTAG********************/ +// JTAGӿڳʼJTAGͨٶ +BOOL WINAPI CH347Jtag_INIT(ULONG iIndex, // ָ豸 + UCHAR iClockRate); // ͨٶȣ0=468.75KHz,1=937.5KHz,2=1.875MHz,3=3.75MHz,4=7.5MHz,5=15MHz,6=30MHz,7=60MHz + +// ȡJtagٶ +BOOL WINAPI CH347Jtag_GetCfg(ULONG iIndex, // ָ豸 + UCHAR *ClockRate); // ͨٶȣЧֵΪ0-7ֵԽͨٶԽ + + +// ıTMSֵ״̬л +BOOL WINAPI CH347Jtag_TmsChange(ULONG iIndex, // 豸 + PUCHAR tmsValue, // лTMSλֵ,ֽΪλ + ULONG Step, // tmsValueڴ洢TMSЧλ + ULONG Skip); // Чʼλ + +// Shift-DR/IR״̬ждִExit DR/IR +// ״̬:Shift-DR/IR.RW.->Exit DR/IR +BOOL WINAPI CH347Jtag_IoScan(ULONG iIndex, + PUCHAR DataBits, //Ҫдλ + ULONG DataBitsNb, //Ҫݵλ + BOOL IsRead); //ǷҪȡ + +// Shift-DR/IR״̬жд,ִɺ,һл״̬Exit DR/IR;,ͣShift-DR/IR״̬ +// ״̬:Shift-DR/IR.RW..->[Exit DR/IR] +BOOL WINAPI CH347Jtag_IoScanT(ULONG iIndex, // ָ豸 + PUCHAR DataBits, // Ҫдλ + ULONG DataBitsNb, // Ҫݵλ + BOOL IsRead, // ǷҪȡ + BOOL IsLastPkt); // ǷΪһ + +// JTAGλTap״̬.TCKTMSΪ߽ɽ״̬ΪTest-Logic Reset״̬ +ULONG WINAPI CH347Jtag_Reset(ULONG iIndex); // ָ豸 + +// TRSTӲλ +BOOL WINAPI CH347Jtag_ResetTrst(ULONG iIndex, // ָ豸 + BOOL iLevel); // 0=Ϊͣ1=Ϊ + +// λʽJTAG IR/DRݶд.ݵĶдָ״̬лȿഫ䡣ݴ䣬ʹCH347Jtag_WriteRead_Fast +// 4096ֽΪλд +// ״̬:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test +BOOL WINAPI CH347Jtag_WriteRead(ULONG iIndex, // ָ豸 + BOOL IsDR, // =TRUE: DRݶд,=FALSE:IRݶд + ULONG iWriteBitLength, // д,׼дij + PVOID iWriteBitBuffer, // ָһ,׼д + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡij + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// JTAG IR/DRд,ڶֽдJTAG̼زӲ4KдȲ4096ֽڡСе +// ״̬:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test +BOOL WINAPI CH347Jtag_WriteRead_Fast(ULONG iIndex, // ָ豸 + BOOL IsDR, // =TRUE: DRݶд,=FALSE:IRݶд + ULONG iWriteBitLength, // д,׼дij + PVOID iWriteBitBuffer, // ָһ,׼д + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡij + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// λʽJTAG IR/DRݶд.ݵĶдָ״̬лȿഫ䡣ݴ䣬ʹCH347Jtag_WriteRead_Fast +// 4096ֽΪλд +// ״̬:Run-Test-> Shift-IR/DR..->Exit IR/DR -> Run-Test +BOOL WINAPI CH347Jtag_WriteReadEx(ULONG iIndex, // ָ豸 + BOOL IsInDrOrIr, // =TRUE: SHIFT-DR/IR״̬ݽ ==FALSE: Run-Test->Shift-IR/DR.ݽ.->Exit IR/DR -> Run-Test + BOOL IsDR, // =TRUE: DRݶд,=FALSE:IRݶд + ULONG iWriteBitLength, // д,׼дij + PVOID iWriteBitBuffer, // ָһ,׼д + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡij + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// JTAG IR/DRд,ڶֽдJTAG̼زӲ4KдȲ4096ֽڡСе +// ״̬:Run-Test->Shift-IR/DR..->Exit IR/DR -> Run-Test +BOOL WINAPI CH347Jtag_WriteRead_FastEx(ULONG iIndex, // ָ豸 + BOOL IsInDrOrIr, // =TRUE: SHIFT-DR/IR״̬ݽ ==FALSE: Run-Test->Shift-IR/DR.ݽ.->Exit IR/DR -> Run-Test + BOOL IsDR, // =TRUE: DRݶд,=FALSE:IRݶд + ULONG iWriteBitLength, // д,׼дij + PVOID iWriteBitBuffer, // ָһ,׼д + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡij + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// лJTAG״̬谴˳ִ +BOOL WINAPI CH347Jtag_SwitchTapState(UCHAR TapState); // ָл״̬ +// 0:Test-Logic Reset,1:Run-Test/Idle2:Run-Test/Idle -> Shift-DR,3:Shift-DR -> Run-Test/Idle +// 4:Run-Test/Idle -> Shift-IR, 5:Shift-IR -> Run-Test/Idle, 6:Exit1-DR/IR -> Update-DR/IR -> Run-Test/Idle + +// лJTAG״̬,ָ豸iIndex +BOOL WINAPI CH347Jtag_SwitchTapStateEx(ULONG iIndex, // ָ豸 + UCHAR TapState); // ָл״̬ + +// JTAG DRд,ֽΪλ,ڶֽдJTAG̼ز +// ״̬:Run-Test->Shift-DR..->Exit DR -> Run-Test +BOOL WINAPI CH347Jtag_ByteWriteDR(ULONG iIndex, // ָ豸 + ULONG iWriteLength, // д,׼дֽڳ + PVOID iWriteBuffer); // ָһ,׼д + +// JTAG DR,ֽΪλ,ֽ +// ״̬:Run-Test->Shift-DR..->Exit DR -> Run-Test +BOOL WINAPI CH347Jtag_ByteReadDR(ULONG iIndex, // ָ豸 + PULONG oReadLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID oReadBuffer ); // ָһ㹻Ļ,ڱȡ + +// JTAG IRд,ֽΪλ,ֽд +// ״̬:Run-Test->Shift-IR..->Exit IR -> Run-Test +BOOL WINAPI CH347Jtag_ByteWriteIR(ULONG iIndex, // ָ豸 + ULONG iWriteLength, // д,׼дֽڳ + PVOID iWriteBuffer); // ָһ,׼д + +// JTAG IR,ֽΪλ,ֽд +// ״̬:Run-Test->Shift-IR..->Exit IR -> Run-Test +BOOL WINAPI CH347Jtag_ByteReadIR(ULONG iIndex, // ָ豸 + PULONG oReadLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID oReadBuffer ); // ָһ㹻Ļ,ڱȡ + +// λʽJTAG DRд.ݵĶдָ״̬лȿഫ䡣ݴ䣬ʹUSB20Jtag_ByeWriteDR +// ״̬:Run-Test->Shift-DR..->Exit DR -> Run-Test +BOOL WINAPI CH347Jtag_BitWriteDR(ULONG iIndex, // ָ豸 + ULONG iWriteBitLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID iWriteBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// λʽJTAG IRд.ݵĶдָ״̬лȿഫ䡣ݴ䣬ʹUSB20Jtag_ByteWriteIR +// ״̬:Run-Test->Shift-IR..->Exit IR -> Run-Test +BOOL WINAPI CH347Jtag_BitWriteIR(ULONG iIndex, // ָ豸 + ULONG iWriteBitLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID iWriteBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// λʽJTAG IRݶ.ݵĶдָ״̬лȡݴ䣬ʹUSB20Jtag_ByteReadIR +// ״̬:Run-Test->Shift-IR..->Exit IR -> Run-Test +BOOL WINAPI CH347Jtag_BitReadIR(ULONG iIndex, // ָ豸 + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +// λʽJTAG DRݶ.ݵĶд͸ݴ䣬ʹUSB20Jtag_ByteReadDR +// ״̬:Run-Test->Shift-DR..->Exit DR -> Run-Test +BOOL WINAPI CH347Jtag_BitReadDR(ULONG iIndex, // ָ豸 + PULONG oReadBitLength, // ָ򳤶ȵԪ,غΪʵʶȡֽڳ + PVOID oReadBitBuffer ); // ָһ㹻Ļ,ڱȡ + +/***************GPIO********************/ +// ȡCH347GPIOŵƽֵ +BOOL WINAPI CH347GPIO_Get(ULONG iIndex, // ָ豸 + UCHAR *iDir, // ŷ:GPIO0-7Ӧλ0-7, 0=룻1= + UCHAR *iData); // GPIO0ƽ:GPIO0-7Ӧλ0-7,0=͵ƽ1=ߵƽ) + +// CH347GPIOŵƽֵ +BOOL WINAPI CH347GPIO_Set(ULONG iIndex, // ָ豸 + UCHAR iEnable, // Ч־:Ӧλ0-7,ӦGPIO0-7. + UCHAR iSetDirOut, // I/O,ijλ0ӦΪ,ijλ1ӦΪ.GPIO0-7Ӧλ0-7. + UCHAR iSetDataOut); // ,I/OΪ,ôijλ0ʱӦ͵ƽ,ijλ1ʱӦߵƽ + + +typedef VOID ( CALLBACK * mPCH347_INT_ROUTINE ) ( // жϷ + PUCHAR iStatus ); // ж״̬,ολ˵ +// 8ֽGPIO0-7״̬.ÿֽλ: +// λ7ǰGPIO00룻1 +// λ6ǰGPIO0ƽ0͵ƽ1ߵƽ +// λ5ǰGPIO0ǷΪжϣ0ѯģʽ1жģʽ +// λ4-3GPIO0жģʽ00½ش01ش;10˫ش11: ; +// λ2-0 + +// 趨GPIOжϷ +BOOL WINAPI CH347SetIntRoutine(ULONG iIndex, // ָ豸 + UCHAR Int0PinN, // ж0 GPIOź,7:ôжԴ; Ϊ0-7Ӧgpio0-7 + UCHAR Int0TripMode, // ж0: 00:½ش; 01:ش; 02:˫ش; 03:; + UCHAR Int1PinN, // ж1 GPIOź,7ôжԴ,Ϊ0-7Ӧgpio0-7 + UCHAR Int1TripMode, // ж1: 00:½ش; 01:ش; 02:˫ش; 03:; + mPCH347_INT_ROUTINE iIntRoutine );// ָжϷ,ΪNULLȡжϷ,жʱøó + +// ȡж +BOOL WINAPI CH347ReadInter(ULONG iIndex, // ָ豸 + PUCHAR iStatus ); // ָ8ֽڵԪ,ֱΪGPIO0-7״̬,ÿֽλ˵οжϷiStatusλ˵ + +// жݶ +BOOL WINAPI CH347AbortInter(ULONG iIndex ); // ָ豸 + +// IAP̼ģʽ +BOOL WINAPI CH347StartIapFwUpate(ULONG iIndex, + ULONG FwSize); // ̼ + +/**************HID/VCP**********************/ +// 򿪴 +HANDLE WINAPI CH347Uart_Open(ULONG iIndex); // ָ豸 + +// رմ +BOOL WINAPI CH347Uart_Close(ULONG iIndex); // ָ豸 + +BOOL WINAPI CH347Uart_SetDeviceNotify( // 趨豸¼֪ͨ + ULONG iIndex, // ָ豸,0Ӧһ豸 + PCHAR iDeviceID, // ѡ,ַָ,ָص豸ID,ַ\0ֹ + mPCH347_NOTIFY_ROUTINE iNotifyRoutine ); // ָ豸¼ص,ΪNULLȡ¼֪ͨ,ڼ⵽¼ʱøó + +// ȡUARTӲ +BOOL WINAPI CH347Uart_GetCfg(ULONG iIndex, // ָ豸 + PULONG BaudRate, // + PUCHAR ByteSize, // λ(5,6,7,8,16) + PUCHAR Parity, // Уλ(0None; 1Odd; 2Even; 3Mark; 4Space) + PUCHAR StopBits, // ֹͣλ(01ֹͣλ; 11.5ֹͣλ; 22ֹͣλ) + PUCHAR ByteTimeout); // ֽڳʱ + +// UART +BOOL WINAPI CH347Uart_Init(ULONG iIndex, // ָ豸 + DWORD BaudRate, // + UCHAR ByteSize, // λ(5,6,7,8,16) + UCHAR Parity, // Уλ(0None; 1Odd; 2Even; 3Mark; 4Space) + UCHAR StopBits, // ֹͣλ(01ֹͣλ; 11.5ֹͣλ; 22ֹͣλ) + UCHAR ByteTimeout);// ֽڳʱʱ,λ100uS + +// USBݶдijʱ +BOOL WINAPI CH347Uart_SetTimeout(ULONG iIndex, // ָ豸 + ULONG iWriteTimeout, // ָUSBдݿijʱʱ,ԺmSΪλ,0xFFFFFFFFָʱ(Ĭֵ) + ULONG iReadTimeout ); // ָUSBȡݿijʱʱ,ԺmSΪλ,0xFFFFFFFFָʱ(Ĭֵ) + +// ڶ +BOOL WINAPI CH347Uart_Read(ULONG iIndex, // ָ豸 + PVOID oBuffer, // ָһ㹻Ļ,ڱȡ + PULONG ioLength );// ָ򳤶ȵԪ,ʱΪ׼ȡij,غΪʵʶȡij +// д +BOOL WINAPI CH347Uart_Write(ULONG iIndex, // ָ豸 + PVOID iBuffer, // ָһ,׼д + PULONG ioLength );// ָ򳤶ȵԪ,ʱΪ׼дij,غΪʵдij + +// ѯжֽδȡHIDģʽڣ +BOOL WINAPI CH347Uart_QueryBufUpload(ULONG iIndex, // ָ豸 + LONGLONG *RemainBytes); // δȡֽ + +// ȡ豸Ϣ +BOOL WINAPI CH347Uart_GetDeviceInfor(ULONG iIndex,mDeviceInforS *DevInformation); + +/********I2C***********/ +// I2C +BOOL WINAPI CH347I2C_Set(ULONG iIndex, // ָ豸 + ULONG iMode ); // ָģʽ, +// λ0-λ2: I2Cӿٶ/SCLƵ, 000=/20KHz,001=׼/100KHz(Ĭֵ),010=/400KHz,011=/750KHz,100=/50KHz,101=׼/200KHz110=/1MHz +// ,Ϊ0 + +// I2Cʱչ +BOOL WINAPI CH347I2C_SetStretch(ULONG iIndex, // ָ豸 + BOOL iEnable); // 0=رʱչܣĬϹرգ1=ʱչ + +// Ӳ첽ʱ,úܿ췵,һ֮ǰʱָ +BOOL WINAPI CH347I2C_SetDelaymS(ULONG iIndex, // ָ豸 + ULONG iDelay ) ; // ָʱĺ + +// I2Cģʽ +BOOL WINAPI CH347I2C_SetDriverMode(ULONG iIndex, // ָ豸 + UCHAR iMode); // 0=©ģʽ1=ģʽ + +// I2C,2߽ӿ,ʱΪSCL,ΪSDA +BOOL WINAPI CH347StreamI2C( ULONG iIndex, // ָ豸 + ULONG iWriteLength, // ׼дֽ + PVOID iWriteBuffer, // ָһ,׼д,ֽͨI2C豸ַдλ + ULONG iReadLength, // ׼ȡֽ + PVOID oReadBuffer ); // ָһ,غǶ + +// I2C,2߽ӿ,ʱΪSCL,ΪSDA +BOOL WINAPI CH347StreamI2C_RetACK( // I2C,2߽ӿ,ʱΪSCL,ΪSDA(׼˫I/O),ٶԼ56Kֽ,˻ȡACK + ULONG iIndex, // ָ豸 + ULONG iWriteLength, // ׼дֽ + PVOID iWriteBuffer, // ָһ,׼д,ֽͨI2C豸ַдλ + ULONG iReadLength, // ׼ȡֽ + PVOID oReadBuffer, // ָһ,غǶ + PULONG rAckCount); // ָдصACKֵ + +#ifndef _CH341_DLL_H +typedef enum _EEPROM_TYPE {// EEPROMͺ + ID_24C01, + ID_24C02, + ID_24C04, + ID_24C08, + ID_24C16, + ID_24C32, + ID_24C64, + ID_24C128, + ID_24C256, + ID_24C512, + ID_24C1024, + ID_24C2048, + ID_24C4096 +} EEPROM_TYPE; +#endif + +// EEPROMжȡݿ +BOOL WINAPI CH347ReadEEPROM(ULONG iIndex, // ָ豸 + EEPROM_TYPE iEepromID, // ָEEPROMͺ + ULONG iAddr, // ָݵԪĵַ + ULONG iLength, // ׼ȡֽ + PUCHAR oBuffer ); // ָһ,غǶ +// EEPROMдݿ +BOOL WINAPI CH347WriteEEPROM(ULONG iIndex, // ָ豸 + EEPROM_TYPE iEepromID, // ָEEPROMͺ + ULONG iAddr, // ָݵԪĵַ + ULONG iLength, // ׼дֽ + PUCHAR iBuffer ); // ָһ,׼д + +//õ8λʱӵʱʱ䣬CH347T +BOOL WINAPI CH347I2C_SetAckClk_DelayuS(ULONG iIndex, // ָ豸 + ULONG iDelay); // ָʱ΢ + +// úڲѯָCH339WоƬǰӿڹܵ״̬ +// ֵλ壺 +// λ7 (0x80): USBתJTAGʹ״̬1=ʹܣ0=ã +// λ6 (0x40): USBתSPIʹ״̬1=ʹܣ0=ã +// λ5 (0x20): USBתUARTʹܣأ1=ʹܣ0=ã +// λ4 (0x10): USBתUARTʹܣ1=ʹܣ0=ã +// λ3 (0x08): USBתI2Cʹ״̬1=ʹܣ0=ã +// λ2-λ0: λ +UCHAR WINAPI CH339GetChipFuncState( ULONG iIndex ); // ָ豸 + +#ifdef __cplusplus +} +#endif + +#endif // _CH347_DLL_H diff --git a/libs/CH347DLLA64.LIB b/libs/CH347DLLA64.LIB new file mode 100755 index 0000000000000000000000000000000000000000..f215c6097f789e0951a31520e570e437fcf8d406 GIT binary patch literal 29644 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 DTLWKb literal 0 HcmV?d00001 diff --git a/libs/CH347Handler.dll b/libs/CH347Handler.dll new file mode 100755 index 0000000000000000000000000000000000000000..6d3270cd97e7ac43974ea8c824427daf472cfb4a GIT binary patch literal 262656 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 HBJh6z96xz5 literal 0 HcmV?d00001 diff --git a/libs/CH347Handler.lib b/libs/CH347Handler.lib new file mode 100755 index 0000000000000000000000000000000000000000..79645868cfd3f11a7a595b4acf9a0fdb49baacdd GIT binary patch literal 4248 zcmcIn&1)M+6#q%K<5=+*Nk~rtwYa1Stu4utokH=>#&)r><2aJ#m=M^krA?x+&I)O5 zC_VI+Q?I?W^dBfal#okvD4~?lLjtA85C{n*v=EFb^xE{z?#%8=E6Gx94b0BRdo%CN zoA-P3_WjTFO5xT_Y$9G;K1tS&x{_ zhaUjEj%>PhFiU(?hwi&|I8F4lrY&Avy_8+k=H_#=*~QhhOIdApVKP0vpx-H)Mg^L- zl3!j9bK$EXo6EGekY8ES=F~M6ijv5cOKQ2q*yVXuWgAy%r_xqgYd}zxWHa6nK`GrS z+4<_`oUv0X7%aF>QP-8R9iw1d6_zJ@j>MS;V>GLqrd81E39M=t8FRnBe%%wG=;gBc zg<82;qc)i?plm*8*t6Ew7FnM&GCp3nY~!Zk44G%fL)l9y8k^g->TGB$zK~|*`b$*j zFRUk+zpn1`J+h*tgEywmtF+9cN(X7hqiCAGZCeFXuU7d@rD|-sp)L7Jw87ai5;Hy$ zj}a8@e&F5!uuHgnJP5EM;MoZ9U>Mk>HcNB&X)aA;f-MHni$26~4E;EYBZwdxn(GN+ z$1_m9*~w`eV5hZ_+cDtbIBHYp>MDlcHJnN3s|{P8=^K;%sL?!xwen`MYa5;_I1dH& zVy|Z47Ub^5!PYOwL>(yidmWS0^1Zws3qDEXMbkuVLO!B`X}{ev$+Y*@7Vq}px1Vpn zI28e*)h*+W)y8sSh|j6>wH%0+Vf4aysi@ofSW1#kQs+;quf;?UwG4@ef^SMp<2ZGC zNuK26^9=EaQEK0#Si#F^{V~tr#3)4~{Na%4S;uKS**<=;RH#^0>xLcwD0?=(ytuL? z=rs+6C~$3fCD~4Il)imVuU-^sQ?Rzmr1q2TNaXF?;5u3Wu4feT^bBw`za?j!bGp(5 zPnz@4B6vI*e}>P0$Uma+-GLb~;!PCS=-aI`pWikQpiQ@Nvzuf!9(UR*5H1eLJ zOY*(}@0pa7+7G}#bIYemlcwom$H+^4>c6cVdEb72`{_%P;NE#-+qFPm zMw*Kwmm@D&7??yJWx;OYd{5;-w4ARyHg3nhACMON#L5n%+f>Srl>kR?@ve3G)L-YE z^Y%8+JVIfhQ)GCFQ=I?9xRUpFR-ccN +#include + +struct DevSimple { + unsigned char iIndex; + unsigned char DevicePath[MAX_PATH]; + char DeviceID[64]; + unsigned char CH347IfNum; + char ProductString[64]; + char ManufacturerString[64]; +}; + +struct SetCommandArg { + enum Command { + SP_CMD_NA = 0, // Ч + SP_CMD_ZERO = 1, // + SP_CMD_SAME_VALUE = 2, // ֵͬ + SP_CMD_DIF_VALUE = 3 // ֵ + }; + + enum Group { + ALL = 0xAA, // + AB = 0x00, // A/B + OPA = 0x01, // OPA + DAC = 0x02 // DAC + }; + + Command cmd_; // cmd + Group group_; // group + int childGroup_; // groupDet ӷ groupΪ0ʱ0/1A/BgroupΪ2ʱΪ0~20DAC +}; + +struct SetVotegeArg { + std::vector votes_; // ֵͬ趨ֻҪһԪأֵ趨Ҫ256Ԫ +}; diff --git a/libs/SpiApi.h b/libs/SpiApi.h new file mode 100755 index 0000000..b6e8bd5 --- /dev/null +++ b/libs/SpiApi.h @@ -0,0 +1,46 @@ +#pragma once +#include +#include +#include +#include "Common.h" + +#ifdef SPI_API_LIB +#define SPI_API __declspec(dllexport) +#else +#define SPI_API __declspec(dllimport) +#endif + +class SpiHandler; + +class SPI_API SpiApi { +public: + SpiApi(); + ~SpiApi(); + + /** + * @breaf ʼCH347б + * + * @return ֪CH347豸б + */ + std::vector initUsbDevice(); + + /** + * @breaf 豸· + * + * @param devs ָղ豸 + * @param cmdarg ֲ嶨Common.h + * @param varg ѹ嶨Common.h + * + * @return ɹtrue + */ + bool applyArg(DevSimple devs, SetCommandArg cmdarg, SetVotegeArg varg); + + /** + * @breaf ΪtrueexeĹĿ¼debug.logҪ·ʮƲ + */ + void debug(bool on = true); + +private: + std::shared_ptr sh_; + std::string lastError_; +}; diff --git a/main.cpp b/main.cpp new file mode 100755 index 0000000..aff48df --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100755 index 0000000..6e1d03e --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,422 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include + +#if _MSC_VER >= 1600 +#pragma execution_character_set("utf-8") +#endif + +void MainWindow::mw_tableInit(void) +{ + // 初始化组和子组的下拉框 + this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(this->ui->comboBox_icdGroup->currentIndex())); + // 填充数据 + for (int row = 0; row < 16; ++row) { + for (int col = 0; col < 16; ++col) { +// int index = row * 16 + col; // 计算一维数组索引 + QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][col])); + this->ui->tableWidget_volInput->setItem(row, col, item); + } + } + // 在窗口构造函数中连接信号:当输入数据发生变化时,自动链接 + connect(this->ui->tableWidget_volInput, &QTableWidget::cellChanged, this, &MainWindow::mw_onCellChanged); +} + +// 表格中的数据有变化时,触发该函数 +void MainWindow::mw_onCellChanged(int row, int column) { + uint8_t i = 0; + uint8_t j = 0; + + QTableWidgetItem *item = this->ui->tableWidget_volInput->item(row, column); + if (item) { + bool ok; + // 转换数据 + int newValue = item->text().toInt(&ok); + if(!ok || (newValue > 1023)){ + /* 错误输入,设置为原来的值 */ + // 设置为原来的值 + QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][column])); + this->ui->tableWidget_volInput->setItem(row, column, item); + // 提示警告 + QMessageBox::question(this,"ERROR","plase input 0-1023 digit!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + return; + } + qDebug() << "Cell at (" << row << "," << column << ") changed to:" << newValue; + // 设置DAC256 10bit数组的值 + if(!this->m_APP_Icd->ICD_setDAC256Data10bit(row, column, newValue)){ + qDebug() << "set newvalue:" << newValue << "failed!"; + return; + } + /* 如果是同值配置,则让页面和DAC256Data10bit数组的值赋值为同一个值*/ + if(this->ui->comboBox_icdCmd->currentIndex() == 1){ + for(i = 0; i < 16; i++){ + for(j = 0; j < 16; j++){ + // 防止多次进入该程序 + if(this->ui->tableWidget_volInput->item(i, j)->text().toInt() != newValue){ + // 表格中显示输入的值 + this->ui->tableWidget_volInput->item(i, j)->setText(QString::number(newValue)); + // 设置DAC256_10bit_data数组中的值为输入的值 + this->m_APP_Icd->ICD_setDAC256Data10bit(i, j, newValue); + } + } + } + } + } +} + +void MainWindow::mw_showVersionInfo() { + QMessageBox::information( + this, + tr("版本信息"), + tr("上位机版本:%1\n").arg(VERSION) + + tr("修改时间:%1\n").arg(MOD_TIME) + + tr("ICD协议版本:%1\n").arg(ICD_VERSION)+ + tr("作者:罗林赖生\n") + ); +} + +void MainWindow::mw_showUserManual() { + QMessageBox::information( + this, + tr("使用说明"), + tr("1. 打开设备:点击刷新设备列表,搜索串口/SPI设备,选择设备后,点击打开设备\n") + + tr("2. 配置通信:配置串口/SPI通信协议相关的参数,点击初始化SPI/串口参数配置\n") + + tr("3. 寄存器配置和电压配置(以下操作并非都需操作,视情况配置):\n") + + tr("3.1 寄存器配置:\n") + + tr("在寄存器配置以及回读区配置相关的属性后,点击寄存器配置按钮进行配置,如需查看是否配置成功,配置完后等待一秒,点击寄存器回读按钮,寄存器值将显示至文本框\n") + + tr("3.2 电压配置:\n") + + tr("3.2.1 命令选择:选择需要配置的方式 \n") + + tr("3.2.2 分组和子分组选择:选择需要配置的分组和子分组,注:当命令选择异值配置时,分组只能选择单个DAC! \n") + + tr("3.2.3 输入电压:在16X16的表格内输入所需要配置的电压对应的数字量,范围为0-1023,通道数按照从左到右,从上到下依次排布,注:当命令选择同值配置时,只需输入一个电压值,按回车后自动填充所有的数据 \n")+ + tr("3.2.4 设置电压:点击发送电压命令按钮,将把电压相关数据发送至下位机,此时日志输出窗口将输出相关日志信息 \n") + ); +} + +// 菜单栏初始化 +void MainWindow::mw_menuBarInit(void) { + + // 获取主窗口的菜单栏 + QMenuBar *menuBar = this->menuBar(); + + // 1. 添加"主菜单"菜单 + QMenu *mainMenu = menuBar->addMenu(tr("菜单(&M)")); // &H 表示快捷键 Alt+H + + // 2. 添加"帮助"菜单(包含"版本信息"和"使用说明") + QMenu *helpMenu = menuBar->addMenu(tr("帮助(&H)")); // &H 表示快捷键 Alt+H + + // 1.1 添加"版本信息"动作 + QAction *versionAction = new QAction(tr("版本信息(&V)"), this); + helpMenu->addAction(versionAction); + connect(versionAction, &QAction::triggered, this, &MainWindow::mw_showVersionInfo); + + // 1.2 添加"使用说明"动作 + QAction *manualAction = new QAction(tr("使用说明(&M)"), this); + helpMenu->addAction(manualAction); + connect(manualAction, &QAction::triggered, this, &MainWindow::mw_showUserManual); +} + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + // 设置程序标题 + this->setWindowTitle(QString(tr("SP713控制软件 使用说明打开帮助->使用说明")).arg(VERSION).arg(MOD_TIME)); + // // 初始化日志处理器并绑定UI + LogHandler::log_init(ui->plainTextEdit_logOutput); + + // 连接日志信号到UI更新 + connect(LogHandler::log_instance(), &LogHandler::log_messageLogged, + ui->plainTextEdit_logOutput, &QPlainTextEdit::appendPlainText, + Qt::QueuedConnection); // 确保跨线程安全 + // // // 例化DRV_Spi对象 + // this->m_DRV_Spi = new DRV_Spi(this); + // // // 查找Spi设备 + // this->mw_findSpiDev(); + + // 例化APP_ICD类 + this->m_APP_Icd = new APP_Icd(this); + // 初始化 + this->m_APP_Icd->ICD_init(); + // 表格初始化:一定要在APP_ICD类初始化后!!!! + this->mw_tableInit(); + // 初始化寄存器配置中DAC通道值 + for(int i = 1; i <= 256; i++) + { + this->ui->comboBox_icdDacCh->addItem(QString::number(i)); + } + // 菜单栏初始化 + this->mw_menuBarInit(); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::mw_findSpiDev(void) +{ + // 清空设备列表 + this->ui->comboBox_spiDevList->clear(); + // 枚举Spi设备 + if(this->m_DRV_Spi->spi_enumDevice()){ + this->ui->comboBox_spiDevList->addItem(this->m_DRV_Spi->m_DRV_Spi_Infors.bDeviceName); + }else{ + //QMessageBox::question(NULL,"警告","未发现设备",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } +} + +// void MainWindow::mw_findSpiDev(void) +// { +// // 清除相关的变量 +// this->devices.clear(); +// this->ui->comboBox_spiDevList->clear(); +// // 获取 CH347 设备列表 +// try { +// auto devList = this->spiApi.initUsbDevice(); +// this->devices = QVector::fromStdVector(devList); +// } catch (const std::exception &e) { +// DbgPrint("init USB device failed!"); +// } + +// if (devices.isEmpty()) { +// DbgPrint("not find CH347 device!"); +// } + +// /***********************输出设备信息****************************/ + +// if(devices.length() != 0) { +// DbgPrint("Find %d CH347 devices!", devices.length()); + +// for(int i = 0; i < devices.length(); i++){ +// DbgPrint("Manufacturer:%s Product:%s.", devices[i].ManufacturerString, devices[i].ProductString); +// this->ui->comboBox_spiDevList->addItem(devices[i].ProductString); +// } +// } +// } + +// void MainWindow::mw_sendTestData(void) +// { +// /***********************配置参数(示例:设置 DAC 组的异值电压)****************************/ +// SetCommandArg cmdArg; +// cmdArg.cmd_ = SetCommandArg::SP_CMD_DIF_VALUE; +// cmdArg.group_ = SetCommandArg::DAC; +// cmdArg.childGroup_ = 1; // 操作编号为 1 的 DAC + +// SetVotegeArg voltageArg; +// for (int i = 0; i < 256; ++i) { +// // voltageArg.votes_.push_back(i); // 填充 256 个电压值(0-255) +// voltageArg.votes_.push_back(1); // 填充 256 个电压值(0-255) +// } + +// this->spiApi.debug(); + +// // 下发参数到第一个设备 +// bool success = spiApi.applyArg(devices[0], cmdArg, voltageArg); +// if (success) { +// DbgPrint("Parameters applied successfully!"); +// } else { +// DbgPrint("Failed to apply parameters!"); +// } +// } + +// 刷新设备回调函数 +void MainWindow::on_pushButton_refreshDev_clicked() +{ + // 查找Spi设备 + this->mw_findSpiDev(); +} + +// 关闭设备回调函数 +void MainWindow::on_pushButton_closeDev_clicked() +{ + // // 关闭设备 + // if(!this->m_DRV_Spi->spi_closeDevice()){ + // // QMessageBox::question(NULL,"错误","关闭设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + // } + // this->mw_sendTestData(); +} + +// 打开设备回调函数 +void MainWindow::on_pushButton_openDev_clicked() +{ + // // 打开设备 + // if(!this->m_DRV_Spi->spi_openDevice(this->ui->comboBox_spiDevList->currentIndex())){ + // // QMessageBox::question(NULL,"错误","打开设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + // } +} + +// 查找串口设备 +void MainWindow::on_pushButton_uartRefreshDev_clicked() +{ + // 清空comboBox_uartDevList + if(this->ui->comboBox_uartDevList->count()) + this->ui->comboBox_uartDevList->clear(); + // 刷新UART设备 + if(this->m_APP_Icd->m_uartDriver->Uart_enumDevice()){ + // 将串口设备的名称添加至列表中 + for(int i = 0; i < this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.ulDevCnt; i++) + this->ui->comboBox_uartDevList->addItem(this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.bDeviceName[i]); + }else{ + QMessageBox::question(this,"ERROR","not find uart device!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } +} + +// 打开串口设备 +void MainWindow::on_pushButton_uartOpenDev_clicked() +{ + // 读取当前的设备索引号 + ULONG index = this->ui->comboBox_uartDevList->currentIndex(); + // 调用串口打开函数 + BOOL status = this->m_APP_Icd->m_uartDriver->Uart_openDevice(index); + + // 判断打开串口设备是否成功 + if(status == TRUE){ + // 打开成功. 则关闭或开启一些组件 + this->ui->comboBox_uartDevList->setDisabled(true); + this->ui->pushButton_uartCloseDev->setEnabled(true); + this->ui->pushButton_uartOpenDev->setDisabled(true); + this->ui->pushButton_uartSetPara->setEnabled(true); + // 新建数据记录日志txt文件 + if(!this->m_APP_Icd->ICD_newDataRecordingFile()){ + QMessageBox::question(this,"ERROR","new Data Recording File failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } + } +} +// 关闭串口函数 +void MainWindow::on_pushButton_uartCloseDev_clicked() +{ + // 调用串口关闭函数 + BOOL status = this->m_APP_Icd->m_uartDriver->Uart_closeDevice(); + + // 判断打开串口设备是否成功 + if(status == TRUE){ + // 打开成功. 则关闭或开启一些组件 + this->ui->comboBox_uartDevList->setEnabled(true); + this->ui->pushButton_uartCloseDev->setDisabled(true); + this->ui->pushButton_uartOpenDev->setEnabled(true); + this->ui->pushButton_uartSetPara->setDisabled(true); + } +} + +// 串口设置参数函数 +void MainWindow::on_pushButton_uartSetPara_clicked() +{ + // 读取组件中配置参数的值 + ULONG Baudrate = this->ui->comboBox_uartBps->currentText().toUInt(); + UCHAR StopBits = this->ui->comboBox_uartStop->currentIndex(); + UCHAR Parity = this->ui->comboBox_uartVerify->currentIndex(); + UCHAR DataSize = this->ui->comboBox_uartData->currentText().toUInt(); + UCHAR Timeout = this->ui->lineEdit_uartTimeOut->text().toUInt(); + // 调用配置参数函数进行配置 + if(this->m_APP_Icd->m_uartDriver->Uart_setPara(Baudrate, StopBits, Parity, DataSize, Timeout) == FALSE){ + QMessageBox::question(this,"ERROR","set uart para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } +} + +// 当分组的序号发生变化时 +void MainWindow::on_comboBox_icdGroup_currentIndexChanged(int index) +{ + // 清除子分组的列表 + this->ui->comboBox_icdSubGroup->clear(); + // 设置子分组对应的列表 + this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(index)); +} + +// 发送设置电压相关命令 +void MainWindow::on_pushButton_icdSendVolCMD_clicked() +{ + // 获取页面的命令、分组、子分组 + uint8_t CMD = this->ui->comboBox_icdCmd->currentIndex() + 1; + uint8_t group = this->ui->comboBox_icdGroup->currentIndex(); + if(group == 0) + group = 0xAA; + uint8_t subGroup = this->ui->comboBox_icdSubGroup->currentIndex(); + if((subGroup == 0) && (group == 0xAA)) + subGroup = 0xAA; + else + subGroup += 1; + // 调用设置电压命令编码函数 + this->m_APP_Icd->ICD_volCMDProtoEncode(CMD, group, subGroup); +} + +// 写寄存器配置指令 +void MainWindow::on_pushButton_icdRegConfig_clicked() +{ + // 读取dac的编号值 + uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; + // 读取dac通道值 + uint16_t dacCH = this->ui->comboBox_icdDacCh->currentIndex()+1; + // 判断是否为第256通道 + if(dacCH == 256){ + dacCH = 0; + dacID += 128; + } + // 读取funcEN值,将各个选项的使能值按照协议的报文格式叠加到funcEN数据中 + uint8_t funcEN = 0x00; + if(this->ui->checkBox_icdEN_TADC->isChecked()){ + funcEN += 1; + } + if(this->ui->checkBox_icdFBK_EN->isChecked()){ + funcEN += 2; + } + if(this->ui->checkBox_icdTEMPTEST->isChecked()){ + funcEN += 4; + } + if(this->ui->checkBox_icdTEST_EN->isChecked()){ + funcEN += 8; + } + if(this->ui->checkBox_icdTRIG_TADC->isChecked()){ + funcEN += 16; + } + // 读取adcCurrConfig值 + uint8_t adcCurrConfig = this->ui->comboBox_icdRefCurr->currentIndex(); + adcCurrConfig = adcCurrConfig*16 + this->ui->comboBox_icdADCClkPrs->currentIndex(); + + // 调用写寄存器编码函数 + if(!this->m_APP_Icd->ICD_regWCMDProtoEncode(dacID, dacCH, funcEN, adcCurrConfig)){ + QMessageBox::question(this,"ERROR","set reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } +} + +// 寄存器回读命令 +void MainWindow::on_pushButton_icdRegRead_clicked() +{ + // 清楚 + this->revData.clear(); + // 读取dac的编号值 + uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; + // 读取寄存器的值 + if(!this->m_APP_Icd->ICD_regRCMDProtoEncode(dacID)){ + QMessageBox::question(this,"ERROR","write read reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } + // 读取串口接收区的数据 + QThread::msleep(10); // 延时10毫秒 + if(!this->m_APP_Icd->m_uartDriver->Uart_Read(this->revData)){ + QMessageBox::question(this,"ERROR","read reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); + } + // 将返回的寄存器值显示到label界面 + this->ui->label_icdRegRead->setText(this->revData.toHex(' ')); // 用空格分隔每个字节 + // 记录读的数据 + // this->m_APP_Icd->ICD_addContextToDataRecordingFile(false, this->revData); + // 解析数据 + this->regParsedData = this->m_APP_Icd->ICD_parseRegisterData(this->revData); + qDebug() << "CH_TEST:" << this->regParsedData.CH_TEST \ + << ",EN_TADC:" << this->regParsedData.EN_TADC \ + << ",FBK_EN:" << this->regParsedData.FBK_EN \ + << ",TEMPTEST_EN:" << this->regParsedData.TEMPTEST_EN \ + << ",TEST_TADC:" << this->regParsedData.TEST_TADC \ + << ",TRIG_TADC:" << this->regParsedData.TRIG_TADC \ + << ",N_CLKDIV18:" << QString::number(this->regParsedData.N_CLKDIV18, 2).rightJustified(2, '0') \ + << ",ICON18:" << QString::number(this->regParsedData.ICON18, 2).rightJustified(4, '0') \ + << ",VCON:" << QString::number(this->regParsedData.VCON, 2).rightJustified(2, '0') \ + << ",EOC:" << this->regParsedData.EOC \ + << ",ADC_OUT:" << this->regParsedData.ADC_OUT \ + << ",D_FB:" << this->regParsedData.D_FB; +} + diff --git a/mainwindow.h b/mainwindow.h new file mode 100755 index 0000000..50d7c6d --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,78 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include "SpiApi.h" +#include "apps/icd/app_icd.h" + +QT_BEGIN_NAMESPACE +namespace Ui { +class MainWindow; +} +QT_END_NAMESPACE + +#define VERSION "V1.1" +#define MOD_TIME "25/07/17" +#define ICD_VERSION "V2.0.1" + + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + /******************函数声明*****************/ + static void mw_logOutPut(QtMsgType type, const QMessageLogContext &context, const QString &msg); + void mw_findSpiDev(void); + void mw_sendTestData(void); + void mw_tableInit(void); + + void mw_onCellChanged(int row, int column); + void mw_menuBarInit(void); + + // 定义对象 + DRV_Spi *m_DRV_Spi; // spi驱动对象 + APP_Icd *m_APP_Icd; // ICD应用层类 + QByteArray revData; + // // SpiApi底层驱动类 + SpiApi spiApi; + QVector devices; + ParsedData regParsedData; + +signals: + +private slots: + void on_pushButton_refreshDev_clicked(); + + void on_pushButton_closeDev_clicked(); + + void on_pushButton_openDev_clicked(); + + void on_pushButton_uartRefreshDev_clicked(); + + void on_pushButton_uartOpenDev_clicked(); + + void on_pushButton_uartCloseDev_clicked(); + + void on_pushButton_uartSetPara_clicked(); + + void on_comboBox_icdGroup_currentIndexChanged(int index); + + void on_pushButton_icdSendVolCMD_clicked(); + + void on_pushButton_icdRegConfig_clicked(); + + void mw_showVersionInfo(); + void mw_showUserManual(); + + void on_pushButton_icdRegRead_clicked(); + +private: + Ui::MainWindow *ui; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100755 index 0000000..6d3d913 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,1204 @@ + + + MainWindow + + + + 0 + 0 + 703 + 997 + + + + MainWindow + + + + + + 10 + 130 + 681 + 91 + + + + 串口配置区 + + + + + 10 + 60 + 651 + 25 + + + + + + + 波特率: + + + + + + + + 115200 + + + + + 9600 + + + + + + + + 校验位: + + + + + + + + None + + + + + Odd + + + + + Even + + + + + Mark + + + + + Space + + + + + + + + 停止位: + + + + + + + + 1位 + + + + + 1.5位 + + + + + 2位 + + + + + + + + 数据位: + + + + + + + + 8 + + + + + + + + 字节超时(ms): + + + + + + + 0 + + + 255 + + + + + + + false + + + + 0 + 0 + + + + 串口参数设置 + + + + + + + + + 370 + 30 + 291 + 25 + + + + + + + 刷新设备列表 + + + + + + + false + + + 关闭设备 + + + + + + + 打开设备 + + + + + + + + + 101 + 31 + 261 + 21 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + 10 + 30 + 81 + 20 + + + + UART设备列表: + + + + + + + 10 + 0 + 681 + 121 + + + + SPI配置区 + + + + + 320 + 60 + 351 + 54 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + 0 + 0 + + + + + CS1_POLA_LOW + + + + + CS1_POLA_HIGH + + + + + + + + + 0 + 0 + + + + 初始化SPI(C0) + + + + + + + + 0 + 0 + + + + + CS2_POLA_LOW + + + + + CS2_POLA_HIGH + + + + + + + + + + 15 + 30 + 71 + 20 + + + + SPI设备列表: + + + + + + 96 + 31 + 261 + 21 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + 380 + 30 + 291 + 25 + + + + + + + 刷新设备列表 + + + + + + + false + + + 关闭设备 + + + + + + + 打开设备 + + + + + + + + + 10 + 60 + 301 + 54 + + + + + + + 模式: + + + + + + + + 模式0 + + + + + 模式1 + + + + + 模式2 + + + + + 模式3 + + + + + + + + + LSB + + + + + MSB + + + + + + + + 时钟频率: + + + + + + + + 8bit + + + + + 16bit + + + + + + + + 数据: + + + + + + + 数据宽度: + + + + + + + + 60MHz + + + + + 30MHz + + + + + 15MHz + + + + + 7.5MHz + + + + + 3.75MHz + + + + + 1.875MHz + + + + + 937.5KHz + + + + + 468.75KHz + + + + + + + + + + + 10 + 840 + 681 + 111 + + + + 日志输出 + + + + + 10 + 30 + 661 + 70 + + + + + + + + 10 + 340 + 681 + 501 + + + + 配置电压区 + + + + + 561 + 30 + 111 + 21 + + + + 发送电压命令 + + + + + + 250 + 30 + 39 + 23 + + + + 子分组: + + + + + + 44 + 30 + 81 + 23 + + + + + 参数归零 + + + + + 同值配置 + + + + + 异值配置 + + + + + + + 164 + 30 + 81 + 23 + + + + + 所有DAC + + + + + A/B分组 + + + + + OPA分组 + + + + + 单个DAC + + + + + + + 130 + 30 + 39 + 23 + + + + 分组: + + + + + + 10 + 30 + 39 + 23 + + + + 命令: + + + + + + 300 + 30 + 101 + 23 + + + + + + + 0 + 60 + 671 + 431 + + + + 16 + + + 16 + + + 16 + + + 20 + + + 40 + + + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 230 + 681 + 111 + + + + 寄存器配置及回读区 + + + + + 480 + 20 + 71 + 21 + + + + FBK_EN + + + + + + 300 + 20 + 61 + 23 + + + + + + + 10 + 20 + 61 + 23 + + + + DAC编号: + + + + + + 570 + 20 + 111 + 21 + + + + TEMPTEST_EN + + + + + + 560 + 80 + 111 + 23 + + + + 寄存器回读 + + + + + + 390 + 20 + 82 + 21 + + + + EN_TADC + + + true + + + + + + 140 + 80 + 241 + 16 + + + + none + + + + + + 110 + 50 + 91 + 21 + + + + TRIG_TADC + + + + + + 240 + 20 + 61 + 23 + + + + DAC通道: + + + + + + 10 + 50 + 91 + 21 + + + + TEST_TADC + + + true + + + + + + 490 + 50 + 61 + 23 + + + + 8 + + + + 0000 + + + + + 0001 + + + + + 0010 + + + + + 0011 + + + + + 0100 + + + + + 0101 + + + + + 0110 + + + + + 0111 + + + + + 1000 + + + + + 1001 + + + + + 1010 + + + + + 1011 + + + + + 1100 + + + + + 1101 + + + + + 1110 + + + + + 1111 + + + + + + + 300 + 50 + 61 + 23 + + + + 0 + + + + 00 + + + + + 01 + + + + + 10 + + + + + 11 + + + + + + + 560 + 50 + 111 + 23 + + + + 寄存器配置 + + + + + + 70 + 20 + 61 + 23 + + + + + 编号1 + + + + + 编号2 + + + + + 编号3 + + + + + 编号4 + + + + + 编号5 + + + + + 编号6 + + + + + 编号7 + + + + + 编号8 + + + + + 编号9 + + + + + 编号10 + + + + + 编号11 + + + + + 编号12 + + + + + 编号13 + + + + + 编号14 + + + + + 编号15 + + + + + 编号16 + + + + + 编号17 + + + + + 编号18 + + + + + 编号19 + + + + + 编号20 + + + + + + + 10 + 80 + 131 + 23 + + + + REG7至REG1读取的值: + + + + + + 410 + 50 + 51 + 23 + + + + ICON18: + + + + + + 210 + 50 + 81 + 23 + + + + N_CLKDIV18: + + + + + + + + 0 + 0 + 703 + 20 + + + + + + + + diff --git a/sp713.ico b/sp713.ico new file mode 100755 index 0000000000000000000000000000000000000000..1bbda7bda66cb91797c0114dce2db6a5611ee9d3 GIT binary patch literal 312065 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 H!>(roM|1w1 literal 0 HcmV?d00001 diff --git a/voltage_file/Vse_psi_-13.00_theta_13.53_opa_1.txt b/voltage_file/Vse_psi_-13.00_theta_13.53_opa_1.txt new file mode 100755 index 0000000..51330f2 --- /dev/null +++ b/voltage_file/Vse_psi_-13.00_theta_13.53_opa_1.txt @@ -0,0 +1,1024 @@ +255 +511 +0 +511 +511 +511 +511 +255 +767 +767 +255 +255 +767 +511 +767 +511 +767 +255 +767 +767 +511 +0 +255 +0 +767 +0 +511 +511 +255 +511 +511 +255 +511 +255 +511 +0 +0 +255 +0 +511 +255 +767 +255 +767 +511 +511 +255 +511 +511 +255 +0 +511 +767 +255 +511 +255 +767 +0 +511 +255 +511 +511 +767 +255 +511 +0 +255 +767 +0 +0 +767 +0 +255 +255 +255 +255 +511 +511 +255 +255 +511 +255 +255 +511 +511 +767 +511 +511 +0 +0 +0 +0 +511 +0 +767 +0 +767 +255 +511 +767 +767 +767 +511 +255 +0 +511 +255 +0 +511 +767 +0 +0 +0 +767 +0 +767 +0 +255 +0 +0 +0 +511 +767 +511 +511 +255 +767 +511 +255 +767 +767 +767 +255 +255 +767 +0 +511 +767 +767 +255 +255 +511 +0 +767 +0 +511 +767 +0 +511 +0 +255 +767 +255 +255 +767 +0 +0 +511 +767 +255 +255 +767 +511 +255 +0 +255 +767 +511 +511 +255 +255 +0 +0 +255 +767 +767 +511 +0 +255 +255 +767 +511 +511 +511 +255 +767 +767 +255 +255 +767 +511 +511 +511 +0 +255 +255 +767 +511 +767 +511 +0 +767 +511 +767 +255 +0 +511 +511 +0 +511 +0 +767 +255 +255 +255 +0 +255 +511 +511 +511 +511 +767 +511 +0 +255 +255 +0 +255 +767 +0 +767 +0 +255 +767 +0 +511 +255 +255 +511 +511 +255 +511 +511 +767 +255 +767 +255 +767 +767 +767 +767 +511 +767 +0 +0 +0 +511 +767 +767 +511 +0 +767 +511 +511 +511 +0 +767 +511 +767 +255 +255 +511 +255 +767 +255 +0 +767 +767 +255 +0 +767 +767 +511 +0 +0 +0 +255 +767 +511 +767 +0 +255 +511 +511 +767 +255 +255 +255 +511 +767 +0 +255 +255 +511 +767 +255 +767 +0 +767 +0 +255 +0 +255 +767 +0 +511 +511 +255 +0 +0 +767 +255 +511 +767 +511 +511 +511 +0 +0 +767 +255 +767 +511 +767 +255 +0 +767 +0 +255 +511 +511 +0 +511 +0 +255 +767 +255 +511 +767 +767 +0 +0 +767 +511 +0 +767 +255 +767 +767 +511 +0 +511 +767 +0 +767 +255 +255 +0 +767 +255 +255 +511 +511 +0 +0 +255 +255 +0 +0 +255 +511 +255 +767 +511 +0 +0 +511 +767 +0 +0 +0 +255 +511 +0 +255 +767 +0 +767 +255 +511 +255 +511 +255 +511 +767 +767 +767 +511 +255 +767 +0 +767 +255 +767 +767 +0 +255 +767 +767 +0 +767 +0 +255 +767 +767 +511 +0 +0 +255 +0 +511 +511 +0 +511 +255 +255 +0 +511 +767 +0 +255 +255 +767 +255 +255 +0 +255 +0 +255 +0 +511 +767 +0 +767 +767 +511 +767 +511 +767 +767 +767 +767 +255 +255 +0 +0 +255 +511 +255 +255 +0 +511 +255 +511 +511 +767 +767 +255 +511 +255 +0 +767 +511 +0 +0 +511 +767 +511 +767 +767 +0 +0 +767 +0 +767 +0 +511 +767 +767 +0 +255 +0 +511 +0 +767 +767 +0 +767 +511 +511 +255 +0 +767 +255 +255 +511 +0 +767 +255 +767 +767 +767 +0 +767 +0 +511 +767 +511 +511 +767 +0 +255 +0 +767 +255 +767 +511 +511 +511 +255 +0 +255 +255 +255 +511 +0 +511 +0 +767 +255 +0 +0 +767 +767 +511 +255 +0 +767 +511 +255 +511 +511 +255 +767 +0 +255 +767 +511 +511 +255 +0 +0 +0 +0 +0 +0 +0 +255 +0 +0 +0 +767 +511 +767 +511 +767 +767 +255 +0 +255 +255 +0 +511 +767 +511 +511 +0 +255 +0 +511 +511 +0 +511 +767 +511 +511 +767 +255 +767 +767 +255 +511 +767 +767 +767 +0 +0 +511 +0 +511 +0 +0 +511 +767 +767 +511 +767 +255 +767 +511 +0 +511 +0 +511 +511 +255 +511 +767 +255 +0 +511 +511 +255 +255 +511 +767 +767 +0 +255 +511 +0 +0 +767 +511 +0 +767 +255 +511 +767 +0 +767 +511 +767 +255 +511 +767 +767 +0 +0 +0 +767 +255 +767 +255 +511 +255 +255 +255 +0 +0 +255 +0 +767 +511 +255 +511 +0 +255 +0 +0 +0 +255 +767 +255 +255 +511 +767 +0 +255 +0 +511 +255 +0 +767 +767 +255 +0 +511 +0 +255 +255 +767 +0 +511 +511 +767 +0 +767 +0 +255 +767 +767 +767 +511 +511 +767 +0 +767 +255 +255 +0 +767 +511 +255 +0 +767 +255 +767 +511 +0 +0 +511 +255 +255 +767 +255 +767 +767 +511 +511 +767 +0 +511 +0 +0 +511 +767 +0 +767 +511 +0 +255 +511 +511 +0 +0 +511 +767 +511 +511 +767 +0 +0 +767 +0 +255 +255 +0 +0 +255 +511 +511 +0 +0 +511 +767 +511 +767 +0 +255 +255 +511 +767 +255 +767 +0 +255 +511 +767 +255 +0 +255 +511 +0 +767 +511 +0 +511 +767 +255 +767 +767 +0 +0 +255 +511 +511 +255 +511 +255 +0 +767 +255 +767 +511 +511 +0 +767 +255 +767 +255 +0 +511 +0 +767 +255 +767 +0 +255 +255 +255 +767 +0 +255 +0 +255 +767 +767 +511 +0 +767 +255 +255 +511 +511 +767 +255 +255 +511 +511 +255 +0 +0 +255 +0 +511 +767 +255 +511 +767 +255 +0 +511 +0 +767 +767 +0 +511 +0 +511 +255 +767 +767 +511 +255 +0 +767 +511 +0 +511 +255 +255 +255 +0 +767 +255 +767 +511 +511 +0 +0 +511 +0 +0 +0 +511 +767 +0 +767 +511 +767 +511 +511 +255 +255 +511 +767 +511 +767 +767 +0 +255 +767 +0 +767 +255 +767 +511 +767 +767 +255 +511 +255 +767 +255 +0 +511 +767 +767 +255 +0 +255 +0 +0 +255 +767 +511 +0 +767 +255 +0 +255 +511 +767 +255 +511 +767 +0 +255 +255 +255 +767 +511 +511 +255 +767 +255 +255 +767 +767 +511 +511 +767 +511 +0 +255 +511 +255 +0 +511 +767 +511 +255 +767 +255 +0 +511 +255 +255 +767 +767 +767 +767 +0 +511 +511 +511 +767 +0 +0 +511 +767 +255 +767 +255 +0 +255 +255 +767 +511 +767 +511 +255 +767 +511 +767 +511 +255 +255 +255 +255 +0 +767 +0 \ No newline at end of file diff --git a/voltage_file/Vse_psi_-14.00_theta_13.53_opa_1.txt b/voltage_file/Vse_psi_-14.00_theta_13.53_opa_1.txt new file mode 100755 index 0000000..50b7923 --- /dev/null +++ b/voltage_file/Vse_psi_-14.00_theta_13.53_opa_1.txt @@ -0,0 +1,1024 @@ +767 +0 +511 +0 +0 +0 +0 +767 +255 +511 +767 +0 +511 +255 +511 +255 +511 +255 +511 +767 +511 +0 +255 +0 +767 +0 +511 +511 +511 +511 +511 +511 +511 +511 +767 +255 +255 +511 +255 +767 +511 +0 +767 +255 +767 +0 +511 +767 +0 +767 +511 +0 +255 +767 +0 +0 +511 +767 +255 +0 +255 +255 +767 +0 +255 +767 +0 +511 +0 +767 +767 +767 +255 +255 +255 +255 +511 +511 +255 +255 +767 +511 +255 +767 +767 +0 +767 +767 +511 +255 +255 +255 +767 +511 +255 +511 +255 +767 +0 +255 +255 +511 +0 +0 +511 +0 +767 +767 +255 +511 +767 +767 +767 +767 +767 +767 +0 +255 +0 +0 +0 +511 +767 +511 +511 +255 +767 +511 +255 +0 +767 +0 +511 +511 +0 +255 +767 +255 +255 +511 +511 +0 +511 +255 +511 +0 +255 +511 +0 +511 +0 +511 +0 +0 +511 +767 +767 +511 +511 +0 +0 +767 +255 +255 +0 +255 +767 +511 +511 +255 +255 +0 +767 +511 +0 +0 +767 +0 +511 +511 +0 +0 +0 +0 +511 +255 +0 +511 +767 +255 +0 +0 +255 +511 +767 +0 +255 +0 +511 +255 +767 +511 +255 +511 +0 +767 +511 +255 +767 +255 +0 +767 +255 +255 +255 +0 +255 +511 +511 +767 +511 +0 +767 +0 +511 +511 +255 +511 +0 +255 +0 +511 +511 +255 +511 +0 +511 +767 +767 +0 +767 +0 +0 +255 +767 +511 +0 +255 +511 +255 +511 +255 +511 +511 +767 +767 +0 +0 +0 +511 +255 +255 +255 +0 +767 +767 +255 +767 +511 +511 +767 +0 +255 +255 +767 +767 +255 +511 +767 +767 +511 +511 +255 +767 +0 +0 +255 +767 +255 +767 +767 +255 +511 +511 +767 +255 +511 +511 +767 +0 +0 +255 +511 +767 +0 +511 +0 +511 +255 +255 +767 +511 +767 +255 +511 +0 +255 +511 +511 +767 +511 +767 +0 +511 +255 +255 +255 +511 +767 +511 +767 +511 +255 +767 +255 +255 +0 +255 +255 +511 +511 +0 +511 +255 +511 +767 +511 +511 +767 +0 +255 +0 +767 +767 +0 +255 +0 +255 +255 +0 +511 +0 +511 +511 +255 +767 +0 +767 +255 +0 +0 +255 +255 +767 +767 +767 +255 +767 +0 +255 +255 +0 +767 +511 +0 +0 +511 +767 +0 +255 +0 +511 +511 +255 +255 +0 +255 +255 +767 +767 +767 +767 +511 +0 +0 +0 +511 +0 +0 +255 +511 +511 +0 +255 +767 +0 +767 +255 +255 +767 +511 +767 +0 +511 +767 +0 +0 +0 +511 +0 +767 +511 +767 +511 +255 +511 +0 +767 +0 +255 +511 +511 +767 +511 +767 +0 +511 +511 +767 +767 +0 +0 +511 +0 +255 +767 +0 +0 +255 +255 +255 +255 +767 +511 +511 +767 +767 +255 +0 +767 +0 +511 +0 +511 +255 +511 +0 +255 +767 +255 +255 +767 +511 +255 +0 +511 +767 +511 +767 +767 +255 +767 +767 +255 +0 +511 +767 +0 +0 +511 +767 +511 +0 +511 +255 +255 +255 +255 +255 +511 +767 +767 +0 +511 +0 +767 +767 +767 +511 +255 +0 +511 +255 +0 +255 +767 +767 +511 +0 +0 +767 +767 +511 +767 +0 +0 +511 +0 +511 +767 +0 +0 +0 +511 +255 +0 +255 +255 +511 +0 +767 +511 +255 +0 +255 +767 +511 +767 +511 +255 +255 +511 +511 +767 +255 +767 +0 +511 +767 +255 +255 +255 +511 +255 +255 +767 +255 +511 +0 +255 +767 +0 +255 +255 +767 +255 +255 +767 +767 +767 +255 +767 +255 +511 +0 +255 +767 +0 +767 +255 +255 +255 +511 +767 +255 +767 +767 +255 +255 +767 +255 +767 +0 +0 +0 +255 +767 +0 +0 +767 +255 +255 +767 +767 +255 +0 +511 +767 +255 +255 +511 +255 +511 +0 +255 +0 +255 +255 +767 +511 +255 +255 +0 +0 +255 +511 +511 +0 +255 +511 +767 +0 +767 +767 +255 +767 +767 +511 +767 +255 +0 +767 +0 +767 +767 +0 +0 +255 +255 +767 +0 +767 +255 +511 +767 +767 +767 +767 +511 +511 +767 +511 +767 +255 +767 +255 +767 +767 +767 +767 +0 +0 +767 +0 +255 +0 +767 +0 +0 +255 +511 +0 +0 +0 +767 +255 +255 +767 +0 +511 +511 +255 +255 +767 +767 +255 +511 +255 +767 +767 +767 +255 +255 +767 +0 +255 +255 +255 +767 +767 +511 +511 +0 +255 +511 +255 +255 +511 +511 +0 +767 +255 +767 +0 +0 +255 +0 +767 +511 +511 +767 +0 +0 +255 +255 +511 +0 +511 +0 +767 +255 +511 +0 +0 +511 +511 +0 +255 +511 +511 +767 +0 +0 +767 +0 +255 +511 +0 +0 +255 +511 +767 +255 +255 +511 +0 +0 +0 +255 +767 +767 +0 +255 +511 +0 +511 +767 +0 +511 +0 +767 +767 +0 +511 +511 +255 +767 +0 +511 +767 +767 +255 +767 +0 +255 +255 +511 +255 +255 +255 +255 +767 +0 +767 +767 +767 +255 +0 +255 +255 +255 +255 +0 +255 +255 +511 +511 +255 +255 +511 +767 +0 +511 +511 +511 +767 +511 +255 +255 +511 +255 +767 +767 +255 +0 +511 +767 +0 +511 +511 +767 +767 +0 +0 +0 +767 +511 +255 +511 +767 +255 +0 +767 +255 +767 +767 +255 +511 +0 +511 +511 +767 +0 +767 +511 +255 +255 +511 +511 +767 +511 +767 +511 +255 +255 +0 +255 +255 +0 +0 +767 +255 +0 +767 +767 +255 +511 +767 +511 +255 +511 +511 +255 +0 +255 +511 +767 +511 +767 +767 +255 +767 +0 +0 +767 +511 +0 +767 +767 +0 +255 +767 +511 +511 +511 +0 +767 +0 +511 +511 +511 +767 +511 +511 +767 +255 +255 +767 +255 +767 +767 +767 +255 +767 +767 +511 +0 +0 +255 +0 +767 +767 +511 +255 +255 +767 +255 +255 +0 +0 +0 +511 +0 +255 +255 +511 +767 +511 +255 +0 +767 +0 +767 +255 +767 +255 +255 +511 +511 +255 +255 +255 +767 +255 +767 +255 +511 +511 +767 +767 +255 +0 +255 +767 +0 +255 +0 +255 +767 +511 +511 +767 +255 +767 +511 +767 +511 +255 +767 +0 +767 +767 +0 +0 \ No newline at end of file diff --git a/voltage_file/Vse_psi_-15.00_theta_13.53_opa_1.txt b/voltage_file/Vse_psi_-15.00_theta_13.53_opa_1.txt new file mode 100755 index 0000000..f3ee554 --- /dev/null +++ b/voltage_file/Vse_psi_-15.00_theta_13.53_opa_1.txt @@ -0,0 +1,1024 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +511 +255 +511 +255 +767 +767 +767 +255 +511 +255 +0 +255 +767 +767 +767 +0 +0 +767 +0 +0 +255 +767 +767 +0 +767 +255 +0 +511 +255 +0 +511 +767 +255 +511 +767 +511 +255 +767 +0 +767 +0 +767 +255 +767 +0 +767 +255 +255 +767 +0 +255 +0 +255 +767 +255 +0 +0 +255 +511 +767 +511 +511 +0 +0 +511 +767 +255 +0 +767 +255 +255 +511 +255 +511 +0 +0 +0 +0 +511 +0 +0 +255 +0 +511 +767 +0 +255 +255 +767 +767 +511 +0 +767 +767 +255 +511 +767 +0 +767 +767 +0 +767 +255 +511 +255 +255 +255 +767 +0 +767 +767 +767 +255 +0 +767 +511 +255 +511 +767 +0 +511 +767 +255 +767 +767 +255 +255 +767 +255 +767 +255 +767 +0 +255 +767 +255 +767 +255 +0 +0 +511 +767 +767 +511 +511 +0 +255 +767 +511 +255 +255 +511 +0 +767 +767 +511 +511 +255 +255 +767 +511 +255 +0 +511 +0 +0 +511 +511 +511 +511 +0 +767 +767 +255 +511 +0 +767 +767 +767 +255 +511 +767 +255 +0 +255 +255 +767 +511 +255 +511 +255 +767 +511 +255 +767 +511 +255 +767 +511 +255 +511 +511 +511 +767 +0 +255 +0 +255 +255 +511 +767 +0 +767 +0 +511 +767 +767 +0 +255 +0 +0 +511 +255 +511 +511 +767 +511 +767 +767 +255 +767 +255 +767 +255 +511 +255 +511 +255 +511 +767 +767 +767 +0 +767 +767 +255 +0 +0 +767 +511 +767 +255 +0 +511 +255 +511 +767 +767 +767 +255 +767 +511 +255 +511 +767 +767 +511 +511 +511 +767 +0 +0 +255 +767 +511 +0 +0 +511 +767 +0 +0 +767 +767 +0 +0 +255 +511 +767 +0 +255 +511 +0 +767 +255 +767 +0 +511 +255 +255 +767 +255 +767 +0 +511 +255 +511 +255 +767 +255 +511 +0 +255 +0 +767 +767 +511 +767 +511 +511 +0 +511 +255 +0 +255 +511 +511 +767 +255 +767 +767 +767 +511 +0 +255 +255 +0 +767 +0 +511 +255 +767 +767 +255 +767 +767 +767 +255 +767 +0 +511 +0 +767 +767 +511 +255 +0 +767 +0 +0 +511 +767 +767 +255 +767 +0 +0 +767 +255 +0 +767 +0 +255 +767 +255 +255 +511 +511 +767 +767 +511 +767 +511 +767 +767 +255 +255 +0 +511 +255 +255 +767 +767 +0 +511 +511 +0 +255 +255 +511 +511 +255 +0 +767 +255 +255 +767 +511 +767 +0 +511 +767 +255 +767 +255 +0 +255 +767 +767 +0 +767 +511 +767 +511 +767 +255 +511 +255 +0 +511 +767 +255 +255 +767 +0 +255 +255 +511 +767 +255 +767 +0 +511 +767 +511 +0 +255 +255 +255 +767 +511 +511 +767 +767 +0 +0 +0 +767 +511 +767 +511 +255 +511 +0 +0 +255 +511 +511 +0 +767 +511 +511 +0 +255 +767 +0 +0 +767 +767 +255 +767 +511 +0 +255 +511 +767 +255 +511 +511 +511 +255 +0 +0 +0 +511 +0 +0 +511 +511 +511 +767 +511 +767 +767 +255 +255 +0 +767 +255 +767 +511 +767 +255 +0 +255 +511 +511 +511 +0 +511 +255 +0 +767 +511 +0 +255 +767 +0 +0 +767 +767 +255 +767 +255 +255 +767 +0 +0 +0 +767 +255 +511 +255 +511 +511 +767 +511 +767 +767 +0 +255 +511 +255 +511 +0 +255 +767 +767 +0 +0 +511 +0 +511 +767 +511 +767 +0 +255 +0 +0 +0 +511 +0 +255 +767 +767 +767 +0 +767 +511 +511 +255 +511 +255 +0 +767 +511 +511 +511 +767 +767 +767 +0 +0 +511 +255 +0 +511 +0 +511 +511 +511 +0 +0 +511 +511 +511 +0 +0 +511 +511 +0 +767 +0 +511 +511 +767 +255 +767 +255 +0 +255 +767 +255 +511 +767 +511 +255 +255 +255 +255 +255 +511 +767 +255 +0 +767 +0 +255 +511 +0 +255 +0 +767 +511 +511 +511 +511 +0 +511 +0 +255 +511 +767 +767 +0 +255 +767 +255 +0 +255 +511 +255 +511 +511 +511 +255 +767 +767 +511 +0 +767 +255 +767 +0 +511 +767 +0 +0 +255 +255 +255 +511 +255 +255 +255 +255 +767 +511 +255 +255 +255 +767 +767 +255 +511 +0 +0 +767 +255 +255 +511 +511 +0 +255 +511 +255 +511 +767 +0 +767 +767 +0 +255 +0 +767 +511 +511 +511 +255 +255 +511 +511 +255 +511 +511 +255 +255 +511 +0 +255 +0 +511 +0 +767 +767 +255 +255 +511 +0 +767 +767 +0 +255 +767 +767 +255 +767 +255 +511 +511 +0 +0 +511 +0 +767 +511 +767 +255 +255 +0 +0 +511 +511 +255 +511 +511 +0 +0 +511 +511 +255 +767 +511 +511 +767 +255 +255 +511 +767 +255 +767 +0 +511 +0 +255 +0 +511 +511 +767 +511 +255 +0 +767 +0 +511 +767 +767 +511 +0 +255 +511 +255 +767 +767 +511 +511 +255 +0 +255 +0 +0 +0 +0 +511 +767 +255 +511 +511 +511 +767 +767 +767 +0 +767 +767 +0 +255 +511 +0 +255 +255 +511 +255 +255 +0 +511 +255 +767 +511 +0 +0 +511 +767 +0 +255 +511 +767 +0 +0 +255 +255 +511 +767 +511 +767 +255 +511 +255 +767 +511 +0 +255 +511 +255 +511 +767 +255 +0 +255 +0 +0 +0 +511 +255 +255 +511 +511 +511 +0 +255 +0 +767 +255 +0 +767 +511 +511 +0 +767 +767 +511 +255 +511 +767 +255 +255 +767 +255 +255 +255 +255 +0 +511 +767 +0 +0 +511 +0 +255 +511 +0 +0 +511 +0 +767 +255 +767 +511 +511 +0 +511 +255 +255 +767 +255 +255 +0 +511 +255 +511 +511 +255 +0 +511 +255 +767 +767 +767 +0 +511 +255 +511 +767 +0 +0 +255 +0 +767 +511 +511 +767 +0 +767 +511 +0 +511 +0 +767 +255 +511 +767 +255 +255 +255 +0 +511 +0 +511 +255 +0 +511 +0 +767 +767 +767 +0 +0 +0 +255 +255 +767 +0 +255 +511 +0 +0 +0 +767 +255 +0 +255 +0 +0 +255 +0 +511 +767 +255 +255 +0 +767 +255 +511 +767 +511 +511 +255 +255 +255 +511 \ No newline at end of file diff --git a/voltage_file/Vse_psi_-16.00_theta_13.52_opa_1.txt b/voltage_file/Vse_psi_-16.00_theta_13.52_opa_1.txt new file mode 100755 index 0000000..238e0d3 --- /dev/null +++ b/voltage_file/Vse_psi_-16.00_theta_13.52_opa_1.txt @@ -0,0 +1,1024 @@ +767 +0 +767 +255 +255 +511 +511 +255 +767 +0 +511 +511 +0 +767 +255 +767 +255 +767 +255 +511 +255 +0 +0 +0 +767 +255 +511 +767 +767 +767 +0 +767 +0 +0 +255 +767 +767 +255 +0 +511 +255 +767 +511 +255 +767 +767 +511 +0 +255 +767 +767 +255 +511 +255 +255 +255 +767 +255 +511 +511 +0 +0 +255 +767 +0 +511 +767 +511 +0 +767 +767 +0 +255 +511 +511 +511 +767 +0 +511 +511 +0 +0 +767 +255 +255 +767 +511 +511 +255 +0 +255 +0 +767 +255 +255 +511 +255 +767 +0 +511 +511 +767 +255 +255 +0 +511 +255 +255 +767 +255 +511 +511 +511 +511 +767 +511 +0 +255 +0 +0 +0 +767 +0 +767 +767 +511 +255 +0 +767 +511 +255 +767 +0 +255 +511 +0 +511 +0 +0 +511 +511 +0 +511 +255 +511 +255 +511 +767 +255 +767 +255 +767 +511 +511 +767 +255 +255 +0 +255 +767 +767 +511 +0 +0 +0 +255 +767 +511 +511 +255 +511 +255 +255 +767 +255 +255 +0 +511 +0 +0 +511 +511 +511 +767 +255 +0 +0 +511 +511 +255 +255 +0 +255 +511 +0 +255 +511 +511 +767 +767 +255 +0 +767 +255 +767 +255 +0 +0 +511 +0 +767 +511 +255 +255 +255 +255 +255 +767 +767 +0 +767 +255 +255 +511 +767 +0 +767 +255 +767 +0 +767 +0 +255 +0 +255 +767 +511 +767 +0 +255 +767 +255 +0 +511 +0 +767 +255 +767 +0 +767 +0 +767 +255 +255 +511 +511 +0 +511 +511 +255 +0 +0 +767 +255 +767 +255 +255 +767 +511 +767 +0 +511 +511 +511 +767 +0 +767 +0 +255 +255 +255 +0 +767 +255 +511 +511 +0 +511 +0 +767 +767 +255 +511 +511 +767 +511 +511 +767 +0 +255 +511 +511 +767 +255 +511 +255 +767 +255 +0 +255 +511 +511 +511 +0 +511 +0 +0 +767 +767 +767 +767 +0 +511 +767 +511 +511 +767 +0 +255 +255 +255 +255 +0 +511 +0 +767 +767 +0 +255 +255 +511 +0 +511 +511 +511 +255 +767 +767 +255 +0 +767 +767 +255 +255 +767 +767 +511 +0 +0 +511 +511 +255 +255 +511 +255 +0 +255 +767 +255 +255 +0 +255 +511 +0 +255 +255 +511 +255 +511 +767 +0 +0 +511 +511 +0 +0 +511 +767 +0 +255 +255 +767 +511 +511 +767 +511 +511 +511 +0 +511 +255 +511 +255 +511 +767 +767 +255 +767 +767 +255 +511 +255 +767 +767 +511 +255 +0 +767 +255 +0 +767 +255 +511 +0 +511 +767 +511 +767 +767 +767 +255 +511 +767 +511 +255 +511 +0 +767 +0 +0 +511 +767 +255 +767 +0 +255 +0 +767 +0 +255 +767 +511 +255 +0 +255 +511 +0 +767 +255 +0 +255 +511 +0 +767 +0 +255 +255 +511 +511 +511 +255 +255 +767 +255 +0 +255 +255 +0 +511 +0 +255 +767 +511 +255 +0 +767 +0 +511 +255 +255 +511 +0 +255 +767 +511 +0 +255 +767 +767 +255 +255 +255 +511 +511 +0 +255 +255 +255 +511 +255 +767 +0 +255 +0 +0 +767 +511 +255 +0 +511 +767 +255 +255 +511 +767 +0 +511 +511 +0 +0 +0 +767 +767 +767 +511 +255 +0 +767 +511 +511 +767 +255 +255 +0 +511 +767 +767 +255 +255 +511 +767 +767 +511 +0 +511 +0 +255 +0 +767 +511 +767 +767 +0 +511 +511 +255 +511 +255 +511 +0 +0 +255 +255 +767 +0 +767 +255 +767 +0 +255 +767 +0 +511 +255 +0 +511 +767 +511 +0 +511 +511 +511 +767 +255 +0 +0 +767 +0 +767 +0 +255 +767 +0 +0 +511 +0 +0 +511 +255 +255 +511 +255 +767 +511 +511 +0 +0 +767 +767 +511 +255 +255 +255 +767 +0 +0 +511 +0 +255 +255 +0 +511 +767 +511 +767 +511 +767 +0 +511 +0 +0 +255 +767 +0 +255 +255 +511 +767 +0 +511 +767 +767 +255 +767 +255 +0 +511 +767 +511 +767 +511 +511 +511 +255 +255 +511 +767 +0 +0 +511 +0 +767 +255 +255 +0 +767 +767 +0 +767 +767 +0 +0 +767 +767 +255 +767 +255 +511 +255 +511 +767 +767 +511 +767 +255 +255 +767 +0 +255 +511 +767 +255 +255 +255 +255 +767 +511 +511 +511 +255 +0 +511 +0 +511 +511 +0 +255 +255 +511 +767 +0 +255 +511 +767 +255 +511 +767 +255 +255 +0 +767 +767 +767 +767 +255 +255 +767 +255 +0 +767 +767 +255 +0 +255 +0 +0 +0 +511 +767 +0 +0 +255 +0 +511 +0 +0 +255 +767 +767 +255 +767 +255 +767 +767 +255 +255 +0 +255 +255 +255 +511 +0 +0 +767 +0 +511 +511 +0 +255 +511 +0 +0 +511 +767 +255 +767 +511 +767 +0 +255 +255 +767 +0 +511 +0 +255 +767 +0 +511 +0 +0 +255 +255 +767 +767 +511 +255 +511 +0 +255 +255 +0 +511 +767 +0 +767 +511 +0 +255 +0 +0 +767 +511 +0 +0 +0 +255 +255 +767 +0 +0 +511 +511 +0 +767 +255 +255 +0 +767 +255 +511 +767 +255 +511 +511 +767 +511 +511 +255 +511 +511 +255 +767 +511 +255 +0 +255 +511 +767 +0 +511 +511 +767 +0 +767 +255 +511 +255 +255 +767 +255 +0 +767 +511 +767 +0 +511 +255 +511 +0 +255 +255 +511 +511 +255 +0 +0 +511 +511 +767 +767 +767 +767 +767 +511 +0 +255 +511 +0 +0 +0 +255 +255 +511 +255 +767 +255 +255 +255 +0 +511 +0 +0 +0 +0 +767 +767 +255 +767 +0 +255 +767 +255 +511 +0 +767 +255 +255 +255 +767 +767 +767 +511 +0 +255 +255 +511 +0 +511 +511 +767 +767 +511 +0 +0 +767 +255 +0 +511 +255 +511 +255 +0 +511 +511 +255 +255 +511 +767 +767 +767 +511 +511 +0 +255 +767 +255 +255 +0 +255 +0 +767 +255 +511 +767 +767 +0 +0 +255 +511 +767 +767 +255 +0 +767 +255 +255 +767 +767 +0 +767 +0 +511 +767 +255 +255 +255 +0 +0 +511 +767 +255 +511 +255 +0 +511 +511 +767 +767 +255 +0 +767 +255 +511 +767 +0 +767 +511 +255 +767 +767 +511 +255 +255 \ No newline at end of file diff --git a/voltage_file/Vse_psi_0.00_theta_13.52_opa_1.txt b/voltage_file/Vse_psi_0.00_theta_13.52_opa_1.txt new file mode 100755 index 0000000..e69de29 diff --git a/voltage_file/Vse_psi_11.00_theta_13.52_opa_1.txt b/voltage_file/Vse_psi_11.00_theta_13.52_opa_1.txt new file mode 100755 index 0000000..0ffd535 --- /dev/null +++ b/voltage_file/Vse_psi_11.00_theta_13.52_opa_1.txt @@ -0,0 +1,1024 @@ +255 +767 +0 +0 +511 +0 +255 +511 +511 +255 +0 +511 +511 +767 +511 +511 +255 +511 +255 +0 +255 +0 +767 +0 +255 +0 +0 +255 +767 +511 +0 +255 +767 +255 +767 +767 +255 +0 +255 +255 +255 +255 +511 +511 +511 +255 +255 +0 +511 +511 +0 +0 +511 +511 +255 +767 +511 +255 +255 +511 +255 +767 +511 +255 +0 +255 +767 +767 +767 +0 +255 +0 +767 +255 +767 +255 +0 +511 +511 +0 +767 +255 +511 +511 +767 +511 +511 +255 +255 +767 +0 +511 +511 +511 +767 +511 +767 +767 +255 +255 +767 +255 +255 +511 +767 +767 +767 +255 +255 +0 +767 +255 +511 +0 +511 +767 +767 +255 +767 +0 +511 +511 +255 +255 +767 +0 +0 +255 +511 +511 +767 +511 +255 +0 +767 +511 +511 +511 +0 +767 +255 +255 +0 +0 +767 +0 +511 +255 +255 +255 +255 +0 +0 +767 +511 +255 +767 +767 +511 +255 +767 +0 +0 +255 +511 +255 +255 +511 +767 +255 +767 +767 +255 +255 +255 +511 +767 +511 +511 +0 +0 +255 +767 +255 +255 +511 +767 +767 +255 +255 +511 +0 +511 +255 +0 +767 +511 +767 +511 +0 +767 +0 +255 +0 +0 +255 +255 +511 +511 +511 +767 +767 +0 +0 +767 +0 +511 +511 +0 +511 +767 +767 +767 +767 +511 +0 +0 +0 +0 +767 +0 +767 +255 +255 +0 +0 +0 +767 +255 +0 +0 +767 +255 +255 +0 +255 +255 +0 +511 +767 +255 +767 +511 +255 +511 +0 +255 +255 +767 +767 +0 +255 +767 +767 +0 +0 +767 +511 +767 +511 +0 +767 +255 +0 +0 +511 +255 +767 +511 +255 +511 +767 +0 +0 +511 +767 +767 +767 +511 +767 +255 +0 +767 +511 +0 +0 +511 +255 +767 +511 +0 +767 +0 +0 +767 +767 +767 +767 +767 +255 +255 +511 +0 +767 +0 +511 +255 +511 +767 +255 +767 +511 +255 +0 +255 +511 +0 +0 +511 +767 +511 +511 +767 +0 +511 +0 +255 +767 +511 +255 +767 +767 +511 +0 +511 +511 +255 +255 +767 +0 +0 +511 +511 +511 +767 +255 +255 +255 +511 +0 +767 +0 +767 +255 +767 +511 +255 +255 +0 +511 +767 +511 +0 +0 +511 +0 +767 +767 +511 +255 +0 +0 +255 +511 +255 +767 +511 +511 +511 +511 +255 +767 +511 +767 +511 +511 +255 +511 +511 +0 +255 +0 +0 +0 +767 +0 +767 +767 +255 +255 +767 +0 +0 +255 +767 +767 +767 +0 +0 +255 +255 +0 +767 +767 +511 +255 +255 +255 +511 +0 +767 +511 +255 +255 +767 +0 +255 +0 +0 +767 +255 +767 +767 +0 +511 +0 +255 +511 +511 +767 +767 +255 +0 +0 +767 +767 +511 +767 +511 +0 +511 +255 +0 +255 +511 +255 +511 +511 +767 +255 +511 +767 +511 +511 +0 +255 +511 +0 +0 +0 +511 +767 +767 +767 +0 +255 +0 +0 +767 +255 +0 +0 +511 +511 +767 +511 +255 +255 +511 +767 +0 +511 +255 +511 +255 +0 +511 +255 +255 +767 +511 +255 +511 +255 +0 +0 +0 +511 +511 +767 +255 +255 +511 +767 +255 +255 +0 +0 +0 +511 +255 +255 +511 +767 +767 +511 +255 +767 +767 +0 +0 +0 +0 +767 +255 +511 +767 +0 +255 +511 +511 +767 +511 +0 +0 +255 +767 +767 +0 +255 +767 +255 +511 +511 +255 +255 +767 +255 +767 +767 +0 +0 +255 +511 +255 +0 +0 +767 +511 +511 +0 +767 +767 +0 +511 +255 +255 +767 +767 +511 +0 +255 +0 +0 +0 +767 +511 +511 +767 +511 +255 +255 +0 +767 +767 +767 +255 +0 +255 +511 +511 +511 +255 +511 +0 +767 +255 +511 +767 +255 +511 +511 +767 +255 +0 +255 +0 +511 +511 +0 +767 +0 +767 +767 +511 +511 +255 +255 +255 +255 +255 +0 +767 +511 +255 +767 +255 +255 +767 +511 +511 +511 +511 +767 +511 +511 +0 +767 +255 +767 +255 +511 +0 +0 +511 +767 +0 +511 +255 +767 +767 +767 +0 +767 +511 +767 +255 +255 +767 +255 +767 +511 +767 +255 +0 +0 +0 +0 +511 +255 +767 +511 +767 +511 +0 +511 +255 +0 +767 +255 +0 +255 +511 +767 +511 +0 +511 +511 +255 +255 +511 +767 +255 +255 +767 +0 +0 +511 +767 +767 +255 +511 +0 +0 +511 +255 +767 +255 +255 +511 +511 +0 +255 +767 +767 +0 +255 +0 +255 +0 +767 +511 +767 +0 +511 +255 +511 +511 +767 +511 +0 +767 +767 +767 +767 +255 +255 +767 +255 +0 +255 +255 +767 +255 +0 +511 +767 +511 +255 +767 +0 +0 +511 +767 +511 +255 +767 +767 +0 +255 +767 +511 +255 +767 +767 +511 +255 +511 +511 +0 +511 +255 +767 +767 +511 +767 +255 +0 +767 +767 +255 +511 +767 +255 +511 +0 +767 +767 +511 +255 +511 +767 +511 +255 +0 +511 +255 +255 +0 +255 +511 +767 +511 +511 +0 +511 +255 +767 +511 +767 +0 +767 +767 +767 +255 +0 +511 +511 +767 +767 +511 +0 +0 +767 +767 +767 +767 +255 +511 +255 +511 +511 +767 +767 +0 +255 +0 +511 +255 +0 +511 +255 +511 +255 +767 +511 +255 +255 +767 +767 +511 +767 +767 +0 +767 +511 +255 +255 +0 +0 +767 +0 +767 +255 +511 +511 +0 +0 +255 +0 +0 +767 +767 +255 +767 +767 +767 +767 +255 +511 +511 +0 +767 +511 +767 +767 +511 +0 +0 +511 +255 +511 +767 +0 +767 +511 +767 +255 +255 +511 +255 +255 +0 +767 +0 +0 +0 +0 +767 +511 +767 +255 +511 +255 +255 +511 +511 +255 +0 +511 +767 +511 +767 +255 +767 +0 +0 +255 +255 +255 +511 +255 +0 +0 +511 +511 +511 +255 +767 +0 +511 +767 +0 +255 +0 +767 +511 +767 +0 +511 +767 +255 +767 +511 +0 +767 +767 +0 +255 +255 +767 +0 +255 +255 +255 +511 +511 +511 +0 +767 +511 +0 +767 +767 +767 +511 +0 +0 +767 +255 +255 +0 +0 +767 +0 +255 +511 +255 +767 +511 +767 +511 +767 +511 +0 +255 +511 +0 +511 +255 +255 +255 +511 +255 \ No newline at end of file diff --git a/voltage_file/Vse_psi_16.00_theta_13.53_opa_1.txt b/voltage_file/Vse_psi_16.00_theta_13.53_opa_1.txt new file mode 100755 index 0000000..6a8244f --- /dev/null +++ b/voltage_file/Vse_psi_16.00_theta_13.53_opa_1.txt @@ -0,0 +1,1024 @@ +767 +255 +255 +255 +511 +0 +255 +255 +255 +767 +511 +0 +767 +767 +255 +511 +0 +0 +767 +511 +511 +255 +767 +0 +0 +767 +511 +0 +255 +767 +255 +255 +767 +0 +767 +511 +767 +511 +511 +511 +511 +255 +511 +255 +255 +767 +767 +255 +767 +767 +0 +0 +511 +255 +0 +255 +0 +767 +511 +511 +255 +767 +511 +0 +767 +511 +255 +0 +767 +0 +255 +767 +511 +0 +255 +511 +255 +511 +511 +0 +767 +0 +0 +767 +255 +767 +0 +511 +255 +511 +767 +255 +255 +0 +255 +767 +0 +767 +255 +0 +255 +767 +767 +0 +0 +767 +0 +255 +0 +767 +255 +767 +0 +255 +767 +0 +511 +255 +255 +511 +0 +0 +511 +511 +0 +0 +0 +0 +0 +255 +255 +0 +767 +255 +0 +511 +255 +255 +511 +255 +767 +511 +255 +255 +767 +767 +255 +0 +767 +767 +511 +255 +255 +511 +255 +0 +511 +255 +767 +767 +255 +255 +0 +255 +511 +0 +0 +0 +255 +511 +0 +0 +255 +0 +0 +255 +255 +255 +0 +255 +0 +255 +767 +0 +767 +0 +255 +0 +511 +511 +511 +0 +255 +0 +767 +255 +0 +0 +767 +0 +767 +767 +0 +767 +511 +511 +511 +767 +767 +511 +511 +511 +511 +767 +255 +511 +767 +511 +767 +511 +767 +511 +511 +255 +767 +255 +511 +0 +767 +511 +767 +255 +767 +767 +511 +255 +255 +767 +255 +767 +767 +511 +767 +511 +0 +255 +255 +767 +511 +511 +0 +255 +0 +511 +767 +0 +767 +767 +0 +255 +255 +511 +511 +511 +255 +767 +255 +0 +767 +767 +255 +767 +0 +511 +511 +767 +767 +255 +767 +255 +511 +767 +767 +511 +255 +511 +0 +0 +767 +767 +0 +767 +511 +0 +511 +511 +767 +255 +767 +255 +767 +511 +0 +511 +255 +255 +0 +0 +767 +255 +255 +255 +511 +255 +255 +0 +511 +255 +767 +0 +255 +767 +511 +255 +511 +767 +0 +767 +255 +511 +0 +0 +511 +255 +0 +0 +767 +0 +511 +767 +255 +255 +0 +255 +0 +511 +255 +0 +511 +767 +511 +0 +767 +0 +767 +255 +255 +0 +0 +511 +511 +255 +0 +511 +511 +511 +767 +767 +767 +0 +0 +767 +0 +0 +511 +767 +511 +255 +0 +511 +255 +767 +0 +511 +0 +511 +255 +255 +767 +767 +511 +255 +511 +511 +255 +255 +767 +0 +767 +255 +511 +0 +0 +767 +0 +511 +255 +255 +511 +255 +767 +255 +767 +255 +511 +255 +255 +0 +511 +0 +255 +0 +511 +255 +767 +767 +767 +255 +767 +0 +767 +255 +0 +767 +0 +511 +511 +255 +255 +511 +511 +767 +511 +255 +0 +511 +511 +767 +255 +767 +511 +767 +767 +767 +0 +0 +511 +767 +511 +767 +255 +511 +511 +767 +767 +511 +767 +511 +767 +0 +255 +255 +767 +0 +0 +0 +0 +0 +767 +767 +767 +255 +0 +0 +511 +0 +767 +767 +511 +0 +767 +0 +0 +767 +767 +511 +0 +767 +511 +0 +511 +767 +511 +511 +255 +255 +255 +767 +767 +255 +0 +511 +511 +255 +255 +0 +0 +767 +255 +511 +255 +767 +767 +255 +0 +767 +511 +511 +511 +511 +255 +0 +255 +0 +255 +511 +511 +0 +0 +0 +511 +255 +511 +511 +511 +255 +255 +0 +767 +255 +767 +511 +0 +767 +511 +0 +0 +767 +767 +0 +511 +767 +255 +0 +767 +767 +255 +255 +767 +511 +767 +0 +767 +767 +511 +0 +0 +767 +511 +0 +767 +0 +0 +511 +511 +511 +767 +767 +511 +255 +767 +767 +511 +255 +511 +767 +767 +255 +255 +0 +511 +511 +0 +767 +0 +511 +0 +767 +0 +0 +0 +767 +0 +767 +0 +511 +255 +255 +511 +767 +511 +767 +767 +255 +767 +511 +511 +0 +0 +511 +255 +255 +767 +767 +255 +511 +0 +255 +511 +255 +511 +767 +0 +255 +0 +255 +767 +511 +767 +767 +511 +767 +0 +511 +255 +255 +0 +511 +511 +0 +255 +255 +767 +767 +255 +767 +255 +767 +255 +767 +767 +767 +767 +255 +0 +0 +511 +767 +0 +255 +0 +511 +255 +511 +511 +255 +0 +511 +511 +255 +511 +0 +255 +767 +255 +767 +767 +255 +767 +511 +511 +767 +0 +0 +511 +255 +511 +255 +255 +767 +255 +255 +767 +0 +255 +511 +255 +255 +511 +0 +0 +767 +0 +0 +767 +255 +767 +0 +767 +0 +0 +255 +511 +767 +767 +0 +0 +511 +255 +767 +0 +0 +767 +511 +767 +255 +255 +255 +511 +767 +511 +0 +0 +0 +511 +255 +767 +511 +767 +511 +255 +255 +767 +255 +255 +255 +0 +0 +255 +511 +0 +511 +0 +255 +767 +511 +0 +0 +255 +767 +511 +0 +0 +0 +0 +0 +0 +511 +255 +511 +0 +511 +511 +0 +0 +511 +0 +0 +767 +511 +511 +0 +0 +511 +511 +0 +767 +511 +255 +0 +0 +255 +0 +511 +255 +255 +511 +0 +511 +511 +0 +255 +767 +511 +0 +255 +255 +511 +255 +0 +255 +767 +0 +767 +255 +767 +255 +255 +0 +255 +511 +255 +0 +767 +767 +511 +511 +767 +767 +767 +511 +767 +767 +767 +767 +767 +511 +767 +767 +0 +767 +255 +767 +255 +255 +255 +511 +511 +255 +0 +511 +511 +511 +767 +511 +0 +767 +767 +255 +255 +767 +0 +767 +0 +0 +255 +0 +255 +255 +767 +255 +511 +511 +767 +255 +0 +0 +0 +511 +511 +511 +511 +511 +767 +255 +767 +511 +0 +0 +255 +255 +255 +511 +255 +0 +511 +255 +0 +0 +255 +0 +767 +511 +255 +255 +255 +0 +0 +255 +0 +767 +511 +767 +255 +255 +511 +511 +255 +511 +255 +255 +0 +255 +511 +255 +255 +255 +255 +0 +0 +255 +767 +511 +255 +0 +0 +255 +767 +255 +767 +767 +767 +255 +511 +0 +0 +511 +511 +767 +767 +0 +255 +0 +511 +0 +0 +255 +511 +767 +511 +0 +255 +0 +255 +0 +767 +767 +0 +255 +255 +767 +255 +511 +0 +0 +255 +511 +511 +255 +255 +255 +0 +767 +511 +511 +767 +0 +767 +511 +255 +0 +767 +0 +255 +511 +255 +767 +255 +255 +0 +255 +511 +511 +0 \ No newline at end of file diff --git a/voltage_file/Vse_psi_5.00_theta_13.53_opa_1.txt b/voltage_file/Vse_psi_5.00_theta_13.53_opa_1.txt new file mode 100755 index 0000000..24d7f49 --- /dev/null +++ b/voltage_file/Vse_psi_5.00_theta_13.53_opa_1.txt @@ -0,0 +1,1024 @@ +255 +0 +511 +511 +0 +511 +255 +511 +511 +511 +511 +255 +255 +511 +255 +767 +511 +767 +767 +511 +0 +0 +767 +255 +511 +255 +511 +0 +511 +255 +0 +255 +0 +511 +511 +511 +0 +767 +255 +255 +767 +767 +0 +255 +255 +0 +255 +0 +0 +0 +511 +767 +511 +511 +511 +0 +0 +0 +767 +255 +255 +767 +767 +767 +511 +767 +511 +511 +767 +0 +511 +255 +255 +0 +511 +0 +0 +511 +767 +511 +511 +767 +255 +255 +767 +767 +0 +767 +767 +255 +767 +511 +767 +767 +255 +0 +511 +511 +0 +0 +767 +511 +511 +255 +255 +511 +767 +255 +511 +255 +0 +767 +255 +767 +511 +0 +0 +767 +0 +511 +255 +511 +255 +511 +255 +511 +511 +767 +255 +511 +0 +767 +767 +511 +255 +255 +255 +511 +0 +0 +511 +767 +767 +767 +767 +0 +767 +511 +767 +767 +767 +767 +0 +767 +511 +511 +0 +511 +255 +0 +767 +0 +255 +767 +0 +0 +0 +255 +767 +255 +0 +255 +767 +767 +0 +511 +767 +767 +767 +511 +511 +0 +511 +255 +255 +767 +255 +255 +0 +0 +511 +0 +511 +511 +511 +255 +255 +511 +511 +0 +0 +255 +767 +767 +767 +0 +255 +511 +767 +767 +255 +255 +767 +0 +767 +255 +767 +767 +511 +255 +767 +767 +767 +0 +767 +511 +767 +767 +767 +767 +0 +767 +511 +767 +767 +767 +0 +767 +511 +255 +511 +511 +767 +0 +0 +255 +255 +255 +0 +511 +0 +511 +511 +255 +767 +255 +255 +511 +0 +255 +511 +0 +511 +0 +511 +511 +0 +0 +511 +255 +0 +511 +0 +0 +511 +767 +0 +511 +511 +255 +511 +0 +511 +511 +255 +767 +767 +767 +767 +0 +511 +511 +511 +255 +0 +0 +767 +767 +255 +0 +0 +767 +0 +255 +0 +255 +255 +255 +511 +255 +511 +767 +255 +511 +511 +511 +255 +255 +767 +511 +0 +767 +767 +767 +0 +511 +255 +0 +767 +255 +0 +511 +767 +0 +767 +0 +767 +511 +255 +0 +767 +767 +0 +255 +0 +0 +255 +0 +767 +255 +255 +511 +255 +767 +511 +255 +255 +511 +255 +511 +511 +511 +511 +511 +767 +767 +511 +767 +0 +0 +511 +0 +0 +511 +767 +767 +511 +511 +511 +255 +255 +511 +511 +0 +0 +767 +767 +767 +511 +255 +767 +511 +511 +511 +255 +255 +511 +0 +0 +511 +767 +767 +255 +255 +0 +511 +511 +511 +0 +0 +767 +0 +511 +767 +0 +255 +767 +767 +255 +511 +767 +767 +255 +511 +255 +511 +767 +511 +0 +511 +511 +255 +255 +511 +767 +511 +767 +767 +0 +511 +511 +0 +255 +255 +255 +767 +255 +511 +0 +0 +0 +511 +511 +767 +511 +511 +255 +0 +0 +511 +0 +767 +0 +255 +767 +511 +255 +0 +511 +0 +767 +767 +511 +767 +511 +0 +0 +767 +0 +255 +511 +767 +255 +511 +0 +0 +0 +255 +0 +767 +767 +255 +767 +511 +511 +767 +767 +767 +255 +255 +0 +0 +767 +0 +767 +511 +0 +767 +0 +767 +767 +511 +767 +255 +0 +0 +255 +255 +255 +0 +0 +511 +767 +511 +767 +511 +255 +0 +511 +0 +255 +0 +255 +255 +767 +511 +511 +767 +767 +255 +767 +0 +511 +511 +767 +255 +255 +255 +0 +0 +255 +767 +255 +255 +511 +511 +0 +0 +767 +0 +767 +255 +0 +0 +767 +0 +0 +0 +767 +0 +255 +255 +767 +0 +0 +0 +0 +0 +511 +511 +767 +767 +511 +0 +0 +511 +0 +0 +255 +255 +767 +511 +511 +255 +255 +0 +511 +0 +511 +511 +255 +511 +255 +255 +511 +511 +0 +255 +511 +767 +767 +0 +0 +511 +0 +767 +511 +767 +255 +767 +767 +511 +511 +255 +511 +511 +255 +767 +511 +0 +0 +255 +0 +767 +0 +255 +255 +0 +255 +255 +767 +255 +767 +0 +0 +767 +0 +511 +0 +0 +0 +0 +0 +767 +767 +255 +767 +767 +255 +767 +255 +511 +255 +511 +0 +767 +767 +511 +0 +767 +0 +255 +767 +511 +255 +511 +255 +767 +255 +767 +767 +0 +511 +767 +0 +767 +255 +767 +255 +0 +511 +255 +767 +767 +255 +0 +0 +767 +767 +0 +255 +767 +767 +255 +0 +0 +511 +511 +511 +511 +0 +255 +255 +0 +767 +511 +511 +767 +0 +511 +255 +511 +767 +0 +0 +511 +511 +767 +255 +511 +767 +511 +767 +255 +255 +767 +0 +0 +511 +511 +0 +0 +511 +0 +767 +511 +767 +0 +255 +255 +0 +255 +767 +0 +767 +511 +511 +511 +0 +0 +0 +0 +0 +511 +511 +0 +511 +255 +767 +255 +255 +0 +511 +0 +767 +511 +255 +511 +0 +0 +0 +511 +511 +0 +255 +511 +0 +511 +255 +255 +0 +767 +511 +767 +511 +767 +255 +511 +0 +511 +767 +511 +255 +255 +0 +255 +255 +511 +255 +255 +767 +767 +0 +767 +767 +255 +255 +255 +0 +511 +767 +255 +0 +255 +767 +511 +255 +767 +767 +0 +511 +255 +767 +767 +255 +255 +767 +0 +511 +511 +255 +0 +255 +0 +511 +0 +767 +0 +511 +0 +511 +767 +255 +767 +0 +0 +0 +511 +511 +255 +0 +767 +511 +255 +767 +767 +511 +767 +767 +511 +511 +767 +767 +255 +255 +0 +0 +0 +0 +255 +0 +511 +255 +767 +0 +511 +255 +767 +0 +511 +511 +0 +511 +0 +767 +511 +767 +255 +0 +767 +511 +511 +0 +255 +0 +0 +0 +767 +0 +767 +255 +511 +255 +511 +255 +255 +0 +0 +0 +767 +767 +767 +767 +767 +255 +255 +255 +255 +767 +767 +767 +255 +255 +767 +511 +0 +767 +511 +767 +255 +767 +767 +255 +255 +511 +767 +0 +255 +511 +511 +0 +767 +511 +511 +511 +0 +511 +255 +0 +767 +255 +511 +767 +0 +767 +767 +0 +511 +767 +511 +255 +255 +0 +767 +511 +511 +255 +767 +0 +0 +0 +511 +511 +0 +0 +0 +511 +767 +255 +0 +255 +767 +0 +511 +255 +255 +511 +511 +511 +255 +255 +767 +0 +0 +0 +511 +767 +255 +767 +511 +511 +767 +767 +0 +511 +255 +511 +767 +767 +0 +767 +255 +0 +0 \ No newline at end of file diff --git a/voltage_file/命名规范:Vse_psi_水平角度_theta_垂直角度_opa_opa标号.txt b/voltage_file/命名规范:Vse_psi_水平角度_theta_垂直角度_opa_opa标号.txt new file mode 100755 index 0000000..e69de29