From 66b1a7ea395c04d971dc666dfe3274778adbaf1e Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 28 Jun 2013 09:49:22 +0200 Subject: Bridge: added YunServer and TunClient class --- libraries/Bridge/YunServer.cpp | 145 +++++++++++++++++++++++++++++++++++++++++ libraries/Bridge/YunServer.h | 87 +++++++++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 libraries/Bridge/YunServer.cpp create mode 100644 libraries/Bridge/YunServer.h (limited to 'libraries/Bridge') diff --git a/libraries/Bridge/YunServer.cpp b/libraries/Bridge/YunServer.cpp new file mode 100644 index 0000000..c6d54e4 --- /dev/null +++ b/libraries/Bridge/YunServer.cpp @@ -0,0 +1,145 @@ +/* + 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 + +YunServer::YunServer(uint16_t _p, BridgeClass &_b) : + bridge(_b), port(_p), listening(false) { +} + +void YunServer::begin() { + uint8_t tmp[] = { + 'N', + (port >> 8) & 0xFF, + port & 0xFF + }; + uint8_t res[1]; + bridge.transfer(tmp, 3, (const uint8_t *)"0.0.0.0", 7, res, 1); + listening = (res[0] == 1); +} + +YunClient YunServer::accept() { + uint8_t cmd[] = {'k'}; + uint8_t res[1]; + unsigned int l = bridge.transfer(cmd, 1, res, 1); + if (l==0) + return YunClient(); + 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 new file mode 100644 index 0000000..e1be55a --- /dev/null +++ b/libraries/Bridge/YunServer.h @@ -0,0 +1,87 @@ +/* + 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 CONNECTOR_H_ +#define CONNECTOR_H_ + +#include +#include +#include + +class YunClient; + +class YunServer : public Server { +public: + // Constructor with a user provided BridgeClass instance + YunServer(uint16_t port, BridgeClass &_b = Bridge); + + void begin(); + YunClient accept(); + + virtual size_t write(uint8_t c) { /* TODO */ } + +private: + uint16_t port; + bool listening; + 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_ -- cgit v1.2.3-18-g5258