WIP. send a large constant string twice a second, in order to test out the transport with something indicative of our required load.

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

Fork of FXOS8700CQ_To_Azure_IoT by Mark Radbourne

Committer:
julianhigginson
Date:
Thu Jan 05 23:40:24 2017 +0000
Revision:
7:0d1a0fe537dc
Parent:
3:c0556ff7b8e3
modified dummy message for minimal data transport

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