diff --git a/library.cpp b/library.cpp new file mode 100644 index 0000000..251865a --- /dev/null +++ b/library.cpp @@ -0,0 +1,19 @@ +#include +#include + +using namespace std; + +extern int debugLevel; + +void debug(QString text, int level) +{ + if (level & debugLevel) + { + cout << text.toStdString() << endl; + } +} + +void signal_handler(int signal) +{ + cout << "Received signal " << signal << endl; +} diff --git a/library.h b/library.h new file mode 100644 index 0000000..097e61f --- /dev/null +++ b/library.h @@ -0,0 +1,12 @@ +#ifndef LIBRARY_H +#define LIBRARY_H + +#define DEBUG 1 +#define INFO 2 +#define WARNING 3 +#define ERROR 4 + +void debug(QString text, int level); +void signal_handler(int signal); + +#endif // LIBRARY_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..765d4b2 --- /dev/null +++ b/main.cpp @@ -0,0 +1,22 @@ +#include "main.h" + +using namespace std; + +int debugLevel = DEBUG | INFO | WARNING | ERROR; + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + QCoreApplication::setOrganizationName("zigbeemanager"); + QCoreApplication::setApplicationName("zigbeemanager"); + + ZigateBackend zigateBkd; + // zigbeemgr(); + + //QObject::connect(&zigbeemgr, SIGNAL(readyRead()), &zigbeemgr, SLOT(getData())); + //QObject::connect(&zigbeemgr, SIGNAL(bytesWritten(qint64)), &zigbeemgr, SLOT(confirmWrite(qint64))); + + zigateBkd.sendCmd(zigateBkd.getVersion.at(0), zigateBkd.getVersion.at(1), zigateBkd.getVersion.at(2)); + + return a.exec(); +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..75c3a3f --- /dev/null +++ b/main.h @@ -0,0 +1,21 @@ +#ifndef MAIN_H +#define MAIN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "library.h" +#include "zigateBackend.h" + +#endif // MAIN_H diff --git a/serial.inc.cpp b/serial.inc.cpp new file mode 100644 index 0000000..fc292fc --- /dev/null +++ b/serial.inc.cpp @@ -0,0 +1,65 @@ +#include "serial.inc.h" + +extern QApplication a; +using namespace std; + +ZigbeeMgr::ZigbeeMgr() +{ + //QMessageBox::StandardButton reply; + bool test; + + this->setBaudRate(115200); + this->setDataBits(QSerialPort::Data8); + this->setStopBits(QSerialPort::OneStop); + this->setParity(QSerialPort::NoParity); + this->setPortName(this->serialDevicePath); + do + { + test = this->open(QIODevice::ReadWrite); + if (!test) + { + cout << this->errorString().toStdString() << "=>" << this->serialDevicePath.toStdString() << endl; + /*QString str = "Device can not be openened : " + errorString() + "=>" + this->device; + reply = QMessageBox::question( + nullptr, + a.applicationName(), + str, + QMessageBox::Retry|QMessageBox::Abort, + QMessageBox::Retry + ); + if (reply == QMessageBox::Abort) + { + exit(1); + }*/ + sleep(5); + } + }while(!test); +} + +ZigbeeMgr::~ZigbeeMgr() +{ + this->close(); +} + +void ZigbeeMgr::getData() +{ + dataRead = this->readAll(); + cout << dataRead.toHex().toStdString() << endl; +} + +void ZigbeeMgr::confirmWrite(qint16 byte) +{ + QString str; + if (byte != dataWriteSize) + { + str = "Bytes written not egal to bytes sent : " + QString::number(byte) + " written for " + dataWriteSize + " sent"; + cout << str.toStdString() << endl; + } +} + +void ZigbeeMgr::write(QString datas) +{ + dataWriteSize = datas.count(); + this->writeData(datas.toStdString().c_str(), datas.count()); +} + diff --git a/serial.inc.h b/serial.inc.h new file mode 100644 index 0000000..1fd2f1d --- /dev/null +++ b/serial.inc.h @@ -0,0 +1,35 @@ +#ifndef SERIAL_INC_H +#define SERIAL_INC_H + +#include +#include +#include +#include +#include + +class ZigbeeMgr : public QSerialPort +{ + Q_OBJECT + + public: + //QSerialPort * sp; + QByteArray dataRead; + QByteArray dataWrite; + qint64 dataWriteSize; + QString serialDevicePath; + + //QAbstractButton * reply; + //QString serialDevicePath; + + void write(QString datas); + ZigbeeMgr(); + ~ZigbeeMgr(); + + private slots: + void getData(); + void confirmWrite(qint16 byte); +}; + + + +#endif // SERIAL_INC_H diff --git a/zigateBackend.cpp b/zigateBackend.cpp new file mode 100644 index 0000000..64ad344 --- /dev/null +++ b/zigateBackend.cpp @@ -0,0 +1,114 @@ +#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; +} + diff --git a/zigateBackend.h b/zigateBackend.h new file mode 100644 index 0000000..6e4e84f --- /dev/null +++ b/zigateBackend.h @@ -0,0 +1,378 @@ +#ifndef ZIGATEBACKEND_H +#define ZIGATEBACKEND_H + +#include "serial.inc.h" +#include +#include +#include +//#include + +class ZigbeeMgr; + +class ZigateBackend : public ZigbeeMgr +{ + + Q_OBJECT + + public: + QMap resultCodes; + QString portName; + QString serialDeviceDescription; + QString serialDeviceManufacturer; + QString serialDeviceNumber; + QString serialDeviceVendor; + QString serialDeviceProduct; + quint32 baudRate = 115200; + //ZigbeeMgr serial; + + ZigateBackend(); + ~ZigateBackend(); + + QByteArray checksum(QByteArray msgType, QByteArray length, QByteArray datas); + QByteArray transcode(QByteArray datas); + void sendCmd(QByteArray cmd, QByteArray len, QByteArray datas); + bool findSerialDevice(); + + QMap clusters + { + {"0000", " (General: Basic)"}, + {"0001", " (General: Power Config)"}, + {"0002", " (General: Temperature Config)"}, + {"0003", " (General: Identify)"}, + {"0004", " (General: Groups)"}, + {"0005", " (General: Scenes)"}, + {"0006", " (General: On/Off)"}, + {"0007", " (General: On/Off Config)"}, + {"0008", " (General: Level Control)"}, + {"0009", " (General: Alarms)"}, + {"000A", " (General: Time)"}, + {"000F", " (General: Binary Input Basic)"}, + {"0020", " (General: Poll Control)"}, + {"0019", " (General: OTA)"}, + {"0101", " (General: Door Lock"}, + {"0201", " (HVAC: Thermostat)"}, + {"0202", " (HVAC: Fan Control)"}, + {"0300", " (Lighting: Color Control)"}, + {"0400", " (Measurement: Illuminance)"}, + {"0402", " (Measurement: Temperature)"}, + {"0405", " (Measurement: Humidity)"}, + {"0406", " (Measurement: Occupancy Sensing)"}, + {"0500", " (Security & Safety: IAS Zone)"}, + {"0702", " (Smart Energy: Metering)"}, + {"0B05", " (Misc: Diagnostics)"}, + {"1000", " (ZLL: Commissioning)"}, + {"FF01", " Xiaomi private"}, + {"FF02", " Xiaomi private"}, + {"1234", " Xiaomi private"} + }; + +/*Zigate -> Obj 0x0008 Set heartBeat enable/disable (ZiGatev2 Firm v3.20) +0 – disable (by default) +1 – enable + Status +*/ + QList heartbeatEnable = {"0008", "0001", "0210"}; + +/*Zigate -> Obj 0x0009 Get Network State (Firm v3.0d) Status + Network State Response +*/ + QByteArray networkState = "0009"; + +/* +Zigate -> Obj 0x0010 Get Version Status + Version List +*/ + QList getVersion = {"0010", "0000", ""}; +/* +Zigate -> Obj 0x0011 Reset Status, followed by chip reset +*/ + QByteArray reset = "0011"; + +/* + Zigate -> Obj 0x0012 Erase Persistent Data Status +*/ + QByteArray erasePersistentData = "0012"; + +/* +Zigate -> Obj 0x0013 ZLO/ZLL “Factory New” Reset No payload Status, followed by chip reset + Resets (“Factory New”) the Control Bridge but persists the frame counters. +*/ + QByteArray factoryReset = "0013"; +/* +Zigate -> Obj 0x0014 Permit Join Status, followed by “Permit join” status response +*/ + QByteArray permitJoin = "0014"; + +/* + Zigate -> Obj 0x0015 Get devices list Get devices authentified in the ZiGate’s PDM. Status, followed by “Get devices list” response +*/ + QByteArray getDevicesList = "0015"; + +/* +Zigate -> Obj 0x0016 Set Time server (v3.0f) from 2000-01-01 00:00:00 Status +*/ + QByteArray setTimeServer = "0016"; + +/* +Zigate -> Obj 0x0017 GetTime server (v3.0f) Status +Get_timer_server_response +*/ + QByteArray getTimerServerResponse = "0017"; + +/* +Zigate -> Obj 0x0018 SetLed (v3.0f) +0 – Off +1- On + Status +*/ + QByteArray setLed = "0018"; + +/* +Zigate -> Obj 0x0019 Set Certification (v3.0f) +1- CE +2- FCC + Status +*/ + QByteArray setCertification = "0019"; + +/* +Zigate -> Obj 0x0020 Set Expended PANID <64-bit Extended PAN ID:uint64_t> Status +*/ + QByteArray setExpended = "0020"; + +/* +Zigate -> Obj 0x0021 Set Channel Mask Status +*/ + QByteArray setChannelMask = "0021"; + +/* +Zigate -> Obj 0x0022 Set Security State + Key Status + +*/ + QByteArray setSecurityState = "0022"; + +/* +Zigate -> Obj 0x0023 Set device Type Status + Device Types: + 0 = Coordinator + 1 = Router +*/ + QByteArray setDeviceType = "0023"; + +/* +Zigate -> Obj 0x0024 Start Network Status + Network Joined / Formed +*/ + QByteArray startNetwork = "0024"; + +/* +Zigate -> Obj 0x0025 Start Network Scan Status + Network Joined / Formed +*/ + QByteArray StartNetworkScan = "0025"; + +/* +Zigate -> Obj 0x0026 Remove Device Status + Leave indication +*/ + QByteArray removeDevice = "0026"; + +/* +Zigate -> Obj 0x0027 Enable Permissions Controlled Joins Status + 1 – Enable + 2 – Disable +*/ + QByteArray enablePermControlledJoins = "0027"; + +/* +Zigate -> Obj 0x0028 Authenticate Device Status + Authenticate response +*/ + QByteArray authenticateDevice = "0028"; + +/* +Zigate -> Obj 0x0029 Out of Band Commissioning Data Request
Status + Out of Band Commissioning Data Response +*/ + QByteArray outOfBandCDR = "0029"; + +/* +Zigate -> Obj 0x002B User Descriptor Set < target short address: uint16_t> Status + < Address of interest: uint16_t> User descriptor notify response + < string length: uint8_t> + +*/ + QByteArray userDescriptorSet = "002B"; + +/* +Zigate -> Obj 0x002C User Descritpor Request < target short address: uint16_t> Status + < Address of interest: uint16_t> User Descriptor response +*/ + QByteArray userDescriptorRequest = "002C"; + +/* +Zigate -> Obj 0x0531 Complex Descriptor request < target short address: uint16_t> Status + < Address of interest: uint16_t> Complex Descriptor Response +*/ + QByteArray complexDescriptorRequest = "0531"; + +/*Zigate -> Obj 0x0030 Bind Status + Bind response + + + + +*/ + QByteArray bind = "0030"; + +/* +Zigate -> Obj 0x0031 Unbind Status + Unbind response + + + + +*/ + QByteArray unBind = "0031"; + +/* +Zigate -> Obj 0x0040 Network Address request Status + Network Address response + + Request Type: + 0 = Single Request + 1 = Extended Request +*/ + QByteArray networkAddressRequest = "0040"; + +/* +Zigate -> Obj 0x0041 IEEE Address request Status + IEEE Address response + + + Request Type: + 0 = Single + 1 = Extended +*/ + QByteArray ieeeAddressRequest = "0041"; + +/* +Zigate -> Obj 0x0042 Node Descriptor request Status + Node Descriptor response +*/ + QByteArray nodeDescriptorRequest = "0042"; + +/* +Zigate -> Obj 0x0043 Simple Descriptor request Status + Simple Descriptor response +*/ + QByteArray simpleDescriptorRequest = "0043"; + +/* +Zigate -> Obj 0x0044 Power Descriptor request Status + Power Descriptor response +*/ + QByteArray powerDescriptorRequest = "0044"; + +/* +Zigate -> Obj 0x0045 Active Endpoint request Status + Active Endpoint response +*/ + QByteArray activeEndpointRequest = "0045"; + +/* +Zigate -> Obj 0x0046 Match Descriptor request Status + Match Descriptor response + + + + +*/ + QByteArray matchDescriptorRequest = "0046"; + +/* +Zigate -> Obj 0x0047 Management Leave request Status + Management Leave response + Leave indication + + Rejoin, + 0 = Do not rejoin + 1 = Rejoin + Remove Children + 0 = Leave, do not remove children + 1 = Leave, removing children +*/ + QByteArray managementLeaveRequest = "0047"; + +/* +Zigate -> Obj 0x0049 Permit Joining request Status + + + Target address: May be address of gateway node or broadcast (0xfffc) + Interval: + 0 = Disable Joining + 1 – 254 = Time in seconds to allow joins + 255 = Allow all joins + TCsignificance: + 0 = No change in authentication + 1 = Authentication policy as spec +*/ + QByteArray permitJoiningRequest = "0049"; + +/* +Zigate -> Obj 0x004A Management Network Update request Status + Management Network Update response + + + + + Channel Mask: + Mask of channels to scan + Scan Duration: + 0 – 0xFF Multiple of superframe duration. + Scan count: + Scan repeats 0 – 5 + Network Update ID: + 0 – 0xFF Transaction ID for scan +*/ + QByteArray manaementNetworkUpdateRequest = "004A"; + +/* +Zigate -> Obj 0x004B System Server Discovery request Status + System Server Discovery response + Bitmask according to spec. +*/ + QByteArray systemServerDiscoveryRequest = "004B"; + +/* +Zigate -> Obj 0x004C Leave Request Status + Leave indication Leave indication (0x8048) + + Rejoin, +0 = Do not rejoin +1 = Rejoin +Remove Children +0 = Leave, do not remove children +1 = Leave, removing children +*/ + QByteArray leaveRequest = "004C"; + +/* +Zigate -> Obj 0x004E Management LQI request Status + Management LQI response +*/ + QByteArray managementLqiRequest = "004E"; + +/* +Zigate -> Obj 0x0051 Free PDM internal address map table (From v.322 ZiGate+) Status +*/ + QByteArray freePdmTable = "0051"; + +/* +Zigate -> Obj 0x0052 Get PDM child table size (From v.322 ZiGate+) Status + PDM child table size response +*/ + QByteArray getPdmChildTableSize = "0052"; + +}; +#endif // ZIGATEBACKEND_H diff --git a/zigbeemanager.pro b/zigbeemanager.pro new file mode 100644 index 0000000..d2f9b50 --- /dev/null +++ b/zigbeemanager.pro @@ -0,0 +1,28 @@ +QT += core gui +QT += serialport +QT += widgets +QT += KConfigCore KConfigGui +QT += KCoreAddons +CONFIG += c++17 console +CONFIG -= app_bundle + +# 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 + +SOURCES += \ + library.cpp \ + main.cpp \ + serial.inc.cpp \ + zigateBackend.cpp + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +HEADERS += \ + library.h \ + main.h \ + serial.inc.h \ + zigateBackend.h diff --git a/zigbeemanager.pro.user b/zigbeemanager.pro.user new file mode 100644 index 0000000..df9481f --- /dev/null +++ b/zigbeemanager.pro.user @@ -0,0 +1,430 @@ + + + + + + EnvironmentId + {a3117c94-e673-4dca-aa4c-050bbea034fe} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + false + true + false + 1 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + true + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 2 + + + + true + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Qt 5.15.7 (qt5) + Qt 5.15.7 (qt5) + {a8a6d767-5e05-45c7-b70b-532f99112b6a} + 0 + 0 + 0 + + 0 + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Qt_5_15_7_qt5-Debug + /home/daniel/develop/build-zigbeemanager-Qt_5_15_7_qt5-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Qt_5_15_7_qt5-Release + /home/daniel/develop/build-zigbeemanager-Qt_5_15_7_qt5-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Qt_5_15_7_qt5-Profile + /home/daniel/develop/build-zigbeemanager-Qt_5_15_7_qt5-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + zigbeemanager + Qt4ProjectManager.Qt4RunConfiguration:/home/daniel/develop/zigbeemanager/zigbeemanager.pro + /home/daniel/develop/zigbeemanager/zigbeemanager.pro + false + true + true + false + true + /home/daniel/develop/build-zigbeemanager-Qt_5_15_7_qt5-Debug + + 1 + + + + ProjectExplorer.Project.Target.1 + + Desktop + Desktop + Desktop + {893f9ca6-0efa-4c08-a4a6-5a818f60a8a0} + 0 + 0 + 0 + + 0 + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Desktop-Debug + /home/daniel/develop/build-zigbeemanager-Desktop-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Desktop-Release + /home/daniel/develop/build-zigbeemanager-Desktop-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + /home/daniel/develop/zigbeemanager/../build-zigbeemanager-Desktop-Profile + /home/daniel/develop/build-zigbeemanager-Desktop-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 2 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + +