summaryrefslogtreecommitdiff
path: root/FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c')
-rw-r--r--FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c b/FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c
new file mode 100644
index 000000000..9e8c7e7a9
--- /dev/null
+++ b/FreeRTOS-Labs/Source/FreeRTOS-IoT-Libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c
@@ -0,0 +1,160 @@
+/*
+ * AWS IoT Shadow V2.1.0
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * @file aws_iot_shadow_static_memory.c
+ * @brief Implementation of Shadow static memory functions.
+ */
+
+/* The config header is always included first. */
+#include "iot_config.h"
+
+/* This file should only be compiled if dynamic memory allocation is forbidden. */
+#if IOT_STATIC_MEMORY_ONLY == 1
+
+/* Standard includes. */
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+/* Static memory include. */
+#include "iot_static_memory.h"
+
+/* Shadow internal include. */
+#include "private/aws_iot_shadow_internal.h"
+
+/*-----------------------------------------------------------*/
+
+/**
+ * @cond DOXYGEN_IGNORE
+ * Doxygen should ignore this section.
+ *
+ * Provide default values for undefined configuration constants.
+ */
+#ifndef AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS
+ #define AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS ( 10 )
+#endif
+#ifndef AWS_IOT_SHADOW_SUBSCRIPTIONS
+ #define AWS_IOT_SHADOW_SUBSCRIPTIONS ( 2 )
+#endif
+/** @endcond */
+
+/* Validate static memory configuration settings. */
+#if AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS <= 0
+ #error "AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS cannot be 0 or negative."
+#endif
+#if AWS_IOT_SHADOW_SUBSCRIPTIONS <= 0
+ #error "AWS_IOT_SHADOW_SUBSCRIPTIONS cannot be 0 or negative."
+#endif
+
+/**
+ * @brief The size of a static memory Shadow subscription.
+ *
+ * Since the pThingName member of #_shadowSubscription_t is variable-length,
+ * the constant `AWS_IOT_MAX_THING_NAME_LENGTH` is used for the length of
+ * #_shadowSubscription_t.pThingName.
+ */
+#define SHADOW_SUBSCRIPTION_SIZE ( sizeof( _shadowSubscription_t ) + AWS_IOT_MAX_THING_NAME_LENGTH )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Static memory buffers and flags, allocated and zeroed at compile-time.
+ */
+static uint32_t _pInUseShadowOperations[ AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS ] = { 0U }; /**< @brief Shadow operation in-use flags. */
+static _shadowOperation_t _pShadowOperations[ AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS ] = { { .link = { 0 } } }; /**< @brief Shadow operations. */
+
+static uint32_t _pInUseShadowSubscriptions[ AWS_IOT_SHADOW_SUBSCRIPTIONS ] = { 0U }; /**< @brief Shadow subscription in-use flags. */
+static char _pShadowSubscriptions[ AWS_IOT_SHADOW_SUBSCRIPTIONS ][ SHADOW_SUBSCRIPTION_SIZE ] = { { 0 } }; /**< @brief Shadow subscriptions. */
+
+/*-----------------------------------------------------------*/
+
+void * AwsIotShadow_MallocOperation( size_t size )
+{
+ int32_t freeIndex = -1;
+ void * pNewOperation = NULL;
+
+ /* Check size argument. */
+ if( size == sizeof( _shadowOperation_t ) )
+ {
+ /* Find a free Shadow operation. */
+ freeIndex = IotStaticMemory_FindFree( _pInUseShadowOperations,
+ AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS );
+
+ if( freeIndex != -1 )
+ {
+ pNewOperation = &( _pShadowOperations[ freeIndex ] );
+ }
+ }
+
+ return pNewOperation;
+}
+
+/*-----------------------------------------------------------*/
+
+void AwsIotShadow_FreeOperation( void * ptr )
+{
+ /* Return the in-use Shadow operation. */
+ IotStaticMemory_ReturnInUse( ptr,
+ _pShadowOperations,
+ _pInUseShadowOperations,
+ AWS_IOT_SHADOW_MAX_IN_PROGRESS_OPERATIONS,
+ sizeof( _shadowOperation_t ) );
+}
+
+/*-----------------------------------------------------------*/
+
+void * AwsIotShadow_MallocSubscription( size_t size )
+{
+ int32_t freeIndex = -1;
+ void * pNewSubscription = NULL;
+
+ if( size <= SHADOW_SUBSCRIPTION_SIZE )
+ {
+ /* Get the index of a free Shadow subscription. */
+ freeIndex = IotStaticMemory_FindFree( _pInUseShadowSubscriptions,
+ AWS_IOT_SHADOW_SUBSCRIPTIONS );
+
+ if( freeIndex != -1 )
+ {
+ pNewSubscription = &( _pShadowSubscriptions[ freeIndex ][ 0 ] );
+ }
+ }
+
+ return pNewSubscription;
+}
+
+/*-----------------------------------------------------------*/
+
+void AwsIotShadow_FreeSubscription( void * ptr )
+{
+ /* Return the in-use Shadow subscription. */
+ IotStaticMemory_ReturnInUse( ptr,
+ _pShadowSubscriptions,
+ _pInUseShadowSubscriptions,
+ AWS_IOT_SHADOW_SUBSCRIPTIONS,
+ SHADOW_SUBSCRIPTION_SIZE );
+}
+
+/*-----------------------------------------------------------*/
+
+#endif