demo project

Dependencies:   AX-12A Dynamixel mbed iothub_client EthernetInterface NTPClient ConfigFile SDFileSystem iothub_amqp_transport mbed-rtos proton-c-mbed wolfSSL

Committer:
henryrawas
Date:
Tue Jan 19 19:50:07 2016 +0000
Revision:
15:4bd10f531cdc
Parent:
14:570c8071f577
Child:
18:224289104fc0
read all values at once and cache. Other cleanups

Who changed what in which revision?

UserRevisionLine numberNew contents of line
henryrawas 4:36a4eceb1b7f 1 // Copyright (c) Microsoft. All rights reserved.
henryrawas 4:36a4eceb1b7f 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
henryrawas 4:36a4eceb1b7f 3
henryrawas 4:36a4eceb1b7f 4 #include "mbed.h"
henryrawas 4:36a4eceb1b7f 5 #include "rtos.h"
henryrawas 4:36a4eceb1b7f 6
henryrawas 10:9b21566a5ddb 7 #include "EthernetInterface.h"
henryrawas 10:9b21566a5ddb 8 #include "mbed/logging.h"
henryrawas 10:9b21566a5ddb 9 #include "mbed/mbedtime.h"
henryrawas 10:9b21566a5ddb 10 #include <NTPClient.h>
henryrawas 10:9b21566a5ddb 11
henryrawas 4:36a4eceb1b7f 12 #include "iothub_client.h"
henryrawas 4:36a4eceb1b7f 13 #include "iothub_message.h"
henryrawas 13:ffeff9b5e513 14 #include "threadapi.h"
henryrawas 4:36a4eceb1b7f 15 #include "crt_abstractions.h"
henryrawas 4:36a4eceb1b7f 16 #include "iothubtransportamqp.h"
henryrawas 4:36a4eceb1b7f 17 #include "MeasureBuf.h"
henryrawas 4:36a4eceb1b7f 18 #include "IothubRobotArm.h"
henryrawas 4:36a4eceb1b7f 19 #include "IothubSerial.h"
henryrawas 4:36a4eceb1b7f 20
henryrawas 4:36a4eceb1b7f 21 #ifdef MBED_BUILD_TIMESTAMP
henryrawas 4:36a4eceb1b7f 22 #include "certs.h"
henryrawas 4:36a4eceb1b7f 23 #endif // MBED_BUILD_TIMESTAMP
henryrawas 4:36a4eceb1b7f 24
henryrawas 5:36916b1c5a06 25 // TODO: move to config file
henryrawas 4:36a4eceb1b7f 26 static const char* connectionString = "HostName=HenryrIot.azure-devices.net;DeviceId=RobotArm;SharedAccessKey=FUTqsobGrV0ldHbnmOKluN6W90FG1G5z/jnhz+Gr53k=";
henryrawas 5:36916b1c5a06 27
henryrawas 10:9b21566a5ddb 28 extern void ShowLedColor(int col);
henryrawas 10:9b21566a5ddb 29
henryrawas 15:4bd10f531cdc 30 // method to initialize platform - Time of day
henryrawas 10:9b21566a5ddb 31 int setupRealTime(void)
henryrawas 10:9b21566a5ddb 32 {
henryrawas 10:9b21566a5ddb 33 int result;
henryrawas 10:9b21566a5ddb 34
henryrawas 10:9b21566a5ddb 35 (void)printf("setupRealTime begin\r\n");
henryrawas 10:9b21566a5ddb 36 if (EthernetInterface::connect())
henryrawas 10:9b21566a5ddb 37 {
henryrawas 10:9b21566a5ddb 38 (void)printf("Error initializing EthernetInterface.\r\n");
henryrawas 10:9b21566a5ddb 39 result = __LINE__;
henryrawas 10:9b21566a5ddb 40 }
henryrawas 10:9b21566a5ddb 41 else
henryrawas 10:9b21566a5ddb 42 {
henryrawas 10:9b21566a5ddb 43 (void)printf("setupRealTime NTP begin\r\n");
henryrawas 10:9b21566a5ddb 44 NTPClient ntp;
henryrawas 10:9b21566a5ddb 45 if (ntp.setTime("0.pool.ntp.org") != 0)
henryrawas 10:9b21566a5ddb 46 {
henryrawas 10:9b21566a5ddb 47 (void)printf("Failed setting time.\r\n");
henryrawas 10:9b21566a5ddb 48 result = __LINE__;
henryrawas 10:9b21566a5ddb 49 }
henryrawas 10:9b21566a5ddb 50 else
henryrawas 10:9b21566a5ddb 51 {
henryrawas 10:9b21566a5ddb 52 (void)printf("set time correctly!\r\n");
henryrawas 10:9b21566a5ddb 53 result = 0;
henryrawas 10:9b21566a5ddb 54 }
henryrawas 10:9b21566a5ddb 55 (void)printf("setupRealTime NTP end\r\n");
henryrawas 10:9b21566a5ddb 56 EthernetInterface::disconnect();
henryrawas 10:9b21566a5ddb 57 }
henryrawas 10:9b21566a5ddb 58 (void)printf("setupRealTime end\r\n");
henryrawas 10:9b21566a5ddb 59
henryrawas 10:9b21566a5ddb 60 return result;
henryrawas 10:9b21566a5ddb 61 }
henryrawas 10:9b21566a5ddb 62
henryrawas 15:4bd10f531cdc 63 // method to initialize platform - Ethernet
henryrawas 10:9b21566a5ddb 64 int InitEthernet()
henryrawas 10:9b21566a5ddb 65 {
henryrawas 10:9b21566a5ddb 66 (void)printf("Initializing ethernet..\r\n");
henryrawas 10:9b21566a5ddb 67
henryrawas 10:9b21566a5ddb 68 /* These are needed in order to initialize the time provider for Proton-C */
henryrawas 10:9b21566a5ddb 69 mbed_log_init();
henryrawas 10:9b21566a5ddb 70 mbedtime_init();
henryrawas 10:9b21566a5ddb 71
henryrawas 10:9b21566a5ddb 72 if (EthernetInterface::init())
henryrawas 10:9b21566a5ddb 73 {
henryrawas 10:9b21566a5ddb 74 (void)printf("Error initializing EthernetInterface.\r\n");
henryrawas 10:9b21566a5ddb 75 return -1;
henryrawas 10:9b21566a5ddb 76 }
henryrawas 10:9b21566a5ddb 77
henryrawas 10:9b21566a5ddb 78 if (setupRealTime() != 0)
henryrawas 10:9b21566a5ddb 79 {
henryrawas 10:9b21566a5ddb 80 (void)printf("Failed setting up real time clock\r\n");
henryrawas 10:9b21566a5ddb 81 return -1;
henryrawas 10:9b21566a5ddb 82 }
henryrawas 10:9b21566a5ddb 83
henryrawas 10:9b21566a5ddb 84 if (EthernetInterface::connect())
henryrawas 10:9b21566a5ddb 85 {
henryrawas 10:9b21566a5ddb 86 (void)printf("Error connecting EthernetInterface.\r\n");
henryrawas 10:9b21566a5ddb 87 return -1;
henryrawas 10:9b21566a5ddb 88 }
henryrawas 10:9b21566a5ddb 89
henryrawas 10:9b21566a5ddb 90 return 0;
henryrawas 10:9b21566a5ddb 91 }
henryrawas 10:9b21566a5ddb 92
henryrawas 15:4bd10f531cdc 93 // IoTHub SDK stuff
henryrawas 4:36a4eceb1b7f 94 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_CONFIRMATION_RESULT, IOTHUB_CLIENT_CONFIRMATION_RESULT_VALUES);
henryrawas 4:36a4eceb1b7f 95
henryrawas 4:36a4eceb1b7f 96 typedef struct EVENT_INSTANCE_TAG
henryrawas 4:36a4eceb1b7f 97 {
henryrawas 4:36a4eceb1b7f 98 IOTHUB_MESSAGE_HANDLE messageHandle;
henryrawas 4:36a4eceb1b7f 99 int messageTrackingId; // For tracking the messages within the user callback.
henryrawas 4:36a4eceb1b7f 100 } EVENT_INSTANCE;
henryrawas 4:36a4eceb1b7f 101
henryrawas 13:ffeff9b5e513 102
henryrawas 5:36916b1c5a06 103 // message buffers to use
henryrawas 13:ffeff9b5e513 104 #define MESSAGE_LEN 1024
henryrawas 5:36916b1c5a06 105 static char msgText[MESSAGE_LEN];
henryrawas 13:ffeff9b5e513 106
henryrawas 15:4bd10f531cdc 107 // a larger MESSAGE_COUNT results in being able to send as data is available
henryrawas 15:4bd10f531cdc 108 // but requires more heap space to hold buffers
henryrawas 13:ffeff9b5e513 109 #define MESSAGE_COUNT 2
henryrawas 13:ffeff9b5e513 110 EVENT_INSTANCE messages[MESSAGE_COUNT];
henryrawas 7:6723f6887d00 111
henryrawas 15:4bd10f531cdc 112 // sending thread timeout
henryrawas 13:ffeff9b5e513 113 #define SEND_POLL_MS 500
henryrawas 13:ffeff9b5e513 114
henryrawas 5:36916b1c5a06 115
henryrawas 5:36916b1c5a06 116 // context for send & receive
henryrawas 5:36916b1c5a06 117 static int receiveContext;
henryrawas 5:36916b1c5a06 118 static int callbackCounter;
henryrawas 5:36916b1c5a06 119 static int msgNumber;
henryrawas 5:36916b1c5a06 120
henryrawas 5:36916b1c5a06 121 static IOTHUB_CLIENT_HANDLE iotHubClientHandle;
henryrawas 5:36916b1c5a06 122
henryrawas 10:9b21566a5ddb 123 // used to detect send confirmation timeout
henryrawas 10:9b21566a5ddb 124 #define SEND_CONFIRM_TO 30000
henryrawas 10:9b21566a5ddb 125 RtosTimer* confirmTimer;
henryrawas 10:9b21566a5ddb 126
henryrawas 10:9b21566a5ddb 127
henryrawas 15:4bd10f531cdc 128 // pass received commands to device
henryrawas 14:570c8071f577 129 extern void ControlArmCommands(const char* cmd);
henryrawas 5:36916b1c5a06 130
henryrawas 15:4bd10f531cdc 131 // callback for incoming messages
henryrawas 4:36a4eceb1b7f 132 static IOTHUBMESSAGE_DISPOSITION_RESULT ReceiveMessageCallback(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
henryrawas 4:36a4eceb1b7f 133 {
henryrawas 4:36a4eceb1b7f 134 int* counter = (int*)userContextCallback;
henryrawas 4:36a4eceb1b7f 135 const char* buffer;
henryrawas 4:36a4eceb1b7f 136 size_t size;
henryrawas 5:36916b1c5a06 137 char cmdbuf[20];
henryrawas 5:36916b1c5a06 138
henryrawas 4:36a4eceb1b7f 139 if (IoTHubMessage_GetByteArray(message, (const unsigned char**)&buffer, &size) == IOTHUB_MESSAGE_OK)
henryrawas 4:36a4eceb1b7f 140 {
henryrawas 5:36916b1c5a06 141 int slen = size;
henryrawas 13:ffeff9b5e513 142
henryrawas 5:36916b1c5a06 143 if (size >= 20)
henryrawas 5:36916b1c5a06 144 slen = 19;
henryrawas 5:36916b1c5a06 145 strncpy(cmdbuf, buffer, slen);
henryrawas 5:36916b1c5a06 146 cmdbuf[slen] = 0;
henryrawas 13:ffeff9b5e513 147 (void)printf(cmdbuf);
henryrawas 13:ffeff9b5e513 148 (void)printf("\r\n");
henryrawas 14:570c8071f577 149 ControlArmCommands((const char*)cmdbuf);
henryrawas 4:36a4eceb1b7f 150 }
henryrawas 4:36a4eceb1b7f 151
henryrawas 4:36a4eceb1b7f 152 (*counter)++;
henryrawas 4:36a4eceb1b7f 153 return IOTHUBMESSAGE_ACCEPTED;
henryrawas 4:36a4eceb1b7f 154 }
henryrawas 4:36a4eceb1b7f 155
henryrawas 15:4bd10f531cdc 156 // callback for completion of sent messages
henryrawas 4:36a4eceb1b7f 157 static void SendConfirmationCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
henryrawas 4:36a4eceb1b7f 158 {
henryrawas 4:36a4eceb1b7f 159 EVENT_INSTANCE* eventInstance = (EVENT_INSTANCE*)userContextCallback;
henryrawas 11:3a2e6eb9fbb8 160 if (eventInstance == NULL)
henryrawas 11:3a2e6eb9fbb8 161 {
henryrawas 11:3a2e6eb9fbb8 162 printf("SendConfirmation with NULL context\r\n");
henryrawas 11:3a2e6eb9fbb8 163 return;
henryrawas 11:3a2e6eb9fbb8 164 }
henryrawas 13:ffeff9b5e513 165
henryrawas 13:ffeff9b5e513 166 (void)printf("Confirmation received\r\n");
henryrawas 7:6723f6887d00 167
henryrawas 10:9b21566a5ddb 168 confirmTimer->stop();
henryrawas 4:36a4eceb1b7f 169 callbackCounter++;
henryrawas 4:36a4eceb1b7f 170 IoTHubMessage_Destroy(eventInstance->messageHandle);
henryrawas 4:36a4eceb1b7f 171 }
henryrawas 4:36a4eceb1b7f 172
henryrawas 10:9b21566a5ddb 173 // communication timeout
henryrawas 10:9b21566a5ddb 174 void CommunicationTO(void const * tid)
henryrawas 10:9b21566a5ddb 175 {
henryrawas 10:9b21566a5ddb 176 (void)printf("*** Iothub thread communication Timeout\r\n");
henryrawas 10:9b21566a5ddb 177 ShowLedColor(2);
henryrawas 10:9b21566a5ddb 178 }
henryrawas 10:9b21566a5ddb 179
henryrawas 7:6723f6887d00 180
henryrawas 4:36a4eceb1b7f 181 // IoT Hub thread
henryrawas 13:ffeff9b5e513 182 static THREAD_HANDLE IotThread;
henryrawas 4:36a4eceb1b7f 183 static bool IotThreadClose;
henryrawas 4:36a4eceb1b7f 184
henryrawas 4:36a4eceb1b7f 185 // entry point for ITHub sending thread
henryrawas 13:ffeff9b5e513 186 int IothubThread(void *args)
henryrawas 4:36a4eceb1b7f 187 {
henryrawas 4:36a4eceb1b7f 188 (void)printf("Iothub thread start\r\n");
henryrawas 4:36a4eceb1b7f 189 IotThreadClose = false;
henryrawas 4:36a4eceb1b7f 190 IothubRobotArm iotRobot;
henryrawas 10:9b21566a5ddb 191
henryrawas 10:9b21566a5ddb 192 confirmTimer = new RtosTimer(CommunicationTO, osTimerOnce, (void *)osThreadGetId());
henryrawas 13:ffeff9b5e513 193
henryrawas 4:36a4eceb1b7f 194 iotRobot.Init();
henryrawas 13:ffeff9b5e513 195 // wait for connection establishment for SSL
henryrawas 13:ffeff9b5e513 196 ThreadAPI_Sleep(15000);
henryrawas 4:36a4eceb1b7f 197
henryrawas 4:36a4eceb1b7f 198 while (1)
henryrawas 4:36a4eceb1b7f 199 {
henryrawas 4:36a4eceb1b7f 200 if (IotThreadClose)
henryrawas 4:36a4eceb1b7f 201 {
henryrawas 13:ffeff9b5e513 202 (void)printf("Iothub thread close\r\n");
henryrawas 4:36a4eceb1b7f 203 iotRobot.Terminate();
henryrawas 4:36a4eceb1b7f 204 break;
henryrawas 4:36a4eceb1b7f 205 }
henryrawas 4:36a4eceb1b7f 206 else
henryrawas 4:36a4eceb1b7f 207 {
henryrawas 13:ffeff9b5e513 208 iotRobot.SendMessage();
henryrawas 4:36a4eceb1b7f 209 }
henryrawas 13:ffeff9b5e513 210 ThreadAPI_Sleep(SEND_POLL_MS);
henryrawas 4:36a4eceb1b7f 211 }
henryrawas 13:ffeff9b5e513 212
henryrawas 13:ffeff9b5e513 213 return 0;
henryrawas 4:36a4eceb1b7f 214 }
henryrawas 4:36a4eceb1b7f 215
henryrawas 4:36a4eceb1b7f 216
henryrawas 4:36a4eceb1b7f 217 bool StartIothubThread()
henryrawas 4:36a4eceb1b7f 218 {
henryrawas 13:ffeff9b5e513 219 InitEthernet();
henryrawas 13:ffeff9b5e513 220
henryrawas 13:ffeff9b5e513 221 ThreadAPI_Create(&IotThread, IothubThread, NULL);
henryrawas 13:ffeff9b5e513 222
henryrawas 13:ffeff9b5e513 223 //IotThread = new Thread(IothubThread, NULL, osPriorityLow);
henryrawas 4:36a4eceb1b7f 224 return true;
henryrawas 4:36a4eceb1b7f 225 }
henryrawas 4:36a4eceb1b7f 226
henryrawas 4:36a4eceb1b7f 227
henryrawas 4:36a4eceb1b7f 228 void EndIothubThread()
henryrawas 4:36a4eceb1b7f 229 {
henryrawas 4:36a4eceb1b7f 230 IotThreadClose = true;
henryrawas 4:36a4eceb1b7f 231 }
henryrawas 4:36a4eceb1b7f 232
henryrawas 10:9b21566a5ddb 233
henryrawas 4:36a4eceb1b7f 234 IothubRobotArm::IothubRobotArm()
henryrawas 4:36a4eceb1b7f 235 {
henryrawas 4:36a4eceb1b7f 236 iotHubClientHandle = NULL;
henryrawas 4:36a4eceb1b7f 237 }
henryrawas 4:36a4eceb1b7f 238
henryrawas 4:36a4eceb1b7f 239 bool IothubRobotArm::Init()
henryrawas 4:36a4eceb1b7f 240 {
henryrawas 5:36916b1c5a06 241 receiveContext = 0;
henryrawas 4:36a4eceb1b7f 242 callbackCounter = 0;
henryrawas 4:36a4eceb1b7f 243 msgNumber = 0;
henryrawas 4:36a4eceb1b7f 244
henryrawas 4:36a4eceb1b7f 245 (void)printf("Starting the IoTHub RobotArm sample AMQP...\r\n");
henryrawas 4:36a4eceb1b7f 246
henryrawas 4:36a4eceb1b7f 247 if ((iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, AMQP_Protocol)) == NULL)
henryrawas 4:36a4eceb1b7f 248 {
henryrawas 4:36a4eceb1b7f 249 (void)printf("ERROR: iotHubClientHandle is NULL!\r\n");
henryrawas 4:36a4eceb1b7f 250 return false;
henryrawas 4:36a4eceb1b7f 251 }
henryrawas 4:36a4eceb1b7f 252 else
henryrawas 4:36a4eceb1b7f 253 {
henryrawas 4:36a4eceb1b7f 254 #ifdef MBED_BUILD_TIMESTAMP
henryrawas 4:36a4eceb1b7f 255 (void)printf("INFO: IoTHubClient_SetOption\r\n");
henryrawas 4:36a4eceb1b7f 256 // For mbed add the certificate information
henryrawas 4:36a4eceb1b7f 257 if (IoTHubClient_SetOption(iotHubClientHandle, "TrustedCerts", certificates) != IOTHUB_CLIENT_OK)
henryrawas 4:36a4eceb1b7f 258 {
henryrawas 11:3a2e6eb9fbb8 259 printf("failure to set option \"TrustedCerts\"\r\n");
henryrawas 4:36a4eceb1b7f 260 return false;
henryrawas 4:36a4eceb1b7f 261 }
henryrawas 4:36a4eceb1b7f 262 #endif // MBED_BUILD_TIMESTAMP
henryrawas 4:36a4eceb1b7f 263
henryrawas 4:36a4eceb1b7f 264 (void)printf("INFO: IoTHubClient_SetMessageCallback\r\n");
henryrawas 4:36a4eceb1b7f 265 /* Setting Message call back, so we can receive Commands. */
henryrawas 4:36a4eceb1b7f 266 if (IoTHubClient_SetMessageCallback(iotHubClientHandle, ReceiveMessageCallback, &receiveContext) != IOTHUB_CLIENT_OK)
henryrawas 4:36a4eceb1b7f 267 {
henryrawas 4:36a4eceb1b7f 268 (void)printf("ERROR: IoTHubClient_SetMessageCallback..........FAILED!\r\n");
henryrawas 4:36a4eceb1b7f 269 return false;
henryrawas 4:36a4eceb1b7f 270 }
henryrawas 4:36a4eceb1b7f 271 else
henryrawas 4:36a4eceb1b7f 272 {
henryrawas 4:36a4eceb1b7f 273 (void)printf("IoTHubClient_SetMessageCallback...successful.\r\n");
henryrawas 4:36a4eceb1b7f 274 }
henryrawas 4:36a4eceb1b7f 275 }
henryrawas 4:36a4eceb1b7f 276 return true;
henryrawas 4:36a4eceb1b7f 277 }
henryrawas 4:36a4eceb1b7f 278
henryrawas 4:36a4eceb1b7f 279 void IothubRobotArm::Terminate()
henryrawas 4:36a4eceb1b7f 280 {
henryrawas 4:36a4eceb1b7f 281 if (iotHubClientHandle != NULL)
henryrawas 4:36a4eceb1b7f 282 {
henryrawas 4:36a4eceb1b7f 283 IoTHubClient_Destroy(iotHubClientHandle);
henryrawas 4:36a4eceb1b7f 284 iotHubClientHandle = NULL;
henryrawas 4:36a4eceb1b7f 285 }
henryrawas 4:36a4eceb1b7f 286 }
henryrawas 4:36a4eceb1b7f 287
henryrawas 4:36a4eceb1b7f 288
henryrawas 13:ffeff9b5e513 289 void IothubRobotArm::SendMessage(void)
henryrawas 4:36a4eceb1b7f 290 {
henryrawas 5:36916b1c5a06 291 // send until circular buf empty or no sending buffers avail
henryrawas 5:36916b1c5a06 292 // may drop message if confirmations are slow
henryrawas 5:36916b1c5a06 293 while (msgNumber - callbackCounter < MESSAGE_COUNT)
henryrawas 5:36916b1c5a06 294 {
henryrawas 5:36916b1c5a06 295 // get buffer from array
henryrawas 5:36916b1c5a06 296 int i = msgNumber % MESSAGE_COUNT;
henryrawas 4:36a4eceb1b7f 297
henryrawas 7:6723f6887d00 298 int msglen = 0;
henryrawas 13:ffeff9b5e513 299
henryrawas 7:6723f6887d00 300 // get alert if any, otherwise get measure data
henryrawas 7:6723f6887d00 301 msglen = msgSerialize.AlertBufToString(msgText, MESSAGE_LEN);
henryrawas 7:6723f6887d00 302 if (msglen == 0)
henryrawas 7:6723f6887d00 303 {
henryrawas 7:6723f6887d00 304 msglen = msgSerialize.MeasureBufToString(msgText, MESSAGE_LEN);
henryrawas 7:6723f6887d00 305 }
henryrawas 7:6723f6887d00 306
henryrawas 4:36a4eceb1b7f 307 if (msglen > 0)
henryrawas 4:36a4eceb1b7f 308 {
henryrawas 4:36a4eceb1b7f 309 if ((messages[i].messageHandle = IoTHubMessage_CreateFromByteArray((const unsigned char*)msgText, msglen)) == NULL)
henryrawas 4:36a4eceb1b7f 310 {
henryrawas 4:36a4eceb1b7f 311 (void)printf("ERROR: iotHubMessageHandle is NULL!\r\n");
henryrawas 4:36a4eceb1b7f 312 }
henryrawas 4:36a4eceb1b7f 313 else
henryrawas 4:36a4eceb1b7f 314 {
henryrawas 4:36a4eceb1b7f 315 messages[i].messageTrackingId = msgNumber;
henryrawas 4:36a4eceb1b7f 316
henryrawas 10:9b21566a5ddb 317 confirmTimer->stop();
henryrawas 4:36a4eceb1b7f 318 if (IoTHubClient_SendEventAsync(iotHubClientHandle, messages[i].messageHandle, SendConfirmationCallback, &messages[i]) != IOTHUB_CLIENT_OK)
henryrawas 4:36a4eceb1b7f 319 {
henryrawas 4:36a4eceb1b7f 320 (void)printf("ERROR: IoTHubClient_SendEventAsync..........FAILED!\r\n");
henryrawas 4:36a4eceb1b7f 321 }
henryrawas 4:36a4eceb1b7f 322 else
henryrawas 4:36a4eceb1b7f 323 {
henryrawas 10:9b21566a5ddb 324 confirmTimer->start(SEND_CONFIRM_TO);
henryrawas 13:ffeff9b5e513 325 (void)printf("Send async completed\r\n");
henryrawas 4:36a4eceb1b7f 326 }
henryrawas 4:36a4eceb1b7f 327 msgNumber++;
henryrawas 4:36a4eceb1b7f 328 }
henryrawas 4:36a4eceb1b7f 329 }
henryrawas 4:36a4eceb1b7f 330 else if (msglen == 0)
henryrawas 4:36a4eceb1b7f 331 {
henryrawas 13:ffeff9b5e513 332 break;
henryrawas 4:36a4eceb1b7f 333 }
henryrawas 4:36a4eceb1b7f 334 else if (msglen < 0)
henryrawas 4:36a4eceb1b7f 335 {
henryrawas 4:36a4eceb1b7f 336 (void)printf("ERROR: Serialized message too big for buffer\r\n");
henryrawas 4:36a4eceb1b7f 337 break;
henryrawas 4:36a4eceb1b7f 338 }
henryrawas 4:36a4eceb1b7f 339 } // while
henryrawas 4:36a4eceb1b7f 340
henryrawas 4:36a4eceb1b7f 341 }
henryrawas 7:6723f6887d00 342