Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 58:f50b97b08851 1 // Copyright (c) Microsoft. All rights reserved.
markrad 58:f50b97b08851 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 58:f50b97b08851 3
markrad 58:f50b97b08851 4 #include <stdlib.h>
markrad 58:f50b97b08851 5 #ifdef _CRTDBG_MAP_ALLOC
markrad 58:f50b97b08851 6 #include <crtdbg.h>
markrad 58:f50b97b08851 7 #endif
markrad 58:f50b97b08851 8
markrad 58:f50b97b08851 9 #include "azure_c_shared_utility/threadapi.h"
markrad 58:f50b97b08851 10 #include "azure_c_shared_utility/xlogging.h"
markrad 58:f50b97b08851 11 #include "rtos.h"
markrad 58:f50b97b08851 12
markrad 58:f50b97b08851 13 DEFINE_ENUM_STRINGS(THREADAPI_RESULT, THREADAPI_RESULT_VALUES);
markrad 58:f50b97b08851 14
markrad 58:f50b97b08851 15 #define MAX_THREADS 4
markrad 58:f50b97b08851 16 #define STACK_SIZE 0x4000
markrad 58:f50b97b08851 17
markrad 58:f50b97b08851 18 typedef struct _thread
markrad 58:f50b97b08851 19 {
markrad 58:f50b97b08851 20 Thread* thrd;
markrad 58:f50b97b08851 21 osThreadId id;
markrad 58:f50b97b08851 22 Queue<int, 1> result;
markrad 58:f50b97b08851 23 } mbedThread;
markrad 58:f50b97b08851 24 static mbedThread threads[MAX_THREADS] = { 0 };
markrad 58:f50b97b08851 25
markrad 58:f50b97b08851 26 typedef struct _create_param
markrad 58:f50b97b08851 27 {
markrad 58:f50b97b08851 28 THREAD_START_FUNC func;
markrad 58:f50b97b08851 29 const void* arg;
markrad 58:f50b97b08851 30 mbedThread *p_thread;
markrad 58:f50b97b08851 31 } create_param;
markrad 58:f50b97b08851 32
markrad 58:f50b97b08851 33 static void thread_wrapper(const void* createParamArg)
markrad 58:f50b97b08851 34 {
markrad 58:f50b97b08851 35 const create_param* p = (const create_param*)createParamArg;
markrad 58:f50b97b08851 36 p->p_thread->id = Thread::gettid();
markrad 58:f50b97b08851 37 (*(p->func))((void*)p->arg);
markrad 58:f50b97b08851 38 free((void*)p);
markrad 58:f50b97b08851 39 }
markrad 58:f50b97b08851 40
markrad 58:f50b97b08851 41 THREADAPI_RESULT ThreadAPI_Create(THREAD_HANDLE* threadHandle, THREAD_START_FUNC func, void* arg)
markrad 58:f50b97b08851 42 {
markrad 58:f50b97b08851 43 THREADAPI_RESULT result;
markrad 58:f50b97b08851 44 if ((threadHandle == NULL) ||
markrad 58:f50b97b08851 45 (func == NULL))
markrad 58:f50b97b08851 46 {
markrad 58:f50b97b08851 47 result = THREADAPI_INVALID_ARG;
markrad 58:f50b97b08851 48 LogError("(result = %s)", ENUM_TO_STRING(THREADAPI_RESULT, result));
markrad 58:f50b97b08851 49 }
markrad 58:f50b97b08851 50 else
markrad 58:f50b97b08851 51 {
markrad 58:f50b97b08851 52 size_t slot;
markrad 58:f50b97b08851 53 for (slot = 0; slot < MAX_THREADS; slot++)
markrad 58:f50b97b08851 54 {
markrad 58:f50b97b08851 55 if (threads[slot].id == NULL)
markrad 58:f50b97b08851 56 break;
markrad 58:f50b97b08851 57 }
markrad 58:f50b97b08851 58
markrad 58:f50b97b08851 59 if (slot < MAX_THREADS)
markrad 58:f50b97b08851 60 {
markrad 58:f50b97b08851 61 create_param* param = (create_param*)malloc(sizeof(create_param));
markrad 58:f50b97b08851 62 if (param != NULL)
markrad 58:f50b97b08851 63 {
markrad 58:f50b97b08851 64 param->func = func;
markrad 58:f50b97b08851 65 param->arg = arg;
markrad 58:f50b97b08851 66 param->p_thread = threads + slot;
markrad 58:f50b97b08851 67 threads[slot].thrd = new Thread(thread_wrapper, param, osPriorityNormal, STACK_SIZE);
markrad 58:f50b97b08851 68 *threadHandle = (THREAD_HANDLE)(threads + slot);
markrad 58:f50b97b08851 69 result = THREADAPI_OK;
markrad 58:f50b97b08851 70 }
markrad 58:f50b97b08851 71 else
markrad 58:f50b97b08851 72 {
markrad 58:f50b97b08851 73 result = THREADAPI_NO_MEMORY;
markrad 58:f50b97b08851 74 LogError("(result = %s)", ENUM_TO_STRING(THREADAPI_RESULT, result));
markrad 58:f50b97b08851 75 }
markrad 58:f50b97b08851 76 }
markrad 58:f50b97b08851 77 else
markrad 58:f50b97b08851 78 {
markrad 58:f50b97b08851 79 result = THREADAPI_NO_MEMORY;
markrad 58:f50b97b08851 80 LogError("(result = %s)", ENUM_TO_STRING(THREADAPI_RESULT, result));
markrad 58:f50b97b08851 81 }
markrad 58:f50b97b08851 82 }
markrad 58:f50b97b08851 83
markrad 58:f50b97b08851 84 return result;
markrad 58:f50b97b08851 85 }
markrad 58:f50b97b08851 86
markrad 58:f50b97b08851 87 THREADAPI_RESULT ThreadAPI_Join(THREAD_HANDLE thr, int *res)
markrad 58:f50b97b08851 88 {
markrad 58:f50b97b08851 89 THREADAPI_RESULT result = THREADAPI_OK;
markrad 58:f50b97b08851 90 mbedThread* p = (mbedThread*)thr;
markrad 58:f50b97b08851 91 if (p)
markrad 58:f50b97b08851 92 {
markrad 58:f50b97b08851 93 osEvent evt = p->result.get();
markrad 58:f50b97b08851 94 if (evt.status == osEventMessage) {
markrad 58:f50b97b08851 95 Thread* t = p->thrd;
markrad 58:f50b97b08851 96 if (res)
markrad 58:f50b97b08851 97 {
markrad 58:f50b97b08851 98 *res = (int)evt.value.p;
markrad 58:f50b97b08851 99 }
markrad 58:f50b97b08851 100 (void)t->terminate();
markrad 58:f50b97b08851 101 }
markrad 58:f50b97b08851 102 else
markrad 58:f50b97b08851 103 {
markrad 58:f50b97b08851 104 result = THREADAPI_ERROR;
markrad 58:f50b97b08851 105 LogError("(result = %s)", ENUM_TO_STRING(THREADAPI_RESULT, result));
markrad 58:f50b97b08851 106 }
markrad 58:f50b97b08851 107 }
markrad 58:f50b97b08851 108 else
markrad 58:f50b97b08851 109 {
markrad 58:f50b97b08851 110 result = THREADAPI_INVALID_ARG;
markrad 58:f50b97b08851 111 LogError("(result = %s)", ENUM_TO_STRING(THREADAPI_RESULT, result));
markrad 58:f50b97b08851 112 }
markrad 58:f50b97b08851 113 return result;
markrad 58:f50b97b08851 114 }
markrad 58:f50b97b08851 115
markrad 58:f50b97b08851 116 void ThreadAPI_Exit(int res)
markrad 58:f50b97b08851 117 {
markrad 58:f50b97b08851 118 mbedThread* p;
markrad 58:f50b97b08851 119 for (p = threads; p < &threads[MAX_THREADS]; p++)
markrad 58:f50b97b08851 120 {
markrad 58:f50b97b08851 121 if (p->id == Thread::gettid())
markrad 58:f50b97b08851 122 {
markrad 58:f50b97b08851 123 p->result.put((int*)res);
markrad 58:f50b97b08851 124 break;
markrad 58:f50b97b08851 125 }
markrad 58:f50b97b08851 126 }
markrad 58:f50b97b08851 127 }
markrad 58:f50b97b08851 128
markrad 58:f50b97b08851 129 void ThreadAPI_Sleep(unsigned int millisec)
markrad 58:f50b97b08851 130 {
markrad 58:f50b97b08851 131 //
markrad 58:f50b97b08851 132 // The timer on mbed seems to wrap around 65 seconds. Hmmm.
markrad 58:f50b97b08851 133 // So we will do our waits in increments of 30 seconds.
markrad 58:f50b97b08851 134 //
markrad 58:f50b97b08851 135 const int thirtySeconds = 30000;
markrad 58:f50b97b08851 136 int numberOfThirtySecondWaits = millisec / thirtySeconds;
markrad 58:f50b97b08851 137 int remainderOfThirtySeconds = millisec % thirtySeconds;
markrad 58:f50b97b08851 138 int i;
markrad 58:f50b97b08851 139 for (i = 1; i <= numberOfThirtySecondWaits; i++)
markrad 58:f50b97b08851 140 {
markrad 58:f50b97b08851 141 Thread::wait(thirtySeconds);
markrad 58:f50b97b08851 142 }
markrad 58:f50b97b08851 143 Thread::wait(remainderOfThirtySeconds);
markrad 58:f50b97b08851 144 }