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.
235 lines
9.0 KiB
235 lines
9.0 KiB
#include "i2c_keyboard_detection.h"
|
|
#include "ui_i2c_keyboard_detection.h"
|
|
|
|
#include <qfile.h>
|
|
#include <qevent.h>
|
|
|
|
#include <qmessagebox.h>
|
|
#include <qfiledialog.h>
|
|
|
|
#include <qdatetime.h>
|
|
|
|
i2c_keyboard_detection::i2c_keyboard_detection(QWidget *parent) :
|
|
QMainWindow(parent),
|
|
ui(new Ui::i2c_keyboard_detection)
|
|
{
|
|
ui->setupUi(this);
|
|
QObject::connect(&m_com, SIGNAL(readyRead()), this, SLOT(comDataReceived()));
|
|
QFile fileKbdCodes("hid_keyboard_codes.h");
|
|
if (!fileKbdCodes.open(QFile::ReadOnly))
|
|
return;
|
|
m_keyComments.clear();
|
|
ui->keyList->clear();
|
|
while(1) {
|
|
QString currentStr = QString(fileKbdCodes.readLine());
|
|
QString defineStr = "#define ";
|
|
if (currentStr.length() == 0)
|
|
break;
|
|
QString strComment = currentStr.right(currentStr.length() - currentStr.indexOf("//"));
|
|
currentStr = currentStr.left(currentStr.indexOf("//"));
|
|
QStringList strWords = currentStr.split(QRegExp("\\s"));
|
|
for (int i = (strWords.length() - 1); i >= 0; i--)
|
|
{
|
|
if (strWords[i].length() == 0)
|
|
strWords.removeAt(i);
|
|
}
|
|
if (strWords.length() != 3)
|
|
continue;
|
|
if (strWords[0] != "#define")
|
|
continue;
|
|
if (!strWords[2].startsWith("0x"))
|
|
continue;
|
|
strWords[2] = strWords[2].right(2);
|
|
bool isKbdCode;
|
|
int kbdCode = strWords[2].toInt(&isKbdCode, 16);
|
|
if (!isKbdCode)
|
|
continue;
|
|
QString addedElement = strWords[1] + " (" + QString::number(kbdCode,16) + ")";
|
|
ui->keyList->addItem(addedElement);
|
|
m_keyComments.push_back(strComment);
|
|
}
|
|
fileKbdCodes.close();
|
|
//int res = system("iceprog hardware.bin");
|
|
//qDebug ("Result: %u", res);
|
|
//ui->keyList->event();
|
|
}
|
|
|
|
i2c_keyboard_detection::~i2c_keyboard_detection()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void i2c_keyboard_detection::keyPressEvent(QKeyEvent *e)
|
|
{
|
|
qDebug("Key pressed: %u", e->nativeScanCode());
|
|
// Qt::Key_S;
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_keyList_itemSelectionChanged()
|
|
{
|
|
qDebug ("Current key item changed! Now %u", ui->keyList->currentRow());
|
|
/*ui->keyList->setToolTip*/ui->label_keyComment->setText(m_keyComments.at(ui->keyList->currentRow()));
|
|
QString currentKey = ui->keyList->currentItem()->text();
|
|
for (int i = 0; i < m_kbdDetectReport.length(); i++)
|
|
{
|
|
if ((m_kbdDetectReport[i].split("\t").at(0) == currentKey) && (ui->enSendKeyToReport->isChecked()))
|
|
QMessageBox::warning(this, "KEY IS ALREADY ADDED", "This key was already added to report. When you press some key, old value will be lost");
|
|
}
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_comRefleshList_clicked()
|
|
{
|
|
QList<QSerialPortInfo> comList = QSerialPortInfo::availablePorts();
|
|
ui->comList->clear();
|
|
for (int i = 0; i < comList.length(); i++)
|
|
ui->comList->addItem(comList.at(i).portName());
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_comConnect_clicked()
|
|
{
|
|
QWidget* widgets_locked[] = { ui->comList, ui->comRefleshList };
|
|
QWidget* widgets_unlocked[] = { };
|
|
if (ui->comConnect->text() == "Connect") {
|
|
m_com.setPortName(ui->comList->currentText());
|
|
if (m_com.open(QSerialPort::ReadWrite)) {
|
|
m_com.setParity(QSerialPort::NoParity);
|
|
m_com.setDataBits(QSerialPort::Data8);
|
|
m_com.setStopBits(QSerialPort::OneStop);
|
|
m_com.setFlowControl(QSerialPort::NoFlowControl);
|
|
m_com.setBaudRate(115200);
|
|
ui->comConnect->setText("Disconnect");
|
|
m_kbdDetectBytes.clear();
|
|
m_kbdDetectData.clear();
|
|
}
|
|
else
|
|
QMessageBox::warning(this, "COM OPEN ERROR", "Com " + ui->comList->currentText() + " cannot open!");
|
|
}
|
|
else {
|
|
m_com.close();
|
|
ui->comConnect->setText("Connect");
|
|
}
|
|
for (int i = 0; i < sizeof(widgets_locked)/sizeof(QWidget*); i++)
|
|
widgets_locked[i]->setEnabled(!m_com.isOpen());
|
|
for (int i = 0; i < sizeof(widgets_unlocked)/sizeof(QWidget*); i++)
|
|
widgets_unlocked[i]->setEnabled(m_com.isOpen());
|
|
}
|
|
|
|
void i2c_keyboard_detection::comDataReceived()
|
|
{
|
|
QByteArray dataFromCom = m_com.readAll();
|
|
for (int i = 0; i < dataFromCom.length(); i++)
|
|
{
|
|
if (dataFromCom[i] == 0xFF)
|
|
{
|
|
if (m_kbdDetectBytes.length() != 5)
|
|
{
|
|
//on_comConnect_clicked();
|
|
QMessageBox::warning(this, "COM PROTOCOL ERROR", "Received start, but last frame is not complete");
|
|
}
|
|
m_kbdDetectBytes.clear();
|
|
}
|
|
else
|
|
{
|
|
m_kbdDetectBytes.push_back(dataFromCom[i]);
|
|
if (m_kbdDetectBytes.length() > 5)
|
|
{
|
|
if (m_com.isOpen())
|
|
on_comConnect_clicked();
|
|
QMessageBox::warning(this, "COM PROTOCOL ERROR", "Received extra byte of frame");
|
|
}
|
|
else if (m_kbdDetectBytes.length() == 5)
|
|
{
|
|
int64_t result = ((((int64_t)m_kbdDetectBytes[4]) & 0xFF) << 0) |
|
|
((((int64_t)m_kbdDetectBytes[3]) & 0xFF) << 8) | ((((int64_t)m_kbdDetectBytes[2]) & 0xFF) << 16) |
|
|
((((int64_t)m_kbdDetectBytes[1]) & 0xFF) << 24) | ((((int64_t)m_kbdDetectBytes[0]) & 0xFF) << 32);
|
|
//m_kbdDetectBytes.clear();
|
|
if (result != 0)
|
|
{
|
|
for (int k = 0; k < m_kbdDetectData.length(); k++) {
|
|
if (m_kbdDetectData[k] == result)
|
|
return; // RECEIVING IN PROCESS, WAIT TERMINATION FRAME, THIS FRAME WAS ALREADY ADDED
|
|
}
|
|
m_kbdDetectData.push_back(result);
|
|
return; // RECEIVING IN PROCESS, WAIT TERMINATION FRAME
|
|
}
|
|
// TERMINATION FRAME PROCESSING START
|
|
QString currentStatus;
|
|
QVector<int> connectedLines;
|
|
if (m_kbdDetectData.length() == 0)
|
|
currentStatus = "No keys are pressed";
|
|
else {
|
|
currentStatus = "Detected connections: ";
|
|
for (int k = 0; k < m_kbdDetectData.length(); k++) {
|
|
//currentKbdReport = currentKbdReport + QString::number(last_kbd_data[k]) + ", ";
|
|
for (quint64 n = 0; n < 34; n++) {
|
|
quint64 mask = 1;
|
|
mask = mask << n;
|
|
if ((m_kbdDetectData[k] & mask) != 0)
|
|
{
|
|
currentStatus = currentStatus + QString::number(n) + " ";
|
|
connectedLines.push_back(n);
|
|
}
|
|
}
|
|
currentStatus = currentStatus + ", ";
|
|
}
|
|
currentStatus = currentStatus.left(currentStatus.length() - 2);
|
|
m_kbdDetectData.clear();
|
|
}
|
|
currentStatus = currentStatus + " (" + QTime::currentTime().toString("HH:mm:ss.zzz") + ")";
|
|
ui->labelKeyboardStatus->setText(currentStatus);
|
|
if ((connectedLines.length() != 0) && (ui->enSendKeyToReport->isChecked()))
|
|
{
|
|
QString currentKey = ui->keyList->currentItem()->text();
|
|
for (int k = (m_kbdDetectReport.length() - 1); k >=0; k--)
|
|
{
|
|
if (m_kbdDetectReport[k].split("\t").at(0) == currentKey)
|
|
m_kbdDetectReport.remove(k);
|
|
}
|
|
for (int k = 0; k < connectedLines.length(); k++)
|
|
currentKey = currentKey + "\t" + QString::number(connectedLines[k]);
|
|
m_kbdDetectReport.push_front(currentKey);
|
|
QString tarReport;
|
|
for (int k = 0; k < m_kbdDetectReport.length(); k++)
|
|
tarReport = tarReport + m_kbdDetectReport[k] + "\n";
|
|
ui->kbdReport->setText(tarReport);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_enSendKeyToReport_clicked(bool checked)
|
|
{
|
|
if (checked)
|
|
on_keyList_itemSelectionChanged();
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_saveKbdReport_clicked()
|
|
{
|
|
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "kbd_connections.txt", tr("*.txt"));
|
|
if (fileName == "")
|
|
return;
|
|
QFile savedFile(fileName);
|
|
if (!savedFile.open(QFile::WriteOnly))
|
|
{
|
|
QMessageBox::warning(this, "CANNOT SAVE FILE", "Can't open file for save report");
|
|
return;
|
|
}
|
|
QString tarReport;
|
|
for (int k = 0; k < m_kbdDetectReport.length(); k++)
|
|
tarReport = tarReport + m_kbdDetectReport[k] + "\n";
|
|
if (savedFile.exists())
|
|
savedFile.resize(0);
|
|
savedFile.write(tarReport.toUtf8());
|
|
savedFile.close();
|
|
}
|
|
|
|
void i2c_keyboard_detection::on_openConnectionsFile_clicked()
|
|
{
|
|
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "kbd_connections.txt", tr("*.txt"));
|
|
if (fileName == "")
|
|
return;
|
|
QFile openedFile(fileName);
|
|
|
|
}
|