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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SendCommand.cpp Source File

SendCommand.cpp

00001 /**
00002  * ACKme WiConnect Host Library is licensed under the BSD licence: 
00003  * 
00004  * Copyright (c)2014 ACKme Networks.
00005  * All rights reserved. 
00006  * 
00007  * Redistribution and use in source and binary forms, with or without modification, 
00008  * are permitted provided that the following conditions are met: 
00009  * 
00010  * 1. Redistributions of source code must retain the above copyright notice, 
00011  * this list of conditions and the following disclaimer. 
00012  * 2. Redistributions in binary form must reproduce the above copyright notice, 
00013  * this list of conditions and the following disclaimer in the documentation 
00014  * and/or other materials provided with the distribution. 
00015  * 3. The name of the author may not be used to endorse or promote products 
00016  * derived from this software without specific prior written permission. 
00017  * 
00018  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED 
00019  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
00020  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
00021  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00022  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
00023  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
00026  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
00027  * OF SUCH DAMAGE.
00028  */
00029 
00030 #include "internal/CommandCommon.h"
00031 
00032 
00033 /*************************************************************************************************/
00034 WiconnectResult Wiconnect::sendCommand(const Callback &completeCallback, char *responseBuffer,
00035                                        int responseBufferLen, TimerTimeout timeoutMs, const ReaderFunc &reader, void *user,
00036                                        const char *cmd, va_list vaList)
00037 {
00038     // preprocessor assertion
00039     ct_assert(sizeof(commandContext) >=sizeof(CommandContext));
00040     CHECK_INITIALIZED();
00041     CHECK_NULL_BUFFER(responseBuffer);
00042     if(commandExecuting)
00043     {
00044         return checkCurrentCommand();
00045     }
00046 
00047     CommandContext *context = (CommandContext*)commandContext;
00048     CommandHeader *header = (CommandHeader*)commandHeaderBuffer;
00049 
00050     int len = vsnprintf(commandFormatBuffer, sizeof(commandFormatBuffer)-3, cmd, vaList);
00051 
00052     if(len > (int)(sizeof(commandFormatBuffer)-3))
00053     {
00054         DEBUG_ERROR("Command overflowed: %d > %d", len, sizeof(commandFormatBuffer)-3);
00055         return WICONNECT_OVERFLOW;
00056     }
00057 
00058     commandFormatBuffer[len++] = '\r';
00059     commandFormatBuffer[len++] = '\n';
00060     commandFormatBuffer[len] = 0;
00061 
00062     RESET_CMD_HEADER(header);
00063 
00064     memset(context, 0, sizeof(CommandContext));
00065     context->responseBuffer = responseBuffer;
00066     context->responseBufferPtr = context->responseBuffer;
00067     context->responseBufferLen = responseBufferLen;
00068     context->commandLen = len;
00069     context->commandPtr = commandFormatBuffer;
00070     context->reader = reader;
00071     context->user = user;
00072     context->timeoutMs = timeoutMs;
00073     context->callback = completeCallback;
00074     context->nonBlocking = nonBlocking;
00075 
00076     DEBUG_CMD_SEND(commandFormatBuffer);
00077 
00078     commandExecuting = true;
00079     flush(0);
00080     timeoutTimer.reset();
00081 
00082     return checkCurrentCommand();
00083 }
00084 
00085 
00086 /*************************************************************************************************/
00087 WiconnectResult Wiconnect::sendCommand(char *responseBuffer, int responseBufferLen, TimerTimeout timeoutMs,
00088                                        const ReaderFunc &reader, void *user, const char *cmd, va_list vaList)
00089 {
00090     return sendCommand(Callback(), responseBuffer, responseBufferLen, timeoutMs, reader, user, cmd, vaList);
00091 }
00092 
00093 /*************************************************************************************************/
00094 WiconnectResult Wiconnect::sendCommand(char *responseBuffer, int responseBufferLen,  TimerTimeout timeoutMs,
00095                                        const ReaderFunc &reader, void *user, const char *cmd, ...)
00096 {
00097     WiconnectResult result;
00098     va_list args;
00099     va_start(args, cmd);
00100     result = sendCommand(Callback(), responseBuffer, responseBufferLen, timeoutMs, reader, user, cmd, args);
00101     va_end(args);
00102     return result;
00103 }
00104 
00105 /*************************************************************************************************/
00106 WiconnectResult Wiconnect::sendCommand(TimerTimeout timeoutMs, const ReaderFunc &reader, void *user, const char *cmd, ...)
00107 {
00108     WiconnectResult result;
00109     va_list args;
00110     va_start(args, cmd);
00111     result = sendCommand(Callback(), internalBuffer, internalBufferSize, timeoutMs, reader, user, cmd, args);
00112     va_end(args);
00113     return result;
00114 }
00115 
00116 /*************************************************************************************************/
00117 WiconnectResult Wiconnect::sendCommand(const ReaderFunc &reader, void *user, const char *cmd, ...)
00118 {
00119     WiconnectResult result;
00120     va_list args;
00121     va_start(args, cmd);
00122     result = sendCommand(Callback(), internalBuffer, internalBufferSize, defaultTimeoutMs, reader, user, cmd, args);
00123     va_end(args);
00124     return result;
00125 }
00126 
00127 /*************************************************************************************************/
00128 WiconnectResult Wiconnect::sendCommand(char *responseBuffer, int responseBufferLen,  TimerTimeout timeoutMs, const char *cmd, ...)
00129 {
00130     WiconnectResult result;
00131     va_list args;
00132     va_start(args, cmd);
00133     result = sendCommand(Callback(), responseBuffer, responseBufferLen, timeoutMs, ReaderFunc(), NULL, cmd, args);
00134     va_end(args);
00135     return result;
00136 }
00137 
00138 /*************************************************************************************************/
00139 WiconnectResult Wiconnect::sendCommand(const Callback &completeCallback, char *responseBuffer, int responseBufferLen, const char *cmd, ...)
00140 {
00141     WiconnectResult result;
00142     va_list args;
00143     va_start(args, cmd);
00144     result = sendCommand(completeCallback, responseBuffer, responseBufferLen, defaultTimeoutMs, ReaderFunc(), NULL, cmd, args);
00145     va_end(args);
00146     return result;
00147 }
00148 
00149 /*************************************************************************************************/
00150 WiconnectResult Wiconnect::sendCommand(char *responseBuffer, int responseBufferLen, const char *cmd, ...)
00151 {
00152     WiconnectResult result;
00153     va_list args;
00154     va_start(args, cmd);
00155     result = sendCommand(Callback(), responseBuffer, responseBufferLen, defaultTimeoutMs, ReaderFunc(), NULL, cmd, args);
00156     va_end(args);
00157     return result;
00158 }
00159 
00160 /*************************************************************************************************/
00161 WiconnectResult Wiconnect::sendCommand(const Callback &completeCallback, const char *cmd, ...)
00162 {
00163     WiconnectResult result;
00164     va_list args;
00165     va_start(args, cmd);
00166     result = sendCommand(completeCallback, internalBuffer, internalBufferSize, defaultTimeoutMs, ReaderFunc(), NULL, cmd, args);
00167     va_end(args);
00168     return result;
00169 }
00170 
00171 /*************************************************************************************************/
00172 WiconnectResult Wiconnect::sendCommand(const char *cmd, ...)
00173 {
00174     WiconnectResult result;
00175     va_list args;
00176     va_start(args, cmd);
00177     result = sendCommand(Callback(), internalBuffer, internalBufferSize, defaultTimeoutMs, ReaderFunc(), NULL, cmd, args);
00178     va_end(args);
00179     return result;
00180 }
00181 
00182 /*************************************************************************************************/
00183 WiconnectResult Wiconnect::sendCommand(const Callback &completeCallback, TimerTimeout timeoutMs, const char *cmd, ...)
00184 {
00185     WiconnectResult result;
00186     va_list args;
00187     va_start(args, cmd);
00188     result = sendCommand(completeCallback, internalBuffer, internalBufferSize, timeoutMs, ReaderFunc(), NULL, cmd, args);
00189     va_end(args);
00190     return result;
00191 }
00192 
00193 /*************************************************************************************************/
00194 WiconnectResult Wiconnect::sendCommand(TimerTimeout timeoutMs, const char *cmd, ...)
00195 {
00196     WiconnectResult result;
00197     va_list args;
00198     va_start(args, cmd);
00199     result = sendCommand(Callback(), internalBuffer, internalBufferSize, timeoutMs, ReaderFunc(), NULL, cmd, args);
00200     va_end(args);
00201     return result;
00202 }
00203 
00204 /*************************************************************************************************/
00205 WiconnectResult Wiconnect::sendCommand(const char *cmd, va_list vaList)
00206 {
00207     return sendCommand(Callback(), internalBuffer, internalBufferSize, defaultTimeoutMs, ReaderFunc(), NULL, cmd, vaList);
00208 }
00209