You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							395 lines
						
					
					
						
							14 KiB
						
					
					
				
			
		
		
	
	
							395 lines
						
					
					
						
							14 KiB
						
					
					
				| #include "ft232_reign.h"
 | |
| #include "ui_ft232_reign.h"
 | |
| 
 | |
| #include <i2c.h>
 | |
| 
 | |
| #include <qdatetime.h>
 | |
| #include <qthread.h>
 | |
| 
 | |
| #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 ("------------------------------------------");
 | |
| }
 |