blob: ea2fcb66e600d4caa8c3a82a88c59c8f15dadfeb [file] [log] [blame]
/**
*
* Copyright (c) 2020 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
*
* Copyright (c) 2020 Silicon Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/***************************************************************************//**
* @file
* @brief This is the source for the command line interface used for the ias zone
* server plugin.
*******************************************************************************
******************************************************************************/
#include "af.h"
#include "ias-zone-server.h"
//-----------------------------------------------------------------------------
// Globals
#define RESERVED_END 0x7FFF
#define MANUFACTURER_SPECIFIC_START 0x8000
#define MANUFACTURER_SPECIFIC_END 0xFFFE
void emberAfPluginIasZoneServerInfoCommand(void);
void emberAfPluginIasZoneServerChangeStatusCommand(void);
void emberAfPluginIasZoneServerSetEnrollmentMethodCommand(void);
static const char* infoArguments[] = {
"endpoint",
NULL,
};
static const char* changeStatusArguments[] = {
"new-status",
"time-since-occurred-seconds",
"endpoint",
NULL,
};
static const char* setEnrollmentModeArguments[] = {
"endpoint",
"enrollmentMode",
NULL,
};
EmberCommandEntry emberAfPluginIasZoneServerCommands[] = {
emberCommandEntryActionWithDetails("info",
emberAfPluginIasZoneServerInfoCommand,
"",
"Print IAS Zone information",
infoArguments),
emberCommandEntryActionWithDetails("change-status",
emberAfPluginIasZoneServerChangeStatusCommand,
"vu",
"Change the current Zone Status",
changeStatusArguments),
emberCommandEntryActionWithDetails("set-enrollment-mode",
emberAfPluginIasZoneServerSetEnrollmentMethodCommand,
"uu",
"Change the current enrollment method",
setEnrollmentModeArguments),
emberCommandEntryTerminator(),
};
typedef struct {
uint16_t zoneType;
const char* zoneTypeString;
} ZoneTypeToStringMap;
// These functions and variables are only used to generate strings used with
// emberAfIasZoneClusterPrintln calls, so if EMBER_AF_PRINT_IAS_ZONE_CLUSTER is
// not defined and they are compiled in, these declarations generate "function
// declared but never referenced" warnings
#if defined(EMBER_AF_PRINT_ENABLE) && defined(EMBER_AF_PRINT_IAS_ZONE_CLUSTER)
static ZoneTypeToStringMap zoneTypeToStringMap[] = {
{ 0x0000, "Standard CIE" },
{ 0x000d, "Motion Sensor" },
{ 0x0015, "Contact Switch" },
{ 0x0028, "Fire Sensor" },
{ 0x002a, "Water Sensor" },
{ 0x002b, "Gas Sensor" },
{ 0x002c, "Peersonal Emergency Device" },
{ 0x002d, "Vibration / Movement Sensor" },
{ 0x010f, "Remote Control" },
{ 0x0115, "Key Fob" },
{ 0x021d, "Keypad" },
{ 0x0225, "Standard Warning Device" },
{ 0xFFFF, NULL } // terminator
};
static const char manufacturerSpecificString[] = "Manufacturer Specific";
static const char invalidZoneTypeString[] = "Invalid";
static const char reservedString[] = "Reserved";
static const char notEnrolledString[] = "NOT Enrolled";
static const char enrolledString[] = "Enrolled";
static const char unknownZoneStateString[] = "Unknown";
//-----------------------------------------------------------------------------
// Functions
static const char* getZoneTypeString(uint16_t type)
{
uint16_t i = 0;
while (zoneTypeToStringMap[i].zoneTypeString != NULL) {
if (zoneTypeToStringMap[i].zoneType == type) {
return zoneTypeToStringMap[i].zoneTypeString;
}
i++;
}
if (type <= RESERVED_END) {
return reservedString;
}
if (type >= MANUFACTURER_SPECIFIC_START
&& type <= MANUFACTURER_SPECIFIC_END) {
return manufacturerSpecificString;
}
return invalidZoneTypeString;
}
static const char* getZoneStateString(uint8_t zoneState)
{
switch (zoneState) {
case EMBER_ZCL_IAS_ZONE_STATE_ENROLLED:
return enrolledString;
case EMBER_ZCL_IAS_ZONE_STATE_NOT_ENROLLED:
return notEnrolledString;
}
return unknownZoneStateString;
}
#endif //defined(EMBER_AF_PRINT_ENABLE)
//&& defined(EMBER_AF_PRINT_IAS_ZONE_CLUSTER)
static void getAttributes(uint8_t* returnCieAddress,
uint16_t* returnZoneStatus,
uint16_t* returnZoneType,
uint8_t* returnZoneState,
uint8_t endpoint)
{
EMBER_TEST_ASSERT(endpoint != EM_AF_UNKNOWN_ENDPOINT);
emberAfReadServerAttribute(endpoint,
ZCL_IAS_ZONE_CLUSTER_ID,
ZCL_IAS_CIE_ADDRESS_ATTRIBUTE_ID,
returnCieAddress,
EUI64_SIZE);
emberAfReadServerAttribute(endpoint,
ZCL_IAS_ZONE_CLUSTER_ID,
ZCL_ZONE_STATUS_ATTRIBUTE_ID,
(uint8_t*)returnZoneStatus,
2); // uint16_t size
emberAfReadServerAttribute(endpoint,
ZCL_IAS_ZONE_CLUSTER_ID,
ZCL_ZONE_TYPE_ATTRIBUTE_ID,
(uint8_t*)returnZoneType,
2); // uint16_t size
emberAfReadServerAttribute(endpoint,
ZCL_IAS_ZONE_CLUSTER_ID,
ZCL_ZONE_STATE_ATTRIBUTE_ID,
(uint8_t*)returnZoneState,
1); // uint8_t size
}
void emberAfPluginIasZoneServerInfoCommand(void)
{
uint8_t cieAddress[EUI64_SIZE];
uint16_t zoneStatus;
uint16_t zoneType;
uint8_t zoneState;
uint8_t endpoint = (uint8_t)emberUnsignedCommandArgument(0);
getAttributes(cieAddress,
&zoneStatus,
&zoneType,
&zoneState,
endpoint);
emberAfIasZoneClusterPrint("CIE Address: ");
emberAfPrintBigEndianEui64(cieAddress);
emberAfIasZoneClusterPrintln("");
emberAfIasZoneClusterPrintln("Zone Type: 0x%2X (%p)",
zoneType,
getZoneTypeString(zoneType));
emberAfIasZoneClusterPrintln("Zone State: 0x%X (%p)",
zoneState,
getZoneStateString(zoneState));
emberAfIasZoneClusterPrintln("Zone Status: 0x%2X",
zoneStatus);
emberAfIasZoneClusterPrintln("Zone ID: 0x%2X",
emberAfPluginIasZoneServerGetZoneId(endpoint));
}
void emberAfPluginIasZoneServerChangeStatusCommand(void)
{
uint16_t newStatus = (uint16_t)emberUnsignedCommandArgument(0);
uint8_t timeSinceOccurredSeconds = (uint8_t)emberUnsignedCommandArgument(1);
uint8_t endpoint = (uint8_t)emberUnsignedCommandArgument(2);
emberAfPluginIasZoneServerUpdateZoneStatus(endpoint,
newStatus,
timeSinceOccurredSeconds << 2);
}
void emberAfPluginIasZoneServerSetEnrollmentMethodCommand(void)
{
uint8_t endpoint = (uint8_t)emberUnsignedCommandArgument(0);
uint8_t enrollmentMode = (uint8_t)emberUnsignedCommandArgument(1);
emberAfPluginIasZoneClusterSetEnrollmentMethod(endpoint, enrollmentMode);
}
void emberAfPluginIasZoneServerChangeBackoffConfiguration(void)
{
#if defined(EMBER_AF_PLUGIN_IAS_ZONE_SERVER_ENABLE_QUEUE)
IasZoneStatusQueueRetryConfig retryConfig = {
(uint8_t)emberUnsignedCommandArgument(0),
(uint8_t)emberUnsignedCommandArgument(1),
(uint32_t)emberUnsignedCommandArgument(2),
(bool)emberUnsignedCommandArgument(3),
(uint16_t)emberUnsignedCommandArgument(4)
};
if (EMBER_BAD_ARGUMENT
== emberAfIasZoneServerConfigStatusQueueRetryParams(&retryConfig)) {
emberAfIasZoneClusterPrintln(
"Parameter error! Valid parameters: %s, %s, %s %d, %s.",
"0 < firstBackoff",
"0 < commonRatio",
"firstBackoff < maxBackoff <", IAS_ZONE_STATUS_QUEUE_RETRY_ABS_MAX_BACKOFF_TIME_SEC,
"0 < maxRetryAttempts");
}
#else
emberAfIasZoneClusterPrintln("Command error! IAS Zone Server status queue is not enabled");
#endif
}
void emberAfPluginIasZoneServerCliPrintQueue(void)
{
#if defined(EMBER_AF_PLUGIN_IAS_ZONE_SERVER_ENABLE_QUEUE)
emberAfPluginIasZoneServerPrintQueue();
#else
emberAfIasZoneClusterPrintln("Command error! IAS Zone Server status queue is not enabled");
#endif
}
void emberAfPluginIasZoneServerCliPrintQueueConfig(void)
{
#if defined(EMBER_AF_PLUGIN_IAS_ZONE_SERVER_ENABLE_QUEUE)
emberAfPluginIasZoneServerPrintQueueConfig();
#else
emberAfIasZoneClusterPrintln("Command error! IAS Zone Server status queue is not enabled");
#endif
}