A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

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