From d1db9d98101f7a78b07d28194bf07bd141dc8cde Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 4 Jul 2013 17:14:33 +0200 Subject: Refactored YunClient and YunServer classes. Added YunClient.connect() methods. --- libraries/Bridge/YunClient.cpp | 167 +++++++++++++++++++++++++++++++++++++++++ libraries/Bridge/YunClient.h | 68 +++++++++++++++++ libraries/Bridge/YunServer.cpp | 102 +------------------------ libraries/Bridge/YunServer.h | 50 +----------- 4 files changed, 239 insertions(+), 148 deletions(-) create mode 100644 libraries/Bridge/YunClient.cpp create mode 100644 libraries/Bridge/YunClient.h (limited to 'libraries/Bridge') diff --git a/libraries/Bridge/YunClient.cpp b/libraries/Bridge/YunClient.cpp new file mode 100644 index 0000000..aaaf907 --- /dev/null +++ b/libraries/Bridge/YunClient.cpp @@ -0,0 +1,167 @@ +/* + Copyright (c) 2013 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +YunClient::YunClient(int _h, BridgeClass &_b) : + bridge(_b), handle(_h), opened(true), buffered(0) { +} + +YunClient::YunClient(BridgeClass &_b) : + bridge(_b), handle(0), opened(false), buffered(0) { +} + +YunClient::~YunClient() { +} + +YunClient& YunClient::operator=(const YunClient &_x) { + opened = _x.opened; + handle = _x.handle; + return *this; +} + +void YunClient::stop() { + if (opened) { + uint8_t cmd[] = {'j', handle}; + bridge.transfer(cmd, 2); + } + opened = false; +} + +void YunClient::doBuffer() { + // If there are already char in buffer exit + if (buffered > 0) + return; + + // Try to buffer up to 32 characters + readPos = 0; + uint8_t cmd[] = {'K', handle, sizeof(buffer)}; + buffered = bridge.transfer(cmd, 3, buffer, sizeof(buffer)); +} + +int YunClient::available() { + // Look if there is new data available + doBuffer(); + return buffered; +} + +int YunClient::read() { + doBuffer(); + if (buffered == 0) + return -1; // no chars available + else { + buffered--; + return buffer[readPos++]; + } +} + +int YunClient::read(uint8_t *buff, size_t size) { + int readed = 0; + do { + if (buffered == 0) { + doBuffer(); + if (buffered == 0) + return readed; + } + buff[readed++] = buffer[readPos++]; + buffered--; + } while (readed < size); + return readed; +} + +int YunClient::peek() { + doBuffer(); + if (buffered == 0) + return -1; // no chars available + else + return buffer[readPos]; +} + +size_t YunClient::write(uint8_t c) { + if (!opened) + return 0; + uint8_t cmd[] = {'l', handle, c}; + bridge.transfer(cmd, 3); + return 1; +} + +size_t YunClient::write(const uint8_t *buf, size_t size) { + if (!opened) + return 0; + uint8_t cmd[] = {'l', handle}; + bridge.transfer(cmd, 2, buf, size, NULL, 0); + return size; +} + +void YunClient::flush() { +} + +uint8_t YunClient::connected() { + if (!opened) + return false; + uint8_t cmd[] = {'L', handle}; + uint8_t res[1]; + bridge.transfer(cmd, 2, res, 1); + return (res[0] == 1); +} + +int YunClient::connect(IPAddress ip, uint16_t port) { + String address; + address.reserve(18); + address += ip[0]; + address += '.'; + address += ip[1]; + address += '.'; + address += ip[2]; + address += '.'; + address += ip[3]; + return connect(address.c_str(), port); +} + +int YunClient::connect(const char *host, uint16_t port) { + uint8_t tmp[] = { + 'C', + (port >> 8) & 0xFF, + port & 0xFF + }; + uint8_t res[1]; + int l = bridge.transfer(tmp, 3, (const uint8_t *)host, strlen(host), res, 1); + if (l==0) + return 0; + handle = res[0]; + + // wait for connection + uint8_t tmp2[] = { 'c', handle }; + uint8_t res2[1]; + while (true) { + bridge.transfer(tmp2, 2, res2, 1); + if (res2[0] == 0) + break; + delay(1); + } + opened = true; + + // check for successful connection + if (connected()) + return 1; + + opened = false; + handle = 0; + return 0; +} + diff --git a/libraries/Bridge/YunClient.h b/libraries/Bridge/YunClient.h new file mode 100644 index 0000000..59e3a0c --- /dev/null +++ b/libraries/Bridge/YunClient.h @@ -0,0 +1,68 @@ +/* + Copyright (c) 2013 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _YUN_CLIENT_H_ +#define _YUN_CLIENT_H_ + +#include +#include + +class YunClient : public Client { +public: + // Constructor with a user provided BridgeClass instance + YunClient(int _h, BridgeClass &_b = Bridge); + YunClient(BridgeClass &_b = Bridge); + ~YunClient(); + + // Stream methods + // (read message) + virtual int available(); + virtual int read(); + virtual int read(uint8_t *buf, size_t size); + virtual int peek(); + // (write response) + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *buf, size_t size); + virtual void flush(); + // TODO: add optimized function for block write + + virtual operator bool () { return opened; } + + YunClient& operator=(const YunClient &_x); + + virtual void stop(); + virtual uint8_t connected(); + + virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(const char *host, uint16_t port); + +private: + BridgeClass &bridge; + unsigned int handle; + boolean opened; + +private: + void doBuffer(); + uint8_t buffered; + uint8_t readPos; + static const int BUFFER_SIZE = 64; + uint8_t buffer[BUFFER_SIZE]; + +}; + +#endif // _YUN_CLIENT_H_ diff --git a/libraries/Bridge/YunServer.cpp b/libraries/Bridge/YunServer.cpp index c0ed88c..f23566a 100644 --- a/libraries/Bridge/YunServer.cpp +++ b/libraries/Bridge/YunServer.cpp @@ -17,6 +17,7 @@ */ #include +#include YunServer::YunServer(uint16_t _p, BridgeClass &_b) : bridge(_b), port(_p), listening(false), useLocalhost(false) { @@ -45,104 +46,3 @@ YunClient YunServer::accept() { return YunClient(res[0]); } -YunClient::YunClient(int _h, BridgeClass &_b) : - bridge(_b), handle(_h), opened(true), buffered(0) { -} - -YunClient::YunClient(BridgeClass &_b) : - bridge(_b), handle(0), opened(false), buffered(0) { -} - -YunClient::~YunClient() { -} - -YunClient& YunClient::operator=(const YunClient &_x) { - opened = _x.opened; - handle = _x.handle; - return *this; -} - -void YunClient::stop() { - if (opened) { - uint8_t cmd[] = {'j', handle}; - bridge.transfer(cmd, 2); - } - opened = false; -} - -void YunClient::doBuffer() { - // If there are already char in buffer exit - if (buffered > 0) - return; - - // Try to buffer up to 32 characters - readPos = 0; - uint8_t cmd[] = {'K', handle, sizeof(buffer)}; - buffered = bridge.transfer(cmd, 3, buffer, sizeof(buffer)); -} - -int YunClient::available() { - // Look if there is new data available - doBuffer(); - return buffered; -} - -int YunClient::read() { - doBuffer(); - if (buffered == 0) - return -1; // no chars available - else { - buffered--; - return buffer[readPos++]; - } -} - -int YunClient::read(uint8_t *buff, size_t size) { - int readed = 0; - do { - if (buffered == 0) { - doBuffer(); - if (buffered == 0) - return readed; - } - buff[readed++] = buffer[readPos++]; - buffered--; - } while (readed < size); - return readed; -} - -int YunClient::peek() { - doBuffer(); - if (buffered == 0) - return -1; // no chars available - else - return buffer[readPos]; -} - -size_t YunClient::write(uint8_t c) { - if (!opened) - return 0; - uint8_t cmd[] = {'l', handle, c}; - bridge.transfer(cmd, 3); - return 1; -} - -size_t YunClient::write(const uint8_t *buf, size_t size) { - if (!opened) - return 0; - uint8_t cmd[] = {'l', handle}; - bridge.transfer(cmd, 2, buf, size, NULL, 0); - return size; -} - -void YunClient::flush() { -} - -uint8_t YunClient::connected() { - if (!opened) - return false; - uint8_t cmd[] = {'L', handle}; - uint8_t res[1]; - bridge.transfer(cmd, 2, res, 1); - return (res[0] == 1); -} diff --git a/libraries/Bridge/YunServer.h b/libraries/Bridge/YunServer.h index 0a04886..7343924 100644 --- a/libraries/Bridge/YunServer.h +++ b/libraries/Bridge/YunServer.h @@ -16,12 +16,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CONNECTOR_H_ -#define CONNECTOR_H_ +#ifndef _YUN_SERVER_H_ +#define _YUN_SERVER_H_ #include #include -#include class YunClient; @@ -45,47 +44,4 @@ private: BridgeClass &bridge; }; -class YunClient : public Client { -public: - // Constructor with a user provided BridgeClass instance - YunClient(int _h, BridgeClass &_b = Bridge); - YunClient(BridgeClass &_b = Bridge); - ~YunClient(); - - // Stream methods - // (read message) - virtual int available(); - virtual int read(); - virtual int read(uint8_t *buf, size_t size); - virtual int peek(); - // (write response) - virtual size_t write(uint8_t); - virtual size_t write(const uint8_t *buf, size_t size); - virtual void flush(); - // TODO: add optimized function for block write - - virtual operator bool () { return opened; } - - YunClient& operator=(const YunClient &_x); - - virtual void stop(); - virtual uint8_t connected(); - - virtual int connect(IPAddress ip, uint16_t port) { /* TODO */ }; - virtual int connect(const char *host, uint16_t port) { /* TODO */ }; - -private: - BridgeClass &bridge; - unsigned int handle; - boolean opened; - -private: - void doBuffer(); - uint8_t buffered; - uint8_t readPos; - static const int BUFFER_SIZE = 64; - uint8_t buffer[BUFFER_SIZE]; - -}; - -#endif // CONNECTOR_H_ +#endif // _YUN_SERVER_H_ -- cgit v1.2.3-18-g5258