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:
Mon Aug 11 03:29:30 2014 -0700
Revision:
1:6ec9998427ad
Parent:
0:ea85c4bb5e1f
Child:
5:8d91a87ebba2
fixed compiler warnings

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