#include "zigateBackend.h" #include "serial.inc.h" #include extern ZigateBackend zigateBkd; extern SerialManager serialManager; extern QHash responseListIndex; using namespace std; bool ZigateBackend::initBackend() { bool returnCode = false; QString var; ResponseProperties * temp; foreach (var, responseListCode) { temp = new ResponseProperties(); temp->manager = &defaultManager; responseListIndex.insert(var, temp) ; } temp = responseListIndex["004D"]; temp->code = QByteArray::fromHex("004D"); temp->description = "Device announce"; temp->properties = { // {rang, {designation, nbyte, isvalue}} // isvalue = 0 => display value // = 1 => is array of bits // = 2 => is index of string in list // = 3 => launch a subroutine pointed by propertyManagerList // = 4 => is a list of objects {0, {"Short address", 2, 0}}, // uint16_t {1, {"IEEE address", 4, 0}}, // uint64_t {2, {"MAC capability", 1, 3}} }; temp->propertyManagerList[2] = &macCapabilityManager; temp->manager = &defaultManager; temp->propertyDetail[2] = { {1, "Alternate PAN Coordinator"}, {2, "Device Type"}, {4, "Power source"}, {8, "Receiver On when Idle"}, {64, "Security capability"}, {128, "Allocate Address"} }; // ***************************************************************************** // MAC capability // Bit 0 - Alternate PAN Coordinator // Bit 1 - Device Type // Bit 2 - Power source // Bit 3 - Receiver On when Idle // Bit 4,5 - Reserved // Bit 6 - Security capability // Bit 7 - Allocate Address // ****************************************************************************** temp = responseListIndex["8000"]; temp->code = QByteArray::fromHex("8000"); temp->description = "Status returned by command"; temp->properties = { {0, {"Status", 1, 2}}, // {1, {"Sequence number", 1, 0}}, // {2, {"Packet Type", 2, 0}}, // {3, {"Optional additional error information", -1, 5}} // }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Success"}, {1, "Incorrect parameters"}, {2, "Unhandled command"}, {3, "Command failed"}, {4, "Busy (Node is carrying out a lengthy operation and is currently unable to handle the incoming command)"}, {5, "Stack already started (no new configuration accepted)"}, {-1, "Failed"} }; // ***************************************************************************** // // Status : // // 0 = Success // // 1 = Incorrect parameters // // 2 = Unhandled command // // 3 = Command failed // // 4 = Busy (Node is carrying out a lengthy operation and is currently unable to handle the incoming command) // // 5 = Stack already started (no new configuration accepted) // // 128 – 244 = Failed (ZigBee event codes) // // Packet Type: The value of the initiating command request. // ****************************************************************************** temp = responseListIndex["8001"]; temp->code = QByteArray::fromHex("8001"); temp->description = "Log message"; temp->properties = { {0, {"Log level", 1, 2}}, // uint8_t {1, {"Log message", -1, 5}} // string }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Emergency"}, {1, "Alert"}, {2, "Critical"}, {3, "Error"}, {4, "Warning"}, {5, "Notice"}, {6, "Information"}, {7, "Debug"} }; // ********************************************************************************* // 0 = Emergency // 1 = Alert // 2 = Critical // 3 = Error // 4 = Warning // 5 = Notice // 6 = Information // 7 = Debug // ********************************************************************************* temp = responseListIndex["8002"]; temp->code = QByteArray::fromHex("8002"); temp->description = "Data indication"; temp->properties = { {0, {"status", 1, 1}}, // uint8_t {1, {"Profile ID", 2, 0}}, // uint16_t {2, {"Cluster ID", 2, 0}}, // uint16_t {3, {"Source endpoint", 1, 0}}, // uint8_t {4, {"Destination endpoint", 1, 0}}, // uint8_t {5, {"Source address mode", 1, 0}}, // uint8_t TODO {6, {"Source address", 2, 0}}, // uint16_t or uint64_t {7, {"Destination address mode", 0}}, // uint8_t TODO {8, {"Destination address", 2}}, // uint16_t or uint64_t {9, {"Payload size", 1}}, // uint8_t {10, {"Payload", -1}} // data each element is uint8_t }; temp->manager = &defaultManager; //dataIndicationManager temp = responseListIndex["8003"]; temp->code = QByteArray::fromHex("8003"); temp->description = "list of object's clusters"; temp->properties = { {0, {"Source endpoint", 1, 0}}, // uint8_t {1, {"Profile ID", 2, 0}}, // uint16_t {2, {"Cluster list", 0, 0}}, // data each entry is uint16_t {3, {"Source endpoint", 1, 0}}, // uint8_t {4, {"Profile ID", 2, 0}}, // uint16_t {5, {"Cluster ID", 2, 0}}, // uint16_t {6, {"Attribute list", 2 ,0}} // data each entry is uint16_t }; temp->manager = &clustersListManager; temp = responseListIndex["8004"]; temp->code = QByteArray::fromHex("8004"); temp->description = "list of object's attributes"; temp->properties = { {0, {"Source endpoint", 1, 0}}, // uint8_t {1, {"Profile ID", 2, 0}}, // uint16_t {2, {"Cluster ID", 2, 0}}, // uint16_t {3, {"Attribute list", 2, 0}} // data each entry is uint16_t> }; temp->manager = &defaultManager; //TODO temp = responseListIndex["8005"]; temp->code = QByteArray::fromHex("8005"); temp->description = "List of object's commands"; temp->properties = { {0, {"Source endpoint", 1, 0}}, // uint8_t {1, {"Profile ID", 1, 0}}, // uint16_t {2, {"Cluster ID", 1, 0}}, // uint16_t {3, {"Command ID list", -1, 0}} // data each entry is uint8_t }; temp->manager = &defaultManager; //TODO temp = responseListIndex["8006"]; temp->code = QByteArray::fromHex("8006"); temp->description = "Status after restart"; temp->properties = { {0, {"Status after restart: ", 1, 2}} }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Startup"}, {1, "NFN_START"}, {2, "RUNNING"}, }; // ***************************************************************************** // 0 - STARTUP // 2 - NFN_START // 6 - RUNNING // The node is provisioned from previous restart. // ***************************************************************************** temp = responseListIndex["8007"]; temp->code = QByteArray::fromHex("8007"); temp->description = "Status after start"; temp->properties = { {0, {"Status after start: ", 1, 2}} }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Startup"}, {1, "NFN_START"}, {2, "RUNNING"}, }; temp = responseListIndex["8008"]; temp->code = QByteArray::fromHex("8008"); temp->description = "HeartBeat"; temp->properties = { {0, {"UTC time :", 4, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8009"]; temp->code = QByteArray::fromHex("8009"); temp->description = "Network state"; temp->properties = { {0, {"Short Address: ", 2, 0}}, {1, {"Extended Address: ", 8, 0}}, {2, {"PAN ID: ", 2, 0}}, {3, {"Extended PAN ID: ", 8, 0}}, {4, {"Channel: ", 8, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8010"]; temp->code = QByteArray::fromHex("8010"); temp->description = "Version List"; temp->properties = { {0, {"Major version number", 2, 0}}, // uint16_t {1, {"Installer version number", 2, 0}} // uint16_t }; temp->manager = &defaultManager; temp = responseListIndex["8011"]; temp->code = QByteArray::fromHex("8011"); temp->description = "Ack Data"; temp->properties = { {0, {"Status: ", 1, 0}}, {1, {"Destination address: ", 2, 0}}, {2, {"Destination endpoint: ", 1, 0}}, {3, {"Cluster ID :", 2, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8012"]; temp->code = QByteArray::fromHex("8012"); temp->description = "DATA_CONFIRM"; temp->properties = { {0, {"Status: ", 1, }}, {1, {"Source Endpoint: ", 1, 0}}, {2, {"Destination endpoint: ", 1, 0}}, {3, {"Destination Address mode:", 1, 0}}, {4, {"Destination IEEE address: ", 8, 0}}, {5, {"APS Sequence number: ", 1, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8014"]; temp->code = QByteArray::fromHex("8014"); temp->description = "Permit join status response"; temp->properties = { {0, {"Status", 1, 2}} // bool_t }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Off"}, {1, "On"} }; temp = responseListIndex["8015"]; temp->code = QByteArray::fromHex("8015"); temp->description = "Device list"; temp->properties = { {0, {"Device List", 1, 4}} // bool_t }; temp->manager = &deviceListManager; temp = responseListIndex["8017"]; temp->code = QByteArray::fromHex("8017"); temp->description = "Time server"; temp->properties = { {0, {"UTC Time: ", 1, 0}} // from 2000-01-01 00:00:00 }; temp->manager = &defaultManager; temp = responseListIndex["8024"]; temp->code = QByteArray::fromHex("8024"); temp->description = "Network joined/formed"; temp->properties = { {0, {"Status", 1, 2}}, // uint8_t {1, {"Short address", 2, 0}}, // uint16_t {2, {"Extended address", 4, 0}}, // uint64_t {3, {"Channel", 1, 0}} // uint8_t }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "Joined"}, {1, "Formed new network"}, {-1, "Failed"} }; temp = responseListIndex["8028"]; temp->code = QByteArray::fromHex("8028"); temp->description = "Authenticate response"; temp->properties = { {0, {"IEEE address of the Gateway: ", 8, 0}}, {1, {"Encrypted Key: ", 16, 0}}, {2, {"MIC: ", 4, 0}}, {3, {"IEEE address of the initiating node: ", 8, 0}}, {4, {"Active Key Sequence number: ", 1, 0}}, {5, {"Channel: ", 1, 0}}, {6, {"Short PAN Id: ", 2, 0}}, {7, {"Extended PAN ID: ", 8, 0}}, }; temp->manager = &defaultManager; temp = responseListIndex["802B"]; temp->code = QByteArray::fromHex("802B"); temp->description = "User Descriptor Notify"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uin8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"Network address of interest", 2, 0}} // uint16_t }; temp->manager = &defaultManager; temp = responseListIndex["802C"]; temp->code = QByteArray::fromHex("802C"); temp->description = "User Descriptor Response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uin8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"Network address of interest", 2, 0}}, // uint16_6 {3, {"Length", 1, 0}}, // uint8_t {4, {"Data", -1}} // uint8_t stream }; temp->manager = &defaultManager; temp = responseListIndex["8030"]; temp->code = QByteArray::fromHex("8030"); temp->description = "Bind response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1}}, // uint8_t {2, {"Source address mode: ", 1, 0}}, // uint8_t> (only from v3.1a) {3, {"Source Address: ", 2, 0}} // uint16_t> (only from v3.1a) }; temp->manager = &defaultManager; temp = responseListIndex["8031"]; temp->code = QByteArray::fromHex("8031"); temp->description = "Unbind response"; temp->properties = { {0, {"Sequence number", 1}}, // uint8_t {1, {"Status", 1}}, // uint8_t {2, {"Source address mode: ", 1, 0}}, // uint8_t> (only from v3.1a) {3, {"Source Address: ", 2, 0}} // uint16_t> (only from v3.1a) }; temp->manager = &defaultManager; temp = responseListIndex["8035"]; temp->code = QByteArray::fromHex("8035"); temp->description = "PDM event"; temp->properties = { {0, {"Event status: ", 1, 2}}, // uint8_t {1, {"record ID: ", 4, 0}} // uint8_t }; temp->manager = &defaultManager; temp->propertyDetail[0] = { {0, "E_PDM_SYSTEM_EVENT_WEAR_COUNT_TRIGGER_VALUE_REACHED"}, {1, "E_PDM_SYSTEM_EVENT_DESCRIPTOR_SAVE_FAILED"}, {1, "E_PDM_SYSTEM_EVENT_PDM_NOT_ENOUGH_SPACE"}, {1, "E_PDM_SYSTEM_EVENT_LARGEST_RECORD_FULL_SAVE_NO_LONGER_POSSIBLE"}, {1, "E_PDM_SYSTEM_EVENT_SEGMENT_DATA_CHECKSUM_FAIL"}, {1, "E_PDM_SYSTEM_EVENT_SEGMENT_SAVE_OK"}, {1, "E_PDM_SYSTEM_EVENT_EEPROM_SEGMENT_HEADER_REPAIRED"}, {1, "E_PDM_SYSTEM_EVENT_SYSTEM_INTERNAL_BUFFER_WEAR_COUNT_SWAP"}, {1, "E_PDM_SYSTEM_EVENT_SYSTEM_DUPLICATE_FILE_SEGMENT_DETECTED"}, {1, "E_PDM_SYSTEM_EVENT_SYSTEM_ERROR"}, {1, "E_PDM_SYSTEM_EVENT_SEGMENT_PREWRITE"}, {1, "E_PDM_SYSTEM_EVENT_SEGMENT_POSTWRITE"}, {1, "E_PDM_SYSTEM_EVENT_SEQUENCE_DUPLICATE_DETECTED"}, {1, "E_PDM_SYSTEM_EVENT_SEQUENCE_VERIFY_FAIL"}, {1, "E_PDM_SYSTEM_EVENT_PDM_SMART_SAVE"}, {1, "E_PDM_SYSTEM_EVENT_PDM_FULL_SAVE"} }; temp = responseListIndex["8040"]; temp->code = QByteArray::fromHex("8040"); temp->description = "Network Address response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uin8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"IEEE address", 4, 0}}, // uint64_t {3, {"Short address", 2, 0}}, // uint16_t {4, {"Number of associated devices", 1, 0}}, // uint8_t {5, {"Start index", 1, 0}}, // uint8_t {6, {"Device list", -1, 4}} // data each entry is uint16_t> }; temp->manager = &networkAddressManager; temp = responseListIndex["8041"]; temp->code = QByteArray::fromHex("8041"); temp->description = "IEEE Address response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uin8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"IEEE address", 4, 0}}, // uint64_t {3, {"Short address", 2, 0}}, // uint16_t {4, {"Number of associated devices", 1, 0}}, // uint8_t {5, {"Start index", 1, 0}}, // uint8_t {6, {"Device list", -1, 4}} // data each entry is uint16_t }; temp->manager = &iEEEAddressManager; temp = responseListIndex["8042"]; temp->code = QByteArray::fromHex("8042"); temp->description = "Node Descriptor response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Network address", 2, 0}}, // uint16_t {2, {"Manufacturer code", 2, 0}}, // uint16_t {3, {"Max Rx Size", 2, 0}}, // uint16_t {4, {"Max Tx Size", 2, 0}}, // uint16_t {5, {"Server mask", 2, 0}}, // uint16_t {6, {"Descriptor capability", 1, 0}}, // uint8_t {7, {"Mac flags", 1, 0}}, // uint8_t {8, {"Max buffer size", 1, 0}}, // uint8_t {9, {"Bit fields", 2, -1}} // uint16_t }; temp->manager = &nodeDescriptorManager; temp = responseListIndex["8043"]; temp->code = QByteArray::fromHex("8043"); temp->description = "Simple Descriptor response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"NwkAddress", 2, 0}}, // uint16_t {3, {"Length", 1, 0}}, // uint8_t {4, {"Endpoint", 1, 0}}, // uint8_t {5, {"Profile", 2, 0}}, // uint16_t {6, {"Device id", 2, 0}}, // uint16_t {7, {"Bit fields", 1, 0}}, // uint8_t {8, {"InClusterCount", 1, 0}}, // uint8_t {9, {"In cluster list", 0, 0}}, // data each entry is uint16_t> {10, {"Out Cluster Count", 1, 0}}, // uint8_t {11, {"Out cluster list", -1, 0}} // data each entry is uint16_t }; temp->manager = &defaultManager; //TODO temp = responseListIndex["8044"]; temp->code = QByteArray::fromHex("8044"); temp->description = "Power Descriptor response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uin8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"bit field", 2, }} // uint16_t }; temp->manager = &defaultManager; // ****************************************** // 0 to 3: current power mode // 4 to 7: available power source // 8 to 11: current power source // 12 to 15: current power source level // ****************************************** temp = responseListIndex["8045"]; temp->code = QByteArray::fromHex("8045"); temp->description = "Active Endpoint response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"Address", 2, 0}}, // uint16_t {3, {"Endpoint count", 1, 0}}, // uint8_t {4, {"Active endpoint list", -1, 0}} // each data element of the type uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["8046"]; temp->code = QByteArray::fromHex("8046"); temp->description = "Match Descriptor response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"Network address", 2, 0}}, // uint16_t {3, {"Length of list", 1, 0}}, // uint8_t {4, {"Match list", -1, 0}} // data each entry is uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["8047"]; temp->code = QByteArray::fromHex("8047"); temp->description = "Management Leave response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1, 0}} // uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["8048"]; temp->code = QByteArray::fromHex("8048"); temp->description = "Leave indication"; temp->properties = { {0, {"Extended address", 4, 0}}, // uint64_t {1, {"Rejoin status", 1, 0}} // uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["8049"]; temp->code = QByteArray::fromHex("8049"); temp->description = "PDM child table size"; temp->properties = { {0, {"Number of child: ", 1, 0}} // data each entry is uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["804A"]; temp->code = QByteArray::fromHex("804A"); temp->description = "Management Network Update response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"Status", 1, 0}}, // uint8_t {2, {"Total transmission", 2, 0}}, // uint16_t {3, {"Transmission failures", 2, 0}}, // uint16_t {4, {"Scanned channels", 4, 0}}, // uint32_t {5, {"Scanned channel list count", 1, 0}}, // uint8_t {6, {"Channel list", -1, 0}} // list each element is uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["804B"]; temp->code = QByteArray::fromHex("804B"); temp->description = "System Server Discovery response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"status", 1, 0}}, // uint8_t {2, {"Server mask", 2, 0}} // uint16_t }; temp->manager = &defaultManager; temp = responseListIndex["804E"]; temp->code = QByteArray::fromHex("804E"); temp->description = "Management LQI response"; temp->properties = { {0, {"Sequence number", 1, 0}}, // uint8_t {1, {"status", 1, 0}}, // uint8_t {2, {"Neighbour Table Entries ", 1, 0}}, // uint8_t {3, {"Neighbour Table List Count ", 1, 0}}, // uint8_t {4, {"Start Index ", 1, 0}}, // uint8_t {5, {"List of Entries elements described below", -1, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8060"]; temp->code = QByteArray::fromHex("8060"); temp->description = "Add group"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Status: ", 1, 0}}, //(added only from 3.0f version) {4, {"Group id :", 2, 0}}, //(added only from 3.0f version) {5, {"Source Address: ", 2, 0}}, //(added only from 3.0f version) {6, {"Number of child: ", 1, 0}} // data each entry is uint8_t }; temp->manager = &defaultManager; temp = responseListIndex["8061"]; temp->code = QByteArray::fromHex("8061"); temp->description = "View group"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Status: ", 1, 0}}, //(added only from 3.0f version) {4, {"Group id :", 2, 0}}, //(added only from 3.0f version) {5, {"Source Address: ", 2, 0}} //(added only from 3.0f version) }; temp->manager = &defaultManager; temp = responseListIndex["8062"]; temp->code = QByteArray::fromHex("8062"); temp->description = "Group membership"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Source Address:", 2, 0}}, //(added only from 3.0d version) {4, {"Capacity: ", 1, 0}}, {5, {"Group count: ", 1, 0}}, {6, {"List of Group id: ", 2, 0}}, //list each data item uint16_t> {7, {"Source Addr: ", 2, 0}} //(added only from 3.0f version) }; temp->manager = &defaultManager; temp = responseListIndex["8063"]; temp->code = QByteArray::fromHex("8063"); temp->description = "Remove group"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Source Address:", 2, 0}}, //(added only from 3.0d version) {4, {"Status: ", 1, 0}}, {5, {"Group ID: ", 2, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8085"]; temp->code = QByteArray::fromHex("8085"); temp->description = "Level update"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Source Address mode:", 1, 0}}, //(added only from 3.0d version) {4, {"Source Address:", 2, 0}}, //(added only from 3.0d version) {5, {"Status: ", 1, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8095"]; temp->code = QByteArray::fromHex("8095"); temp->description = "On/Off"; temp->properties = { {0, {"Sequence number: ", 1, 0}}, {1, {"Endpoint: ", 1, 0}}, {2, {"Cluster id: ", 2, 0}}, {3, {"Source Address mode:", 1, 0}}, //(added only from 3.0d version) {4, {"Source Address:", 2, 0}}, //(added only from 3.0d version) {5, {"Status: ", 1, 0}} }; temp->manager = &defaultManager; temp = responseListIndex["8140"]; temp->code = QByteArray::fromHex("8140"); temp->description = "Attribute Discovery response"; temp->properties = { {0, {"Complete", 1, 0}}, // uint8_t {1, {"Attribute type", 1, 0}}, // uint8_t {2, {"Attribute id", 2, 0}} // uint16_t }; temp->manager = &defaultManager; serialManager.initSerial(); connect(&serialManager, SIGNAL(datasReady(QByteArray)), this, SLOT(interpretResult(QByteArray))); resetCoordinator(); getVersion(); return returnCode; } void infoOutput(Response *object) { cout << object->code.toHex().toStdString() << " : " << object->description.toStdString() << endl; }