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 27 19:59:21 2016 +0000
Revision:
24:f6aa0e64c5e1
Parent:
23:381b6c77a6a0
Child:
25:acc34bcf563e
make up/down repeat

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