diff options
Diffstat (limited to 'libraries/Bridge')
| -rw-r--r-- | libraries/Bridge/YunClient.cpp | 167 | ||||
| -rw-r--r-- | libraries/Bridge/YunClient.h | 68 | ||||
| -rw-r--r-- | libraries/Bridge/YunServer.cpp | 102 | ||||
| -rw-r--r-- | libraries/Bridge/YunServer.h | 50 | 
4 files changed, 239 insertions, 148 deletions
| 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.h> + +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 <Bridge.h> +#include <Client.h> + +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 <YunServer.h> +#include <YunClient.h>  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 <Bridge.h>  #include <Server.h> -#include <Client.h>  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_ | 
