Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

Committer:
dan_ackme
Date:
Wed Aug 13 03:14:30 2014 -0700
Revision:
13:2b51f5267c92
Parent:
11:ea484e1b7fc4
Child:
16:7f1d6d359787
doc updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:ea85c4bb5e1f 1 /*
dan_ackme 0:ea85c4bb5e1f 2 * Copyright 2014, ACKme Networks
dan_ackme 0:ea85c4bb5e1f 3 * All Rights Reserved.
dan_ackme 0:ea85c4bb5e1f 4 *
dan_ackme 0:ea85c4bb5e1f 5 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
dan_ackme 0:ea85c4bb5e1f 6 * the contents of this file may not be disclosed to third parties, copied
dan_ackme 0:ea85c4bb5e1f 7 * or duplicated in any form, in whole or in part, without the prior
dan_ackme 0:ea85c4bb5e1f 8 * written permission of ACKme Networks.
dan_ackme 0:ea85c4bb5e1f 9 */
dan_ackme 0:ea85c4bb5e1f 10
dan_ackme 0:ea85c4bb5e1f 11 #include <stdio.h>
dan_ackme 0:ea85c4bb5e1f 12 #include <stdarg.h>
dan_ackme 0:ea85c4bb5e1f 13 #include <string.h>
dan_ackme 0:ea85c4bb5e1f 14
dan_ackme 0:ea85c4bb5e1f 15 #include "WiconnectInterface.h"
dan_ackme 0:ea85c4bb5e1f 16 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 17
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21
dan_ackme 0:ea85c4bb5e1f 22 using namespace wiconnect;
dan_ackme 0:ea85c4bb5e1f 23
dan_ackme 0:ea85c4bb5e1f 24
dan_ackme 0:ea85c4bb5e1f 25
dan_ackme 0:ea85c4bb5e1f 26
dan_ackme 0:ea85c4bb5e1f 27
dan_ackme 0:ea85c4bb5e1f 28 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 29 #define MALLOC_ARGS , void* (*mallocPtr)(size_t), void (*freePtr)(void*)
dan_ackme 5:8d91a87ebba2 30 #define MALLOC_CONSTRUCTORS _malloc(mallocPtr), _free(freePtr),
dan_ackme 0:ea85c4bb5e1f 31 #else
dan_ackme 0:ea85c4bb5e1f 32 #define MALLOC_ARGS
dan_ackme 0:ea85c4bb5e1f 33 #define MALLOC_CONSTRUCTORS
dan_ackme 0:ea85c4bb5e1f 34 #endif
dan_ackme 0:ea85c4bb5e1f 35
dan_ackme 0:ea85c4bb5e1f 36
dan_ackme 0:ea85c4bb5e1f 37 static Wiconnect* instance = NULL;
dan_ackme 0:ea85c4bb5e1f 38
dan_ackme 0:ea85c4bb5e1f 39
dan_ackme 0:ea85c4bb5e1f 40
dan_ackme 0:ea85c4bb5e1f 41
dan_ackme 0:ea85c4bb5e1f 42 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 43 void Wiconnect::prepare(void *internalBuffer_, int internalBufferSize_, bool nonBlocking_)
dan_ackme 0:ea85c4bb5e1f 44 {
dan_ackme 0:ea85c4bb5e1f 45 instance = this;
dan_ackme 0:ea85c4bb5e1f 46 internalBufferAlloc = false;
dan_ackme 0:ea85c4bb5e1f 47 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 48 if(internalBufferSize_ > 0 && internalBuffer_ == NULL)
dan_ackme 0:ea85c4bb5e1f 49 {
dan_ackme 6:8a87a59d0d21 50 wiconnect_assert(this, "Wiconnect(), malloc not defined", _malloc != NULL);
dan_ackme 0:ea85c4bb5e1f 51 internalBuffer = (char*)_malloc(internalBufferSize_);
dan_ackme 0:ea85c4bb5e1f 52 internalBufferAlloc = true;
dan_ackme 0:ea85c4bb5e1f 53 }
dan_ackme 0:ea85c4bb5e1f 54 else
dan_ackme 0:ea85c4bb5e1f 55 #endif
dan_ackme 0:ea85c4bb5e1f 56 {
dan_ackme 0:ea85c4bb5e1f 57 internalBuffer = (char*)internalBuffer_;
dan_ackme 0:ea85c4bb5e1f 58 }
dan_ackme 0:ea85c4bb5e1f 59
dan_ackme 0:ea85c4bb5e1f 60 internalProcessingState = 0;
dan_ackme 0:ea85c4bb5e1f 61 currentCommandId = NULL;
dan_ackme 0:ea85c4bb5e1f 62 internalBufferSize = internalBufferSize_;
dan_ackme 0:ea85c4bb5e1f 63 nonBlocking = nonBlocking_;
dan_ackme 0:ea85c4bb5e1f 64 commandExecuting = false;
dan_ackme 0:ea85c4bb5e1f 65 initialized = false;
dan_ackme 0:ea85c4bb5e1f 66 pinToGpioMapper = NULL;
dan_ackme 0:ea85c4bb5e1f 67 defaultTimeoutMs = WICONNECT_DEFAULT_TIMEOUT;
dan_ackme 0:ea85c4bb5e1f 68
dan_ackme 0:ea85c4bb5e1f 69 memset(commandContext, 0, sizeof(commandContext));
dan_ackme 0:ea85c4bb5e1f 70
dan_ackme 0:ea85c4bb5e1f 71 #ifdef WICONNECT_ASYNC_TIMER_ENABLED
dan_ackme 0:ea85c4bb5e1f 72 commandProcessingPeriod = WICONNECT_DEFAULT_COMMAND_PROCESSING_PERIOD;
dan_ackme 0:ea85c4bb5e1f 73 currentQueuedCommand = NULL;
dan_ackme 0:ea85c4bb5e1f 74 #endif
dan_ackme 0:ea85c4bb5e1f 75 }
dan_ackme 0:ea85c4bb5e1f 76
dan_ackme 0:ea85c4bb5e1f 77
dan_ackme 0:ea85c4bb5e1f 78 /*************************************************************************************************/
dan_ackme 13:2b51f5267c92 79 Wiconnect::Wiconnect(const SerialConfig &serialConfig, int internalBufferSize, void *internalBuffer, Pin reset, Pin wake, bool nonBlocking MALLOC_ARGS) :
dan_ackme 5:8d91a87ebba2 80 NetworkInterface(this), SocketInterface(this), FileInterface(this), MALLOC_CONSTRUCTORS serial(serialConfig, this), resetGpio(reset), wakeGpio(wake)
dan_ackme 0:ea85c4bb5e1f 81 {
dan_ackme 6:8a87a59d0d21 82 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 6:8a87a59d0d21 83 wiconnect_assert(this, "Wiconnect(), bad malloc/free", (mallocPtr == NULL && freePtr == NULL) || (mallocPtr != NULL && freePtr != NULL));
dan_ackme 6:8a87a59d0d21 84 #endif
dan_ackme 0:ea85c4bb5e1f 85 prepare(internalBuffer, internalBufferSize, nonBlocking);
dan_ackme 0:ea85c4bb5e1f 86 }
dan_ackme 0:ea85c4bb5e1f 87
dan_ackme 0:ea85c4bb5e1f 88 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 89 Wiconnect::Wiconnect(const SerialConfig &serialConfig, Pin reset, Pin wake, bool nonBlocking MALLOC_ARGS) :
dan_ackme 5:8d91a87ebba2 90 NetworkInterface(this), SocketInterface(this), FileInterface(this), MALLOC_CONSTRUCTORS serial(serialConfig, this), resetGpio(reset), wakeGpio(wake)
dan_ackme 0:ea85c4bb5e1f 91 {
dan_ackme 6:8a87a59d0d21 92 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 6:8a87a59d0d21 93 wiconnect_assert(this, "Wiconnect(), bad malloc/free", (mallocPtr == NULL && freePtr == NULL) || (mallocPtr != NULL && freePtr != NULL));
dan_ackme 6:8a87a59d0d21 94 #endif
dan_ackme 0:ea85c4bb5e1f 95 prepare(NULL, 0, nonBlocking);
dan_ackme 0:ea85c4bb5e1f 96 }
dan_ackme 0:ea85c4bb5e1f 97
dan_ackme 0:ea85c4bb5e1f 98 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 99 Wiconnect::~Wiconnect()
dan_ackme 0:ea85c4bb5e1f 100 {
dan_ackme 0:ea85c4bb5e1f 101 #ifdef WICONNECT_ENABLE_MALLOC
dan_ackme 0:ea85c4bb5e1f 102 if(internalBufferAlloc)
dan_ackme 0:ea85c4bb5e1f 103 {
dan_ackme 0:ea85c4bb5e1f 104 _free(internalBuffer);
dan_ackme 0:ea85c4bb5e1f 105 }
dan_ackme 0:ea85c4bb5e1f 106 #endif
dan_ackme 0:ea85c4bb5e1f 107 }
dan_ackme 0:ea85c4bb5e1f 108
dan_ackme 0:ea85c4bb5e1f 109 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 110 WiconnectResult Wiconnect::init(bool bringNetworkUp)
dan_ackme 0:ea85c4bb5e1f 111 {
dan_ackme 0:ea85c4bb5e1f 112 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 113 int retries;
dan_ackme 0:ea85c4bb5e1f 114 bool savedNonBlocking = nonBlocking;
dan_ackme 0:ea85c4bb5e1f 115
dan_ackme 0:ea85c4bb5e1f 116 if(WICONNECT_FAILED(result, reset()))
dan_ackme 0:ea85c4bb5e1f 117 {
dan_ackme 0:ea85c4bb5e1f 118 return result;
dan_ackme 0:ea85c4bb5e1f 119 }
dan_ackme 0:ea85c4bb5e1f 120
dan_ackme 0:ea85c4bb5e1f 121 delayMs(1000);
dan_ackme 0:ea85c4bb5e1f 122
dan_ackme 0:ea85c4bb5e1f 123 initialized = true;
dan_ackme 0:ea85c4bb5e1f 124 nonBlocking = false;
dan_ackme 0:ea85c4bb5e1f 125
dan_ackme 0:ea85c4bb5e1f 126 for(retries = 3; retries > 0; --retries)
dan_ackme 0:ea85c4bb5e1f 127 {
dan_ackme 0:ea85c4bb5e1f 128 result = sendCommand(CMD_SET_SYSTEM_COMMAND_MODE, "machine");
dan_ackme 0:ea85c4bb5e1f 129 if(result != WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 130 {
dan_ackme 0:ea85c4bb5e1f 131 delayMs(1000);
dan_ackme 0:ea85c4bb5e1f 132 }
dan_ackme 0:ea85c4bb5e1f 133 else
dan_ackme 0:ea85c4bb5e1f 134 {
dan_ackme 0:ea85c4bb5e1f 135 break;
dan_ackme 0:ea85c4bb5e1f 136 }
dan_ackme 0:ea85c4bb5e1f 137 }
dan_ackme 0:ea85c4bb5e1f 138
dan_ackme 0:ea85c4bb5e1f 139 if(result == WICONNECT_SUCCESS && bringNetworkUp)
dan_ackme 0:ea85c4bb5e1f 140 {
dan_ackme 0:ea85c4bb5e1f 141 sendCommand(15000, "ping -g");
dan_ackme 0:ea85c4bb5e1f 142 }
dan_ackme 0:ea85c4bb5e1f 143
dan_ackme 0:ea85c4bb5e1f 144 nonBlocking = savedNonBlocking;
dan_ackme 0:ea85c4bb5e1f 145 if(result != WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 146 {
dan_ackme 0:ea85c4bb5e1f 147 initialized = false;
dan_ackme 0:ea85c4bb5e1f 148 }
dan_ackme 0:ea85c4bb5e1f 149
dan_ackme 0:ea85c4bb5e1f 150
dan_ackme 0:ea85c4bb5e1f 151 return result;
dan_ackme 0:ea85c4bb5e1f 152 }
dan_ackme 0:ea85c4bb5e1f 153
dan_ackme 0:ea85c4bb5e1f 154 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 155 void Wiconnect::deinit(void)
dan_ackme 0:ea85c4bb5e1f 156 {
dan_ackme 0:ea85c4bb5e1f 157 initialized = false;
dan_ackme 0:ea85c4bb5e1f 158 }
dan_ackme 0:ea85c4bb5e1f 159
dan_ackme 0:ea85c4bb5e1f 160 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 161 Wiconnect* Wiconnect::getInstance()
dan_ackme 0:ea85c4bb5e1f 162 {
dan_ackme 0:ea85c4bb5e1f 163 return instance;
dan_ackme 0:ea85c4bb5e1f 164 }
dan_ackme 0:ea85c4bb5e1f 165
dan_ackme 0:ea85c4bb5e1f 166 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 167 bool Wiconnect::isInitialized()
dan_ackme 0:ea85c4bb5e1f 168 {
dan_ackme 0:ea85c4bb5e1f 169 return initialized;
dan_ackme 0:ea85c4bb5e1f 170 }
dan_ackme 0:ea85c4bb5e1f 171
dan_ackme 0:ea85c4bb5e1f 172 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 173 WiconnectResult Wiconnect::reset()
dan_ackme 0:ea85c4bb5e1f 174 {
dan_ackme 0:ea85c4bb5e1f 175 resetGpio = 0;
dan_ackme 0:ea85c4bb5e1f 176 delayMs(10);
dan_ackme 0:ea85c4bb5e1f 177 resetGpio = 1;
dan_ackme 0:ea85c4bb5e1f 178 delayMs(1000);
dan_ackme 0:ea85c4bb5e1f 179 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 180 }
dan_ackme 0:ea85c4bb5e1f 181
dan_ackme 0:ea85c4bb5e1f 182 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 183 WiconnectResult Wiconnect::wakeup()
dan_ackme 0:ea85c4bb5e1f 184 {
dan_ackme 0:ea85c4bb5e1f 185 wakeGpio = 1;
dan_ackme 0:ea85c4bb5e1f 186 delayMs(1);
dan_ackme 0:ea85c4bb5e1f 187 wakeGpio = 0;
dan_ackme 0:ea85c4bb5e1f 188 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 189 }
dan_ackme 0:ea85c4bb5e1f 190
dan_ackme 0:ea85c4bb5e1f 191 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 192 void Wiconnect::flush(int delayMs)
dan_ackme 0:ea85c4bb5e1f 193 {
dan_ackme 0:ea85c4bb5e1f 194 if(delayMs != 0)
dan_ackme 0:ea85c4bb5e1f 195 {
dan_ackme 0:ea85c4bb5e1f 196 serial.write("\r\n\r\n", 4, 0);
dan_ackme 0:ea85c4bb5e1f 197 }
dan_ackme 0:ea85c4bb5e1f 198 delayMs(delayMs);
dan_ackme 0:ea85c4bb5e1f 199 serial.flush();
dan_ackme 0:ea85c4bb5e1f 200 }
dan_ackme 0:ea85c4bb5e1f 201
dan_ackme 0:ea85c4bb5e1f 202 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 203 void Wiconnect::setPinToGpioMapper(PinToGpioMapper mapper)
dan_ackme 0:ea85c4bb5e1f 204 {
dan_ackme 0:ea85c4bb5e1f 205 pinToGpioMapper = mapper;
dan_ackme 0:ea85c4bb5e1f 206 }
dan_ackme 0:ea85c4bb5e1f 207
dan_ackme 0:ea85c4bb5e1f 208 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 209 WiconnectResult Wiconnect::getVersion(char *versionBuffer, int versionBufferSize, const Callback &completeCallback)
dan_ackme 0:ea85c4bb5e1f 210 {
dan_ackme 0:ea85c4bb5e1f 211 if(versionBuffer != NULL && versionBufferSize == 0)
dan_ackme 0:ea85c4bb5e1f 212 {
dan_ackme 0:ea85c4bb5e1f 213 return WICONNECT_BAD_ARG;
dan_ackme 0:ea85c4bb5e1f 214 }
dan_ackme 0:ea85c4bb5e1f 215 return sendCommand(completeCallback, versionBuffer, versionBufferSize, CMD_GET_VERSION);
dan_ackme 0:ea85c4bb5e1f 216 }
dan_ackme 0:ea85c4bb5e1f 217
dan_ackme 0:ea85c4bb5e1f 218 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 219 const char* Wiconnect::getWiconnectResultStr(WiconnectResult wiconnectResult)
dan_ackme 0:ea85c4bb5e1f 220 {
dan_ackme 0:ea85c4bb5e1f 221 static const char* const wiconnectSuccessStrTable[] = {
dan_ackme 0:ea85c4bb5e1f 222 "Success", // WICONNECT_SUCCESS
dan_ackme 0:ea85c4bb5e1f 223 "Processing command", // WICONNECT_PROCESSING
dan_ackme 0:ea85c4bb5e1f 224 "Idle", // WICONNECT_IDLE
dan_ackme 0:ea85c4bb5e1f 225 "Aborted", // WICONNECT_ABORTED
dan_ackme 0:ea85c4bb5e1f 226 };
dan_ackme 0:ea85c4bb5e1f 227 static const char* const wiconnectErrorStrTable[] = {
dan_ackme 0:ea85c4bb5e1f 228 "",
dan_ackme 0:ea85c4bb5e1f 229 "General error", // WICONNECT_ERROR
dan_ackme 0:ea85c4bb5e1f 230 "WiConnect command code error", // WICONNECT_CMD_RESPONSE_ERROR
dan_ackme 0:ea85c4bb5e1f 231 "Null buffer", // WICONNECT_NULL_BUFFER
dan_ackme 0:ea85c4bb5e1f 232 "Not initialized", // WICONNECT_NOT_INITIALIZED
dan_ackme 0:ea85c4bb5e1f 233 "Overflow", // WICONNECT_OVERFLOW
dan_ackme 0:ea85c4bb5e1f 234 "Timeout", // WICONNECT_TIMEOUT
dan_ackme 0:ea85c4bb5e1f 235 "Response handler null", // WICONNECT_RESPONSE_HANDLER_NULL
dan_ackme 0:ea85c4bb5e1f 236 "Response parse error", // WICONNECT_RESPONSE_PARSE_ERROR
dan_ackme 0:ea85c4bb5e1f 237 "Another command is executing", // WICONNECT_ANOTHER_CMD_EXECUTING
dan_ackme 0:ea85c4bb5e1f 238 "Bad argument(s)", // WICONNECT_BAD_ARG
dan_ackme 0:ea85c4bb5e1f 239 "Unsupported", // WICONNECT_UNSUPPORTED
dan_ackme 0:ea85c4bb5e1f 240 "Pin name to GPIO mapper null", // WICONNECT_PINNAME_TO_GPIO_MAPPER_NULL
dan_ackme 0:ea85c4bb5e1f 241 "Duplicate", // WICONNECT_DUPLICATE
dan_ackme 0:ea85c4bb5e1f 242 "Not found", // WICONNECT_NOT_FOUND
dan_ackme 0:ea85c4bb5e1f 243 "No mapping for pinname to GPIO", // WICONNECT_PINNAME_TO_GPIO_NO_MAPPING
dan_ackme 0:ea85c4bb5e1f 244 "Not connected", // WICONNECT_NOT_CONNECTED
dan_ackme 0:ea85c4bb5e1f 245 "Underflow", // WICONNECT_UNDERFLOW
dan_ackme 11:ea484e1b7fc4 246 "A monitor is not available", // WICONNECT_MONITOR_NOT_AVAILABLE
dan_ackme 11:ea484e1b7fc4 247 "Not opened for reading", // WICONNECT_NOT_OPENED_FOR_READING
dan_ackme 0:ea85c4bb5e1f 248 };
dan_ackme 0:ea85c4bb5e1f 249
dan_ackme 0:ea85c4bb5e1f 250 if((int)wiconnectResult >= (int)WICONNECT_SUCCESS)
dan_ackme 0:ea85c4bb5e1f 251 {
dan_ackme 0:ea85c4bb5e1f 252 return wiconnectSuccessStrTable[wiconnectResult];
dan_ackme 0:ea85c4bb5e1f 253 }
dan_ackme 0:ea85c4bb5e1f 254 else
dan_ackme 0:ea85c4bb5e1f 255 {
dan_ackme 0:ea85c4bb5e1f 256 wiconnectResult = (WiconnectResult)(-((int)wiconnectResult));
dan_ackme 0:ea85c4bb5e1f 257 return wiconnectErrorStrTable[wiconnectResult];
dan_ackme 0:ea85c4bb5e1f 258 }
dan_ackme 0:ea85c4bb5e1f 259 }
dan_ackme 0:ea85c4bb5e1f 260
dan_ackme 0:ea85c4bb5e1f 261
dan_ackme 0:ea85c4bb5e1f 262 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 263 void Wiconnect::setDebugLogger(LogFunc logFunc)
dan_ackme 0:ea85c4bb5e1f 264 {
dan_ackme 0:ea85c4bb5e1f 265 debugLogger = logFunc;
dan_ackme 0:ea85c4bb5e1f 266 }
dan_ackme 0:ea85c4bb5e1f 267
dan_ackme 0:ea85c4bb5e1f 268 /*************************************************************************************************/
dan_ackme 6:8a87a59d0d21 269 void Wiconnect::setAssertLogger(LogFunc assertLogFunc)
dan_ackme 6:8a87a59d0d21 270 {
dan_ackme 6:8a87a59d0d21 271 assertLogger = assertLogFunc;
dan_ackme 6:8a87a59d0d21 272 }
dan_ackme 6:8a87a59d0d21 273
dan_ackme 6:8a87a59d0d21 274 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 275 void Wiconnect::debugLog(const char *msg, ...)
dan_ackme 0:ea85c4bb5e1f 276 {
dan_ackme 0:ea85c4bb5e1f 277 if(!debugLogger.isValid())
dan_ackme 0:ea85c4bb5e1f 278 {
dan_ackme 0:ea85c4bb5e1f 279 return;
dan_ackme 0:ea85c4bb5e1f 280 }
dan_ackme 0:ea85c4bb5e1f 281
dan_ackme 0:ea85c4bb5e1f 282 char buffer[96];
dan_ackme 0:ea85c4bb5e1f 283 va_list args;
dan_ackme 0:ea85c4bb5e1f 284 va_start(args, msg);
dan_ackme 0:ea85c4bb5e1f 285 int len = vsnprintf(buffer, sizeof(buffer), msg, args);
dan_ackme 0:ea85c4bb5e1f 286 va_end(args);
dan_ackme 0:ea85c4bb5e1f 287
dan_ackme 0:ea85c4bb5e1f 288 if(len > (int)(sizeof(buffer)-6))
dan_ackme 0:ea85c4bb5e1f 289 {
dan_ackme 0:ea85c4bb5e1f 290 char *p = &buffer[sizeof(buffer)-6];
dan_ackme 0:ea85c4bb5e1f 291 *p++ = '.';
dan_ackme 0:ea85c4bb5e1f 292 *p++ = '.';
dan_ackme 0:ea85c4bb5e1f 293 *p++ = '.';
dan_ackme 0:ea85c4bb5e1f 294 *p++ = '\r';
dan_ackme 0:ea85c4bb5e1f 295 *p++ = '\n';
dan_ackme 0:ea85c4bb5e1f 296 *p = 0;
dan_ackme 0:ea85c4bb5e1f 297 }
dan_ackme 0:ea85c4bb5e1f 298 else
dan_ackme 0:ea85c4bb5e1f 299 {
dan_ackme 0:ea85c4bb5e1f 300 if(buffer[len-2] != '\r')
dan_ackme 0:ea85c4bb5e1f 301 {
dan_ackme 0:ea85c4bb5e1f 302 char *p = &buffer[len];
dan_ackme 0:ea85c4bb5e1f 303 *p++ = '\r';
dan_ackme 0:ea85c4bb5e1f 304 *p++ = '\n';
dan_ackme 0:ea85c4bb5e1f 305 *p = 0;
dan_ackme 0:ea85c4bb5e1f 306 }
dan_ackme 0:ea85c4bb5e1f 307 }
dan_ackme 0:ea85c4bb5e1f 308 debugLogger.call(buffer);
dan_ackme 0:ea85c4bb5e1f 309 }