A client for the SmartREST protocol from Cumulocity.
Fork of MbedSmartRest by
MbedDataSink.cpp@14:dc3f8dd5c02b, 2014-04-14 (annotated)
- Committer:
- vwochnik
- Date:
- Mon Apr 14 11:23:50 2014 +0000
- Revision:
- 14:dc3f8dd5c02b
- Parent:
- 13:e76920d5e1ec
fix
Who changed what in which revision?
User | Revision | Line number | New 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 | } |