blob: 61671e217440c026ffca1d19ec29ca04c5b2f181 [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
}