A client for the SmartREST protocol from Cumulocity.
Fork of MbedSmartRest by
MbedDataSink.cpp@13:e76920d5e1ec, 2014-04-11 (annotated)
- 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?
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 | 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 | } |