ARM mbed M2X API Client: The ARM mbed client library is used to send/receive data to/from AT&T's M2X service from mbed LPC1768 microcontrollers.
Dependents: m2x-demo-all M2X_MTS_ACCEL_DEMO M2X_MTS_Accel M2X_K64F_ACCEL ... more
Diff: Client.cpp
- Revision:
- 22:4d895e732765
- Parent:
- 21:6878944d2ce2
--- a/Client.cpp Sat Jan 02 02:29:43 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -#include "Client.h" -#include "mbed.h" - -#include <stdint.h> - -Client::Client() : _incnt(0), _outcnt(0), _sock() { - _sock.set_blocking(false, 1500); -} - -Client::~Client() { -} - -int Client::connect(const char *host, uint16_t port) { - return _sock.connect(host, port) == 0; -} - -size_t Client::write(uint8_t b) { - return write(&b, 1); -} - -size_t Client::write(const uint8_t *buf, size_t size) { - size_t cnt = 0; - while (size) { - int tmp = sizeof(_outbuf) - _outcnt; - if (tmp > size) tmp = size; - memcpy(_outbuf + _outcnt, buf, tmp); - _outcnt += tmp; - buf += tmp; - size -= tmp; - cnt += tmp; - // if no space flush it - if (_outcnt == sizeof(_outbuf)) - _flushout(); - } - return cnt; -} - -void Client::_flushout(void) -{ - if (_outcnt > 0) { - // NOTE: we know it's dangerous to cast from (const uint8_t *) to (char *), - // but we are trying to maintain a stable interface between the Arduino - // one and the mbed one. What's more, while TCPSocketConnection has no - // intention of modifying the data here, it requires us to send a (char *) - // typed data. So we belive it's safe to do the cast here. - _sock.send_all(const_cast<char*>((const char*) _outbuf), _outcnt); - _outcnt = 0; - } -} - -void Client::_fillin(void) -{ - int tmp = sizeof(_inbuf) - _incnt; - if (tmp) { - tmp = _sock.receive_all((char*)_inbuf + _incnt, tmp); - if (tmp > 0) - _incnt += tmp; - } -} - -void Client::flush() { - _flushout(); -} - -int Client::available() { - if (_incnt == 0) { - _flushout(); - _fillin(); - } - return (_incnt > 0) ? 1 : 0; -} - -int Client::read() { - uint8_t ch; - return (read(&ch, 1) == 1) ? ch : -1; -} - -int Client::read(uint8_t *buf, size_t size) { - int cnt = 0; - while (size) { - // need more - if (size > _incnt) { - _flushout(); - _fillin(); - } - if (_incnt > 0) { - int tmp = _incnt; - if (tmp > size) tmp = size; - memcpy(buf, _inbuf, tmp); - if (tmp != _incnt) - memmove(_inbuf, _inbuf + tmp, _incnt - tmp); - _incnt -= tmp; - size -= tmp; - buf += tmp; - cnt += tmp; - } else // no data - break; - } - return cnt; -} - -void Client::stop() { - _sock.close(); -} - -uint8_t Client::connected() { - return _sock.is_connected() ? 1 : 0; -}