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:
Wed Jan 06 22:25:51 2016 +0000
Revision:
11:3a2e6eb9fbb8
Parent:
10:9b21566a5ddb
Child:
13:ffeff9b5e513
error reset. Better sequences;

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