#include "main.h" #include using namespace std; ZigateBackend::ZigateBackend() { bool result; this->resultCodes.insert(0x8000, "Status"); while (1) { result = this->findSerialDevice(); if (result) { debug("Device found :" + this->serialDevicePath, INFO); break; }else { cout << "Device not found, waiting 10 seconds before retrying" << endl; sleep(10); } } //resultCodes.insert(); } ZigateBackend::~ZigateBackend() { } QByteArray ZigateBackend::checksum(QByteArray msgType, QByteArray length, QByteArray datas) { quint16 temp = 0; int i; QString str = msgType.mid(0,2); cout << str.toStdString() << endl; temp ^= qFromLittleEndian(msgType[0] + msgType[1]); temp ^= qFromLittleEndian(msgType[2] + msgType[3]); temp ^= qFromLittleEndian(length[0] + length[1]); temp ^= qFromLittleEndian(length[2] + length[3]); for (i=0;i<=(datas.count());i+=2) { temp ^= qFromLittleEndian(datas[i] + datas[i+1]); } return QByteArray::number(temp, 16); } QByteArray ZigateBackend::transcode(QByteArray datas) { QByteArray msg = ""; int i; QByteArray byte; if (datas.count()%2 != 0) { return "-1"; } for (i=0;i " << byte.toUInt(nullptr, 16) << endl; if (byte.toUInt(nullptr, 16)>0x10) { msg += byte; }else { msg.append("02"); msg.append(QByteArray::number(byte.toUInt(nullptr, 16) ^ 0x10, 16)); } } return msg; } void ZigateBackend::sendCmd(QByteArray cmd, QByteArray len, QByteArray datas) { QByteArray msg; msg = QByteArray::fromHex("01"); msg += QByteArray::fromHex(transcode(cmd)); msg += QByteArray::fromHex(transcode(len)); if (!datas.isEmpty()) { msg += QByteArray::fromHex(checksum(cmd, len, datas)); msg += QByteArray::fromHex(transcode(datas)); }else{ msg += QByteArray::fromHex(checksum(cmd, len, "0")); } msg += QByteArray::fromHex("03"); cout << msg.toStdString() << endl; } bool ZigateBackend::findSerialDevice() { const auto serialPortInfos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &portInfo : serialPortInfos) { if (portInfo.serialNumber() == "ZIGATE+") { this->portName = portInfo.portName(); this->serialDevicePath = portInfo.systemLocation(); this->serialDeviceDescription = portInfo.description(); this->serialDeviceManufacturer = portInfo.manufacturer(); this->serialDeviceNumber = portInfo.serialNumber(); this->serialDeviceVendor = portInfo.vendorIdentifier(); this->serialDeviceProduct = portInfo.productIdentifier(); return true; } } return false; }