Simple sample that demonstrates reading the FXOS8700CQ accelerometer, convert the data to JSON and send to an Azure IoT Hub.

Dependencies:   azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip

Committer:
markrad
Date:
Tue Apr 25 01:33:13 2017 +0000
Revision:
7:2564d95cbf81
Parent:
3:c0556ff7b8e3
Fix bug in NTP library. Clean up code some.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 3:c0556ff7b8e3 1 // Copyright (c) Microsoft. All rights reserved.
markrad 3:c0556ff7b8e3 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 3:c0556ff7b8e3 3
markrad 3:c0556ff7b8e3 4 #include "azure_c_shared_utility/optionhandler.h"
markrad 3:c0556ff7b8e3 5 #include "azure_c_shared_utility/xlogging.h"
markrad 3:c0556ff7b8e3 6 #include "azure_c_shared_utility/gballoc.h"
markrad 3:c0556ff7b8e3 7 #include "azure_c_shared_utility/vector.h"
markrad 3:c0556ff7b8e3 8
markrad 3:c0556ff7b8e3 9 typedef struct OPTION_TAG
markrad 3:c0556ff7b8e3 10 {
markrad 3:c0556ff7b8e3 11 const char* name;
markrad 3:c0556ff7b8e3 12 void* storage;
markrad 3:c0556ff7b8e3 13 }OPTION;
markrad 3:c0556ff7b8e3 14
markrad 3:c0556ff7b8e3 15 typedef struct OPTIONHANDLER_HANDLE_DATA_TAG
markrad 3:c0556ff7b8e3 16 {
markrad 3:c0556ff7b8e3 17 pfCloneOption cloneOption;
markrad 3:c0556ff7b8e3 18 pfDestroyOption destroyOption;
markrad 3:c0556ff7b8e3 19 pfSetOption setOption;
markrad 3:c0556ff7b8e3 20 VECTOR_HANDLE storage;
markrad 3:c0556ff7b8e3 21 }OPTIONHANDLER_HANDLE_DATA;
markrad 3:c0556ff7b8e3 22
markrad 3:c0556ff7b8e3 23 OPTIONHANDLER_HANDLE OptionHandler_Create(pfCloneOption cloneOption, pfDestroyOption destroyOption, pfSetOption setOption)
markrad 3:c0556ff7b8e3 24 {
markrad 3:c0556ff7b8e3 25 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
markrad 3:c0556ff7b8e3 26 OPTIONHANDLER_HANDLE_DATA* result;
markrad 3:c0556ff7b8e3 27 if (
markrad 3:c0556ff7b8e3 28 (cloneOption == NULL) ||
markrad 3:c0556ff7b8e3 29 (destroyOption == NULL) ||
markrad 3:c0556ff7b8e3 30 (setOption == NULL)
markrad 3:c0556ff7b8e3 31 )
markrad 3:c0556ff7b8e3 32 {
markrad 3:c0556ff7b8e3 33 LogError("invalid parameter = pfCloneOption cloneOption=%p, pfDestroyOption destroyOption=%p, pfSetOption setOption=%p", cloneOption, destroyOption, setOption);
markrad 3:c0556ff7b8e3 34 result = NULL;
markrad 3:c0556ff7b8e3 35 }
markrad 3:c0556ff7b8e3 36 else
markrad 3:c0556ff7b8e3 37 {
markrad 3:c0556ff7b8e3 38 result = (OPTIONHANDLER_HANDLE_DATA*)malloc(sizeof(OPTIONHANDLER_HANDLE_DATA));
markrad 3:c0556ff7b8e3 39 if (result == NULL)
markrad 3:c0556ff7b8e3 40 {
markrad 3:c0556ff7b8e3 41 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
markrad 3:c0556ff7b8e3 42 LogError("unable to malloc");
markrad 3:c0556ff7b8e3 43 /*return as is*/
markrad 3:c0556ff7b8e3 44 }
markrad 3:c0556ff7b8e3 45 else
markrad 3:c0556ff7b8e3 46 {
markrad 3:c0556ff7b8e3 47 /*Codes_SRS_OPTIONHANDLER_02_002: [ OptionHandler_Create shall create an empty VECTOR that will hold pairs of const char* and void*. ]*/
markrad 3:c0556ff7b8e3 48 result->storage = VECTOR_create(sizeof(OPTION));
markrad 3:c0556ff7b8e3 49 if (result->storage == NULL)
markrad 3:c0556ff7b8e3 50 {
markrad 3:c0556ff7b8e3 51 /*Codes_SRS_OPTIONHANDLER_02_004: [ Otherwise, OptionHandler_Create shall fail and return NULL. ]*/
markrad 3:c0556ff7b8e3 52 LogError("unable to VECTOR_create");
markrad 3:c0556ff7b8e3 53 free(result);
markrad 3:c0556ff7b8e3 54 result= NULL;
markrad 3:c0556ff7b8e3 55 }
markrad 3:c0556ff7b8e3 56 else
markrad 3:c0556ff7b8e3 57 {
markrad 3:c0556ff7b8e3 58 /*Codes_SRS_OPTIONHANDLER_02_003: [ If all the operations succeed then OptionHandler_Create shall succeed and return a non-NULL handle. ]*/
markrad 3:c0556ff7b8e3 59 result->cloneOption = cloneOption;
markrad 3:c0556ff7b8e3 60 result->destroyOption = destroyOption;
markrad 3:c0556ff7b8e3 61 result->setOption = setOption;
markrad 3:c0556ff7b8e3 62 /*return as is*/
markrad 3:c0556ff7b8e3 63 }
markrad 3:c0556ff7b8e3 64 }
markrad 3:c0556ff7b8e3 65 }
markrad 3:c0556ff7b8e3 66 return result;
markrad 3:c0556ff7b8e3 67
markrad 3:c0556ff7b8e3 68 }
markrad 3:c0556ff7b8e3 69
markrad 3:c0556ff7b8e3 70 OPTIONHANDLER_RESULT OptionHandler_AddOption(OPTIONHANDLER_HANDLE handle, const char* name, const void* value)
markrad 3:c0556ff7b8e3 71 {
markrad 3:c0556ff7b8e3 72 OPTIONHANDLER_RESULT result;
markrad 3:c0556ff7b8e3 73 /*Codes_SRS_OPTIONHANDLER_02_001: [ OptionHandler_Create shall fail and retun NULL if any parameters are NULL. ]*/
markrad 3:c0556ff7b8e3 74 if (
markrad 3:c0556ff7b8e3 75 (handle == NULL) ||
markrad 3:c0556ff7b8e3 76 (name == NULL) ||
markrad 3:c0556ff7b8e3 77 (value == NULL)
markrad 3:c0556ff7b8e3 78 )
markrad 3:c0556ff7b8e3 79 {
markrad 3:c0556ff7b8e3 80 LogError("invalid arguments: OPTIONHANDLER_HANDLE handle=%p, const char* name=%p, void* value=%p", handle, name, value);
markrad 3:c0556ff7b8e3 81 result= OPTIONHANDLER_INVALIDARG;
markrad 3:c0556ff7b8e3 82 }
markrad 3:c0556ff7b8e3 83 else
markrad 3:c0556ff7b8e3 84 {
markrad 3:c0556ff7b8e3 85 const char* cloneOfName;
markrad 3:c0556ff7b8e3 86 if (mallocAndStrcpy_s((char**)&cloneOfName, name) != 0)
markrad 3:c0556ff7b8e3 87 {
markrad 3:c0556ff7b8e3 88 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 3:c0556ff7b8e3 89 LogError("unable to clone name");
markrad 3:c0556ff7b8e3 90 result = OPTIONHANDLER_ERROR;
markrad 3:c0556ff7b8e3 91 }
markrad 3:c0556ff7b8e3 92 else
markrad 3:c0556ff7b8e3 93 {
markrad 3:c0556ff7b8e3 94 /*Codes_SRS_OPTIONHANDLER_02_006: [ OptionHandler_AddProperty shall call pfCloneOption passing name and value. ]*/
markrad 3:c0556ff7b8e3 95 void* cloneOfValue = handle->cloneOption(name, value);
markrad 3:c0556ff7b8e3 96 if (cloneOfValue == NULL)
markrad 3:c0556ff7b8e3 97 {
markrad 3:c0556ff7b8e3 98 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 3:c0556ff7b8e3 99 LogError("unable to clone value");
markrad 3:c0556ff7b8e3 100 free((void*)cloneOfName);
markrad 3:c0556ff7b8e3 101 result = OPTIONHANDLER_ERROR;
markrad 3:c0556ff7b8e3 102 }
markrad 3:c0556ff7b8e3 103 else
markrad 3:c0556ff7b8e3 104 {
markrad 3:c0556ff7b8e3 105 OPTION temp;
markrad 3:c0556ff7b8e3 106 temp.name = cloneOfName;
markrad 3:c0556ff7b8e3 107 temp.storage = cloneOfValue;
markrad 3:c0556ff7b8e3 108 /*Codes_SRS_OPTIONHANDLER_02_007: [ OptionHandler_AddProperty shall use VECTOR APIs to save the name and the newly created clone of value. ]*/
markrad 3:c0556ff7b8e3 109 if (VECTOR_push_back(handle->storage, &temp, 1) != 0)
markrad 3:c0556ff7b8e3 110 {
markrad 3:c0556ff7b8e3 111 /*Codes_SRS_OPTIONHANDLER_02_009: [ Otherwise, OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_ERROR. ]*/
markrad 3:c0556ff7b8e3 112 LogError("unable to VECTOR_push_back");
markrad 3:c0556ff7b8e3 113 handle->destroyOption(name, cloneOfValue);
markrad 3:c0556ff7b8e3 114 free((void*)cloneOfName);
markrad 3:c0556ff7b8e3 115 result = OPTIONHANDLER_ERROR;
markrad 3:c0556ff7b8e3 116 }
markrad 3:c0556ff7b8e3 117 else
markrad 3:c0556ff7b8e3 118 {
markrad 3:c0556ff7b8e3 119 /*Codes_SRS_OPTIONHANDLER_02_008: [ If all the operations succed then OptionHandler_AddProperty shall succeed and return OPTIONHANDLER_OK. ]*/
markrad 3:c0556ff7b8e3 120 result = OPTIONHANDLER_OK;
markrad 3:c0556ff7b8e3 121 }
markrad 3:c0556ff7b8e3 122 }
markrad 3:c0556ff7b8e3 123 }
markrad 3:c0556ff7b8e3 124 }
markrad 3:c0556ff7b8e3 125 return result;
markrad 3:c0556ff7b8e3 126 }
markrad 3:c0556ff7b8e3 127
markrad 3:c0556ff7b8e3 128 OPTIONHANDLER_RESULT OptionHandler_FeedOptions(OPTIONHANDLER_HANDLE handle, void* destinationHandle)
markrad 3:c0556ff7b8e3 129 {
markrad 3:c0556ff7b8e3 130 OPTIONHANDLER_RESULT result;
markrad 3:c0556ff7b8e3 131 /*Codes_SRS_OPTIONHANDLER_02_010: [ OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_INVALIDARG if any argument is NULL. ]*/
markrad 3:c0556ff7b8e3 132 if (
markrad 3:c0556ff7b8e3 133 (handle == NULL) ||
markrad 3:c0556ff7b8e3 134 (destinationHandle == NULL)
markrad 3:c0556ff7b8e3 135 )
markrad 3:c0556ff7b8e3 136 {
markrad 3:c0556ff7b8e3 137 LogError("invalid arguments OPTIONHANDLER_HANDLE handle=%p, void* destinationHandle=%p", handle, destinationHandle);
markrad 3:c0556ff7b8e3 138 result = OPTIONHANDLER_INVALIDARG;
markrad 3:c0556ff7b8e3 139 }
markrad 3:c0556ff7b8e3 140 else
markrad 3:c0556ff7b8e3 141 {
markrad 3:c0556ff7b8e3 142 /*Codes_SRS_OPTIONHANDLER_02_011: [ Otherwise, OptionHandler_FeedOptions shall use VECTOR's iteration mechanisms to retrieve pairs of name, value (const char* and void*). ]*/
markrad 3:c0556ff7b8e3 143 size_t nOptions = VECTOR_size(handle->storage), i;
markrad 3:c0556ff7b8e3 144 for (i = 0;i < nOptions;i++)
markrad 3:c0556ff7b8e3 145 {
markrad 3:c0556ff7b8e3 146 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
markrad 3:c0556ff7b8e3 147 /*Codes_SRS_OPTIONHANDLER_02_012: [ OptionHandler_FeedOptions shall call for every pair of name,value setOption passing destinationHandle, name and value. ]*/
markrad 3:c0556ff7b8e3 148 if (handle->setOption(destinationHandle, option->name, option->storage) != 0)
markrad 3:c0556ff7b8e3 149 {
markrad 3:c0556ff7b8e3 150 LogError("failure while trying to _SetOption");
markrad 3:c0556ff7b8e3 151 break;
markrad 3:c0556ff7b8e3 152 }
markrad 3:c0556ff7b8e3 153 }
markrad 3:c0556ff7b8e3 154
markrad 3:c0556ff7b8e3 155 if (i == nOptions)
markrad 3:c0556ff7b8e3 156 {
markrad 3:c0556ff7b8e3 157 /*Codes_SRS_OPTIONHANDLER_02_014: [ Otherwise, OptionHandler_FeedOptions shall fail and return OPTIONHANDLER_ERROR. ]*/
markrad 3:c0556ff7b8e3 158 result = OPTIONHANDLER_OK;
markrad 3:c0556ff7b8e3 159 }
markrad 3:c0556ff7b8e3 160 else
markrad 3:c0556ff7b8e3 161 {
markrad 3:c0556ff7b8e3 162 /*Codes_SRS_OPTIONHANDLER_02_013: [ If all the operations succeed then OptionHandler_FeedOptions shall succeed and return OPTIONHANDLER_OK. ]*/
markrad 3:c0556ff7b8e3 163 result = OPTIONHANDLER_ERROR;
markrad 3:c0556ff7b8e3 164 }
markrad 3:c0556ff7b8e3 165 }
markrad 3:c0556ff7b8e3 166 return result;
markrad 3:c0556ff7b8e3 167 }
markrad 3:c0556ff7b8e3 168
markrad 3:c0556ff7b8e3 169 void OptionHandler_Destroy(OPTIONHANDLER_HANDLE handle)
markrad 3:c0556ff7b8e3 170 {
markrad 3:c0556ff7b8e3 171 /*Codes_SRS_OPTIONHANDLER_02_015: [ OptionHandler_Destroy shall do nothing if parameter handle is NULL. ]*/
markrad 3:c0556ff7b8e3 172 if (handle == NULL)
markrad 3:c0556ff7b8e3 173 {
markrad 3:c0556ff7b8e3 174 LogError("invalid argument OPTIONHANDLER_HANDLE handle=%p", handle);
markrad 3:c0556ff7b8e3 175 }
markrad 3:c0556ff7b8e3 176 else
markrad 3:c0556ff7b8e3 177 {
markrad 3:c0556ff7b8e3 178 /*Codes_SRS_OPTIONHANDLER_02_016: [ Otherwise, OptionHandler_Destroy shall free all used resources. ]*/
markrad 3:c0556ff7b8e3 179 size_t nOptions = VECTOR_size(handle->storage), i;
markrad 3:c0556ff7b8e3 180 for (i = 0;i < nOptions;i++)
markrad 3:c0556ff7b8e3 181 {
markrad 3:c0556ff7b8e3 182 OPTION* option = (OPTION*)VECTOR_element(handle->storage, i);
markrad 3:c0556ff7b8e3 183 handle->destroyOption(option->name, option->storage);
markrad 3:c0556ff7b8e3 184 free((void*)option->name);
markrad 3:c0556ff7b8e3 185 }
markrad 3:c0556ff7b8e3 186
markrad 3:c0556ff7b8e3 187 VECTOR_destroy(handle->storage);
markrad 3:c0556ff7b8e3 188 free(handle);
markrad 3:c0556ff7b8e3 189 }
markrad 3:c0556ff7b8e3 190 }