#include "ft232_reign.h" #include "ui_ft232_reign.h" #include #include #include #define FTDI_ERROR(info) { toLog(info); return; } QString last_write_data = "00"; QString hex_values[16] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" }; bool tmr_on = false; bool out = false; ft232_reign::ft232_reign(QWidget *parent) : QMainWindow(parent), ui(new Ui::ft232_reign) { ui->setupUi(this); log = ""; tmr = new QTimer(); tmr->setInterval(500); tmr->setSingleShot(false); tmr->start(); QObject::connect(tmr, SIGNAL(timeout ()), this, SLOT(tmr_fxn())); on_reflesh_com_clicked(); on_com_int_line_currentIndexChanged(ui->com_int_line->currentIndex()); i2c_hid_descr[10] = 2; i2c_hid_descr[11] = 0; } ft232_reign::~ft232_reign() { i2c_close(); delete ui; } void ft232_reign::on_pushButton_clicked() { //i2c_example(); //char desc[1024], serial[1024]; //i2c_open_index_port (0, desc, serial); if (bitbang_open (0, 1, 255) == 0) tmr_on = 1; } void ft232_reign::on_pushButton_2_clicked() { //i2c_example(); //bitbang_close(); //tmr_on = 0; } void ft232_reign::toLog(QString info) { log = QTime::currentTime().toString("HH:mm:ss") + "\t" + info + "\n" + log; ui->log->setText("LOG\n\n" + log); } QString ft232_reign::char_to_str(char *data, int len) { QString str = ""; for (int i = 0; i < len; i++) { if (data[i] == 0x00) break; str = str + data[i]; } return str; } void ft232_reign::on_clr_log_clicked() { log = ""; ui->log->setText("LOG\n\n"); } void ft232_reign::on_connect_clicked() { int result = 0; if (ui->connect->text() == "Connect") { res = i2c_open(ui->i2c_clk->value(), ui->i2c_index->value(), (ui->i2c_port->currentIndex() + 1)); qDebug ("Connecting to FTDI device, clk %d, index %d, port %d. RETURN %d", ui->i2c_clk->value(), ui->i2c_index->value(), (ui->i2c_port->currentIndex() + 1), res); if (res == 0) { ui->connect->setText("Disconnect"); toLog ("CONNECTING TO DEVICE OK, " + ui->i2c_port->currentText() + ", CLK " + QString::number(ui->i2c_clk->value()) + ", INDEX " + QString::number(ui->i2c_index->value())); } else { FTDI_ERROR("ABORT_OPEN_CHANNEL, ERROR " + QString::number(res)); } } else { i2c_close(); ui->connect->setText("Connect"); toLog ("DEVICE DISCONNECTED"); } } void ft232_reign::on_i2c_length_valueChanged(int arg1) { QString mask = "HH"; int last_mask_len; QString last_data; for (int i = 1; i < arg1; i++) mask = mask + " HH"; last_mask_len = ui->i2c_write_data->inputMask().length(); last_data = ui->i2c_write_data->text(); ui->i2c_write_data->setInputMask(mask); if (last_mask_len < mask.length()) { for (int i = 0; i < ((mask.length() - last_mask_len) / 3); i++) last_data = last_data + " 00"; ui->i2c_write_data->setText(last_data); } } void ft232_reign::on_i2c_write_data_textChanged(const QString &arg1) { if (arg1.length() != (3 * ui->i2c_length->value() - 1)) ui->i2c_write_data->setText(last_write_data); else last_write_data = ui->i2c_write_data->text(); } void ft232_reign::on_i2c_write_clicked() { QString str = ui->i2c_write_data->text(); for (int i = 0; i < ui->i2c_length->value(); i++) data[i] = str.mid(i*3, 2).toInt(NULL, 16); res = i2c_tx (ui->i2c_adress->value(), (char*)data, ui->i2c_length->value(), 1, 1); //res = I2C_DeviceWrite(reign, ui->i2c_adress->value(), ui->i2c_length->value(), data, &transfer_len, 0x07); if (res == 10/*FT_DEVICE_NOT_FOUND*/) { toLog ("I2C DEVICE WITH ADRESS 0x" + QString::number(ui->i2c_adress->value(), 16) + " NOT ASK (TX)"); return; } if (res != 0/*FT_OK*/) FTDI_ERROR("ABORT_TRANSMIT, ERROR " + QString::number(res)); str = "I2C TRANSMIT TO 0x" + QString::number(ui->i2c_adress->value(), 16) + " " + QString::number(ui->i2c_length->value()) + " BYTES:\t"; for (int i = 0; i < ui->i2c_length->value(); i++) str = str + " " + QString::number(data[i], 16); toLog(str); } void ft232_reign::on_i2c_read_clicked() { QString str; res = i2c_rx (ui->i2c_adress->value(), (char*)data, ui->i2c_length->value(), 1, 1); //res = I2C_DeviceRead(reign, ui->i2c_adress->value(), ui->i2c_length->value(), data, &transfer_len, 0x0B); if (res == 10/*FT_DEVICE_NOT_FOUND*/) { toLog ("I2C DEVICE WITH ADRESS 0x" + QString::number(ui->i2c_adress->value(), 16) + " NOT ASK (RX)"); return; } if (res != 0/*FT_OK*/) FTDI_ERROR("ABORT_RECEIVE, ERROR " + QString::number(res)); str = "I2C RECEIVE FROM 0x" + QString::number(ui->i2c_adress->value(), 16) + " " + QString::number(ui->i2c_length->value()) + " BYTES:\t"; for (int i = 0; i < ui->i2c_length->value(); i++) str = str + " " + QString::number(data[i], 16); toLog(str); } void ft232_reign::on_read_i2c_hid_desc_clicked() { toLog ("READING I2C HID DESCRIPTOR"); ui->i2c_length->setValue(2); ui->i2c_write_data->setText("01 00"); on_i2c_write_clicked(); QThread::msleep(100); ui->i2c_length->setValue(30); on_i2c_read_clicked(); for (int i = 0; i < 30; i++) { i2c_hid_descr[i] = data[i]; } toLog ("------------------------------------------"); } void ft232_reign::on_read_hid_report_desc_clicked() { toLog ("READING HID REPORT DESCRIPTOR"); ui->i2c_length->setValue(2); QString reg = hex_values[(i2c_hid_descr[6]>>4) & 0xF] + hex_values[(i2c_hid_descr[6]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[7]>>4) & 0xF] + hex_values[(i2c_hid_descr[7]>>0) & 0xF]; ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); QThread::msleep(100); ui->i2c_length->setValue((i2c_hid_descr[4] & 0xFF) + (i2c_hid_descr[5] & 0xFF) * 256); on_i2c_read_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_read_input_report_int_clicked() { toLog ("READING INPUT REPORT (INTERRUPT MODE)"); ui->i2c_length->setValue((i2c_hid_descr[10] & 0xFF) + (i2c_hid_descr[11] & 0xFF) * 256); on_i2c_read_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_read_input_report_cmd_clicked() { toLog ("READING INPUT REPORT (COMMAND MODE)"); ui->i2c_length->setValue(6); QString reg = hex_values[(i2c_hid_descr[16]>>4) & 0xF] + hex_values[(i2c_hid_descr[16]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[17]>>4) & 0xF] + hex_values[(i2c_hid_descr[17]>>0) & 0xF]; reg = reg + " 10 02 "; // COMMAND OPCODE - 2 (INPUT REPORT REQUEST), TYPE 01 - INPUT reg = reg + hex_values[(i2c_hid_descr[18]>>4) & 0xF] + hex_values[(i2c_hid_descr[18]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[19]>>4) & 0xF] + hex_values[(i2c_hid_descr[19]>>0) & 0xF]; ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); QThread::msleep(100); ui->i2c_length->setValue((i2c_hid_descr[10] & 0xFF) + (i2c_hid_descr[11] & 0xFF) * 256); on_i2c_read_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_reflesh_com_clicked() { com_list = QSerialPortInfo::availablePorts(); //QObject::disconnect(ui->com_list, SIGNAL(currentIndexChanged(int)), this, SLOT(on_com_list_currentIndexChanged(int))); for (int i = ui->com_list->count(); i >=0; i--) ui->com_list->removeItem(i); for (int i = 0; i < com_list.length(); i++) ui->com_list->addItem(com_list.at(i).portName()); //if (com_list.length() > 0) { //QObject::connect(ui->com_list, SIGNAL(currentIndexChanged(int)), this, SLOT(on_com_list_currentIndexChanged(int))); if (ui->com_list->currentIndex() >= 0) ui->com_list->setToolTip(com_list.at(ui->com_list->currentIndex()).description()); //} } void ft232_reign::on_com_list_currentIndexChanged(int index) { if (index >= 0) ui->com_list->setToolTip(com_list.at(index).description()); } void ft232_reign::on_com_connect_clicked() { QWidget* widgets_locked[] = { ui->com_list, ui->reflesh_com }; QWidget* widgets_unlocked[] = { ui->com_int_line, ui->en_int_evt, ui->label_int }; if (ui->com_connect->text() == "Connect") { com.setPortName(com_list.at(ui->com_list->currentIndex()).portName()); if (com.open(QSerialPort::ReadWrite)) { com.setParity(QSerialPort::NoParity); com.setDataBits(QSerialPort::Data8); com.setStopBits(QSerialPort::OneStop); com.setFlowControl(QSerialPort::NoFlowControl); com.setBaudRate(921600); ui->com_connect->setText("Disconnect"); toLog ("COM " + com.portName() + " OPENED OK"); tmr_on = true; } else toLog ("COM " + com.portName() + " OPEN ERROR"); } else { com.close(); toLog ("COM " + com.portName() + " CLOSED"); ui->com_connect->setText("Connect"); tmr_on = false; } for (int i = 0; i < sizeof(widgets_locked)/sizeof(QWidget*); i++) widgets_locked[i]->setEnabled(!com.isOpen()); for (int i = 0; i < sizeof(widgets_unlocked)/sizeof(QWidget*); i++) widgets_unlocked[i]->setEnabled(com.isOpen()); } void ft232_reign::on_com_int_line_currentIndexChanged(int index) { switch (index) { case 0: int_mask = QSerialPort::DataSetReadySignal; break; case 1: int_mask = QSerialPort::DataCarrierDetectSignal; break; case 2: int_mask = QSerialPort::ClearToSendSignal; break; } qDebug ("COM INT MASK %u", int_mask); } void ft232_reign::tmr_fxn() { if (tmr_on == false) return; int inputs = com.pinoutSignals(); if (((inputs & int_mask) != 0) && (out == false)) { out = true; ui->label_int->setText("INT ON (GND)"); } else if (((inputs & int_mask) == 0) && (out == true)) { out = false; ui->label_int->setText("INT OFF (+3.3)"); } if (out == true) { if (ui->en_int_evt->isChecked()) { on_read_input_report_int_clicked(); if ((data[0] == 0) && (data[1] == 0)) { on_read_i2c_hid_desc_clicked(); on_read_hid_report_desc_clicked(); on_write_output_report_reg_clicked(); } } } /*if (out != ui->int_line->isChecked()) { if (out) //ui->int_line->setCheckable(true); //ui->int_line->setChecked(out); //ui->int_line->setCheckable(false); }*/ //qDebug ("COM LINES STATE: %u", inputs); /*if (tmr_on == 0) return; char rd[10]; bitbang_read(rd); qDebug ("Reading from FTDI bitbang: %x, %x, %x, %x", rd[0], rd[1], rd[2], rd[3]);*/ } void ft232_reign::on_write_output_report_reg_clicked() { //if ((I2C_INPUT_DATA[0] == 5) && (I2C_INPUT_DATA[1] == 0) // && (I2C_INPUT_DATA[2] == 32) && (I2C_INPUT_DATA[3] == 3) // && (I2C_INPUT_DATA[4] == 6) && (I2C_INPUT_DATA[5] == 0) // && (I2C_INPUT_DATA[6] == 1) && (I2C_INPUT_DATA[7] == 0)) begin char data_led = 0; if (ui->NUM->isChecked()) data_led = data_led | 1; if (ui->CAPS->isChecked()) data_led = data_led | 2; if (ui->SCROOL->isChecked()) data_led = data_led | 4; toLog ("WRITING OUTPUT REPORT (TO OUTPUT ADRESS)"); ui->i2c_length->setValue(5); QString reg = hex_values[(i2c_hid_descr[12]>>4) & 0xF] + hex_values[(i2c_hid_descr[12]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[13]>>4) & 0xF] + hex_values[(i2c_hid_descr[13]>>0) & 0xF]; reg = reg + " 01 00 "; // DATA LEN - 1 reg = reg + hex_values[(data_led>>4) & 0xF] + hex_values[(data_led>>0) & 0xF]; ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_NUM_toggled(bool checked) { on_write_output_report_reg_clicked(); } void ft232_reign::on_CAPS_clicked() { on_write_output_report_reg_clicked(); } void ft232_reign::on_SCROOL_clicked() { on_write_output_report_reg_clicked(); } void ft232_reign::on_cmd_reset_clicked() { //if ((I2C_INPUT_DATA[0] == 5) && (I2C_INPUT_DATA[1] == 0) && (I2C_INPUT_DATA[2] == 0) && (I2C_INPUT_DATA[3] == 1)) toLog ("WRITING RESET COMMAND"); ui->i2c_length->setValue(4); QString reg = hex_values[(i2c_hid_descr[16]>>4) & 0xF] + hex_values[(i2c_hid_descr[16]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[17]>>4) & 0xF] + hex_values[(i2c_hid_descr[17]>>0) & 0xF]; reg = reg + " 00 01"; // COMMAND OPCODE - 1 (RESET), OTHER FIELDS - ZERO ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_write_output_report_cmd_clicked() { char data_led = 0; if (ui->NUM->isChecked()) data_led = data_led | 1; if (ui->CAPS->isChecked()) data_led = data_led | 2; if (ui->SCROOL->isChecked()) data_led = data_led | 4; toLog ("WRITING OUTPUT REPORT (COMMAND)"); ui->i2c_length->setValue(9); QString reg = hex_values[(i2c_hid_descr[16]>>4) & 0xF] + hex_values[(i2c_hid_descr[16]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[17]>>4) & 0xF] + hex_values[(i2c_hid_descr[17]>>0) & 0xF]; reg = reg + " 20 03 "; // DATA LEN - 1 reg = reg + hex_values[(i2c_hid_descr[18]>>4) & 0xF] + hex_values[(i2c_hid_descr[18]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[19]>>4) & 0xF] + hex_values[(i2c_hid_descr[19]>>0) & 0xF]; reg = reg + " 01 00 "; reg = reg + hex_values[(data_led>>4) & 0xF] + hex_values[(data_led>>0) & 0xF]; ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); toLog ("------------------------------------------"); } void ft232_reign::on_read_input_report_reg_clicked() { toLog ("READING INPUT REPORT (ADRESS)"); ui->i2c_length->setValue(2); QString reg = hex_values[(i2c_hid_descr[8]>>4) & 0xF] + hex_values[(i2c_hid_descr[8]>>0) & 0xF] + " " + \ hex_values[(i2c_hid_descr[9]>>4) & 0xF] + hex_values[(i2c_hid_descr[9]>>0) & 0xF]; ui->i2c_write_data->setText(reg); on_i2c_write_clicked(); QThread::msleep(100); ui->i2c_length->setValue((i2c_hid_descr[10] & 0xFF) + (i2c_hid_descr[11] & 0xFF) * 256); on_i2c_read_clicked(); toLog ("------------------------------------------"); }