blob: 2948f665674261f46db18d0c7e4104735db5230b [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
*******************************************************************************
******************************************************************************/
// *******************************************************************
// * util.h
// *
// *
// * Copyright 2007-2017 by Silicon Laboratories. All rights reserved. *80*
// *******************************************************************
#pragma once
#include <inttypes.h>
#include <messaging/ExchangeMgr.h>
// User asserts can override SLAB_ASSERT and should be defined as follows:
// void userAssert (int file, int line); // declaration
// #define USER_ASSERT(file, line) userAssert(file, line) // definition
#if defined(NO_ASSERT)
#define SLAB_ASSERT(expr)
#else
#if defined(USER_ASSERT)
#define SLAB_ASSERT(expr) ((expr) ? ((void) 0) : USER_ASSERT(__FILE__, __LINE__))
#else
#define SLAB_ASSERT(expr) ((expr) ? ((void) 0) : slabAssert(__FILE__, __LINE__))
#endif // USER_ASSERT
#endif // NO_ASSERT
// This controls the type of response. Normally The library sends an automatic
// response (if appropriate) on the same PAN. The reply can be disabled by
// calling emberAfSetNoReplyForNextMessage.
#define ZCL_UTIL_RESP_NORMAL 0
#define ZCL_UTIL_RESP_NONE 1
#define ZCL_UTIL_RESP_INTERPAN 2
// Cluster name structure
typedef struct
{
chip::ClusterId id;
const char * name;
} EmberAfClusterName;
extern const EmberAfClusterName zclClusterNames[];
#define ZCL_NULL_CLUSTER_ID 0xFFFF
#include <app/util/af.h>
// Override APS retry: 0 - don't touch, 1 - always set, 2 - always unset
typedef enum
{
EMBER_AF_RETRY_OVERRIDE_NONE = 0,
EMBER_AF_RETRY_OVERRIDE_SET = 1,
EMBER_AF_RETRY_OVERRIDE_UNSET = 2
} EmberAfRetryOverride;
// The default APS retry flag value is controlled by EMBER_AF_DEFAULT_APS_OPTIONS
// and is usually 1. In high traffic, low bandwidth networks (e.g. sub-GHz),
// the app may want to override this. Two methods are available for apps that
// may wants to do this dynamically per message:
// 1. Call emberAfSetRetryOverride each time before filling the message buffer;
// 2. Call emberAfSetRetryOverride once with a value covering most messages and
// then toggling the flag as necessary in emberAfPreMessageSendCallback.
void emberAfSetRetryOverride(EmberAfRetryOverride value);
// Return the current override status
EmberAfRetryOverride emberAfGetRetryOverride(void);
// This function applies the curent override value to the APS options.
// It is called internally by the framework in the final stages of filling the
// message buffer.
void emAfApplyRetryOverride(EmberApsOption * options);
// Override Disable Default Response flag in the ZCL Frame Control
typedef enum
{
EMBER_AF_DISABLE_DEFAULT_RESPONSE_NONE = 0, // no override
EMBER_AF_DISABLE_DEFAULT_RESPONSE_ONE_SHOT = 1, // next message only
EMBER_AF_DISABLE_DEFAULT_RESPONSE_PERMANENT = 2 // until cancelled
} EmberAfDisableDefaultResponse;
// The default value for the Disable Default Response flag in ZCL Frame Control
// is 0 (i.e. default responses are generated). The app can disable default
// reponses either for the next message only or for all messages until another
// call to this function.
void emberAfSetDisableDefaultResponse(EmberAfDisableDefaultResponse value);
// Return the current status
EmberAfDisableDefaultResponse emberAfGetDisableDefaultResponse(void);
// This function applies the curent override value to the ZCL Frame Control.
// It is called internally by the framework in the final stages of filling the
// message buffer.
void emAfApplyDisableDefaultResponse(uint8_t * frame_control);
// Returns a mfg code from current command.
// This should only be used within the command parsing context.
// Wraps emberAfCurrentCommand(), and assumes that the current comamnd
// is either the current valid command or NULL
// In the case of NULL, then it returns EMBER_AF_NULL_MANUFACTURER_CODE
uint16_t emberAfGetMfgCodeFromCurrentCommand(void);
// EMBER_AF_MAXIMUM_SEND_PAYLOAD_LENGTH is defined in config.h
#define EMBER_AF_RESPONSE_BUFFER_LEN EMBER_AF_MAXIMUM_SEND_PAYLOAD_LENGTH
void emberAfInit(chip::Messaging::ExchangeManager * exchangeContext);
void emberAfTick(void);
uint16_t emberAfFindClusterNameIndex(chip::ClusterId cluster);
void emberAfStackDown(void);
void emberAfDecodeAndPrintCluster(chip::ClusterId cluster);
/**
* Retrieves the difference between the two passed values.
* This function assumes that the two values have the same endianness.
* On platforms that support 64-bit primitive types, this function will work
* on data sizes up to 8 bytes. Otherwise, it will only work on data sizes of
* up to 4 bytes.
*/
EmberAfDifferenceType emberAfGetDifference(uint8_t * pData, EmberAfDifferenceType value, uint8_t dataSize);
/**
* Retrieves an uint64_t from the given Zigbee payload. The integer retrieved
* may be cast into an integer of the appropriate size depending on the
* number of bytes requested from the message. In Zigbee, all integers are
* passed over the air in LSB form. LSB to MSB conversion is
* done within this function automatically before the integer is returned.
*
* Obviously (due to return value) this function can only handle
* the retrieval of integers between 1 and 8 bytes in length.
*
*/
uint64_t emberAfGetInt(const uint8_t * message, uint16_t currentIndex, uint16_t msgLen, uint8_t bytes);
void emberAfClearResponseData(void);
uint8_t * emberAfPutInt8uInResp(uint8_t value);
uint16_t * emberAfPutInt16uInResp(uint16_t value);
uint32_t * emberAfPutInt32uInResp(uint32_t value);
uint32_t * emberAfPutInt24uInResp(uint32_t value);
uint8_t * emberAfPutBlockInResp(const uint8_t * data, uint16_t length);
uint8_t * emberAfPutStringInResp(const uint8_t * buffer);
uint8_t * emberAfPutDateInResp(EmberAfDate * value);
void emberAfPutInt16sInResp(int16_t value);
void emberAfPutStatusInResp(EmberAfStatus value);
bool emberAfIsThisMyEui64(EmberEUI64 eui64);
#ifdef EZSP_HOST
// the EM260 host application is expected to provide these functions if using
// a cluster that needs it.
EmberNodeId emberGetSender(void);
EmberStatus emberGetSenderEui64(EmberEUI64 senderEui64);
#endif // EZSP_HOST
// DEPRECATED.
extern uint8_t emberAfIncomingZclSequenceNumber;
// the caller to the library can set a flag to say do not respond to the
// next ZCL message passed in to the library. Passing true means disable
// the reply for the next ZCL message. Setting to false re-enables the
// reply (in the case where the app disables it and then doesnt send a
// message that gets parsed).
void emberAfSetNoReplyForNextMessage(bool set);
#define isThisDataTypeSentLittleEndianOTA(dataType) (!(emberAfIsThisDataTypeAStringType(dataType)))
extern uint8_t emberAfResponseType;
uint16_t emberAfStrnlen(const uint8_t * string, uint16_t maxLength);
/* @brief Append characters to a ZCL string.
*
* Appending characters to an existing ZCL string. If it is an invalid string
* (length byte equals 0xFF), no characters will be appended.
*
* @param zclString - pointer to the zcl string
* @param zclStringMaxLen - length of zcl string (does not include zcl length byte)
* @param src - pointer to plain text characters
* @param srcLen - length of plain text characters
*
* @return number of characters appended
*
*/
uint8_t emberAfAppendCharacters(uint8_t * zclString, uint8_t zclStringMaxLen, const uint8_t * appendingChars,
uint8_t appendingCharsLen);
EmberStatus emAfValidateChannelPages(uint8_t page, uint8_t channel);
/* @brief A Silicon Labs assert function
*
* This function is provided to call an assert function in the application code.
* It starts an infinite loop that provokes the watchdog to fire.
*
* @param file - the source file that calls this assert
* @param line - the line that calls this assert
*
* @return void
*
*/
void slabAssert(const char * file, int line);
/* @brief Get the page number from an 8-bit encoded channel-page
*
* The top three bits denote the page number, like this:
* 000x xxxx = page 0
* 100x xxxx = page 28
* 101x xxxx = page 29
* 110x xxxx = page 30
* 111x xxxx = page 31
*
* @param chanPg - 8-bit encoded channel and page
*
* @return page number (0, 28-31, 0xFF if invalid)
*/
uint8_t emberAfGetPageFrom8bitEncodedChanPg(uint8_t chanPg);
/* @brief Get the channel number from an 8-bit encoded channel-page
*
* The bottom 5 bits denote the channel within the page.
*
* Provided for symmetry with the above emberAfGetPageFrom8bitEncodedChanPg().
* It simply masks the bottom 5 bits.
*
* @param chanPg - 8-bit encoded channel and page
*
* @return channel number (0-8, 0-26, 11-26, depending on the page)
*/
uint8_t emberAfGetChannelFrom8bitEncodedChanPg(uint8_t chanPg);
/* @brief Make an 8-bit encoded channel-page from channel and page arguments
*
* @param page
* @param channel
*
* @return 8-bit encoded channel-page, 0xFF if invalid
*/
uint8_t emberAfMake8bitEncodedChanPg(uint8_t page, uint8_t channel);
bool emberAfContainsAttribute(chip::EndpointId endpoint, chip::ClusterId clusterId, chip::AttributeId attributeId);
/* @brief returns true if the attribute is known to be volatile (i.e. RAM
* storage).
*/
bool emberAfIsKnownVolatileAttribute(chip::EndpointId endpoint, chip::ClusterId clusterId, chip::AttributeId attributeId);
namespace chip {
chip::Messaging::ExchangeManager * ExchangeManager();
} // namespace chip