A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Committer:
vwochnik
Date:
Mon Apr 14 11:23:50 2014 +0000
Revision:
14:dc3f8dd5c02b
Parent:
13:e76920d5e1ec
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 2:1038411466a6 1 #include "MbedDataSink.h"
vwochnik 13:e76920d5e1ec 2 #include "MbedClient.h"
vwochnik 2:1038411466a6 3 #include <stdlib.h>
vwochnik 13:e76920d5e1ec 4 #include <string.h>
vwochnik 2:1038411466a6 5
vwochnik 13:e76920d5e1ec 6 #include "mbed.h"
vwochnik 13:e76920d5e1ec 7
vwochnik 13:e76920d5e1ec 8 MbedDataSink::MbedDataSink(TCPSocketConnection& sock) : _len(0), _sock(sock)
vwochnik 2:1038411466a6 9 {
vwochnik 2:1038411466a6 10 }
vwochnik 2:1038411466a6 11
vwochnik 2:1038411466a6 12 MbedDataSink::~MbedDataSink()
vwochnik 2:1038411466a6 13 {
vwochnik 2:1038411466a6 14 }
vwochnik 2:1038411466a6 15
vwochnik 2:1038411466a6 16 size_t MbedDataSink::write(char c)
vwochnik 2:1038411466a6 17 {
vwochnik 13:e76920d5e1ec 18 while (MBED_SINK_BUFFER_SIZE - _len < 1) {
vwochnik 13:e76920d5e1ec 19 if (!send())
vwochnik 13:e76920d5e1ec 20 return 0;
vwochnik 13:e76920d5e1ec 21 }
vwochnik 13:e76920d5e1ec 22
vwochnik 13:e76920d5e1ec 23 _buf[_len++] = c;
vwochnik 2:1038411466a6 24 return 1;
vwochnik 2:1038411466a6 25 }
vwochnik 2:1038411466a6 26
vwochnik 2:1038411466a6 27 size_t MbedDataSink::write(void *buf, size_t length)
vwochnik 2:1038411466a6 28 {
vwochnik 13:e76920d5e1ec 29 size_t sent = 0, len;
vwochnik 2:1038411466a6 30
vwochnik 13:e76920d5e1ec 31 while (sent < length) {
vwochnik 13:e76920d5e1ec 32 while (MBED_SINK_BUFFER_SIZE - _len < 1) {
vwochnik 13:e76920d5e1ec 33 if (!send())
vwochnik 13:e76920d5e1ec 34 return 0;
vwochnik 13:e76920d5e1ec 35 }
vwochnik 13:e76920d5e1ec 36
vwochnik 13:e76920d5e1ec 37 if (MBED_SINK_BUFFER_SIZE - _len >= length-sent)
vwochnik 13:e76920d5e1ec 38 len = length-sent;
vwochnik 13:e76920d5e1ec 39 else
vwochnik 13:e76920d5e1ec 40 len = MBED_SINK_BUFFER_SIZE - _len;
vwochnik 13:e76920d5e1ec 41
vwochnik 13:e76920d5e1ec 42 memcpy(_buf+_len, (char*)buf+sent, len);
vwochnik 13:e76920d5e1ec 43 _len += len;
vwochnik 13:e76920d5e1ec 44 sent += len;
vwochnik 13:e76920d5e1ec 45 }
vwochnik 13:e76920d5e1ec 46
vwochnik 13:e76920d5e1ec 47 return length;
vwochnik 2:1038411466a6 48 }
vwochnik 2:1038411466a6 49
vwochnik 2:1038411466a6 50 size_t MbedDataSink::write(const char *str)
vwochnik 2:1038411466a6 51 {
vwochnik 13:e76920d5e1ec 52 return write((void*)str, strlen(str));
vwochnik 2:1038411466a6 53 }
vwochnik 2:1038411466a6 54
vwochnik 2:1038411466a6 55 size_t MbedDataSink::write(unsigned long number)
vwochnik 2:1038411466a6 56 {
vwochnik 13:e76920d5e1ec 57 char str[24];
vwochnik 2:1038411466a6 58
vwochnik 14:dc3f8dd5c02b 59 snprintf(str, 24, "%lu", number);
vwochnik 13:e76920d5e1ec 60 return write(str);
vwochnik 13:e76920d5e1ec 61 }
vwochnik 13:e76920d5e1ec 62
vwochnik 13:e76920d5e1ec 63 bool MbedDataSink::flush()
vwochnik 13:e76920d5e1ec 64 {
vwochnik 13:e76920d5e1ec 65 while (_len > 0) {
vwochnik 13:e76920d5e1ec 66 if (!send())
vwochnik 13:e76920d5e1ec 67 return false;
vwochnik 13:e76920d5e1ec 68 }
vwochnik 13:e76920d5e1ec 69
vwochnik 13:e76920d5e1ec 70 return true;
vwochnik 2:1038411466a6 71 }
vwochnik 2:1038411466a6 72
vwochnik 13:e76920d5e1ec 73 bool MbedDataSink::send()
vwochnik 2:1038411466a6 74 {
vwochnik 13:e76920d5e1ec 75 int ret;
vwochnik 13:e76920d5e1ec 76
vwochnik 13:e76920d5e1ec 77 if (!_sock.is_connected())
vwochnik 13:e76920d5e1ec 78 return false;
vwochnik 14:dc3f8dd5c02b 79
vwochnik 13:e76920d5e1ec 80 _sock.set_blocking(true);
vwochnik 13:e76920d5e1ec 81 ret = _sock.send(_buf, _len);
vwochnik 13:e76920d5e1ec 82
vwochnik 13:e76920d5e1ec 83 //TODO: fix bug in u-blox so no longer wait is needed
vwochnik 13:e76920d5e1ec 84 wait(0.5);
vwochnik 13:e76920d5e1ec 85
vwochnik 13:e76920d5e1ec 86 if (ret < 0){
vwochnik 13:e76920d5e1ec 87 puts("Send failed.");
vwochnik 13:e76920d5e1ec 88 return false;
vwochnik 13:e76920d5e1ec 89 }
vwochnik 13:e76920d5e1ec 90
vwochnik 13:e76920d5e1ec 91 // move rest of buffer
vwochnik 13:e76920d5e1ec 92 if ((ret > 0) && (ret < _len))
vwochnik 13:e76920d5e1ec 93 memmove(_buf, _buf+ret, _len-ret);
vwochnik 13:e76920d5e1ec 94
vwochnik 13:e76920d5e1ec 95 _len -= ret;
vwochnik 13:e76920d5e1ec 96 return true;
vwochnik 2:1038411466a6 97 }
vwochnik 2:1038411466a6 98
vwochnik 13:e76920d5e1ec 99 void MbedDataSink::reset()
vwochnik 2:1038411466a6 100 {
vwochnik 13:e76920d5e1ec 101 _len = 0;
vwochnik 13:e76920d5e1ec 102 }