From 2b1b3d5a4ed47fc789932ea79a2b914c5ef3eb99 Mon Sep 17 00:00:00 2001 From: Daniel Tartavel Date: Sat, 8 Apr 2023 15:06:36 +0200 Subject: [PATCH] first commit --- library.cpp | 19 ++ library.h | 12 ++ main.cpp | 22 +++ main.h | 21 ++ serial.inc.cpp | 65 +++++++ serial.inc.h | 35 ++++ zigateBackend.cpp | 114 +++++++++++ zigateBackend.h | 378 ++++++++++++++++++++++++++++++++++++ zigbeemanager.pro | 28 +++ zigbeemanager.pro.user | 430 +++++++++++++++++++++++++++++++++++++++++ 10 files changed, 1124 insertions(+) create mode 100644 library.cpp create mode 100644 library.h create mode 100644 main.cpp create mode 100644 main.h create mode 100644 serial.inc.cpp create mode 100644 serial.inc.h create mode 100644 zigateBackend.cpp create mode 100644 zigateBackend.h create mode 100644 zigbeemanager.pro create mode 100644 zigbeemanager.pro.user 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 + +