branch with improvemnts

Fork of M2XStreamClient by AT&T M2X Team

Committer:
citrusbyte
Date:
Wed Aug 13 01:56:18 2014 +0000
Revision:
9:48b088e317aa
Parent:
6:e6d66d99dd6f
Timestamp is now a required field

Who changed what in which revision?

UserRevisionLine numberNew contents of line
citrusbyte 9:48b088e317aa 1 #ifndef M2XStreamClient_template_h
citrusbyte 9:48b088e317aa 2 #define M2XStreamClient_template_h
citrusbyte 9:48b088e317aa 3
citrusbyte 9:48b088e317aa 4 // Implementations of template functions
citrusbyte 9:48b088e317aa 5
citrusbyte 9:48b088e317aa 6 int print_encoded_string(Print* print, const char* str);
citrusbyte 9:48b088e317aa 7
citrusbyte 9:48b088e317aa 8 template <class T>
citrusbyte 9:48b088e317aa 9 int M2XStreamClient::post(const char* feedId, const char* streamName, T value) {
citrusbyte 9:48b088e317aa 10 if (_client->connect(_host, _port)) {
citrusbyte 9:48b088e317aa 11 DBGLN("%s", "Connected to M2X server!");
citrusbyte 9:48b088e317aa 12 writePostHeader(feedId, streamName,
citrusbyte 9:48b088e317aa 13 // for {"value": and }
citrusbyte 9:48b088e317aa 14 _null_print.print(value) + 10);
citrusbyte 9:48b088e317aa 15 _client->print("{\"value\":");
citrusbyte 9:48b088e317aa 16 _client->print(value);
citrusbyte 9:48b088e317aa 17 _client->print("}");
citrusbyte 9:48b088e317aa 18 } else {
citrusbyte 9:48b088e317aa 19 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
citrusbyte 9:48b088e317aa 20 return E_NOCONNECTION;
citrusbyte 9:48b088e317aa 21 }
citrusbyte 9:48b088e317aa 22
citrusbyte 9:48b088e317aa 23 return readStatusCode(true);
citrusbyte 9:48b088e317aa 24 }
citrusbyte 9:48b088e317aa 25
citrusbyte 9:48b088e317aa 26 template <class T>
citrusbyte 9:48b088e317aa 27 inline int write_multiple_values(Print* print, int streamNum,
citrusbyte 9:48b088e317aa 28 const char* names[], const int counts[],
citrusbyte 9:48b088e317aa 29 const char* ats[], T values[]) {
citrusbyte 9:48b088e317aa 30 int bytes = 0, value_index = 0;
citrusbyte 9:48b088e317aa 31 bytes += print->print("{\"values\":{");
citrusbyte 9:48b088e317aa 32 for (int i = 0; i < streamNum; i++) {
citrusbyte 9:48b088e317aa 33 bytes += print->print("\"");
citrusbyte 9:48b088e317aa 34 bytes += print->print(names[i]);
citrusbyte 9:48b088e317aa 35 bytes += print->print("\":[");
citrusbyte 9:48b088e317aa 36 for (int j = 0; j < counts[i]; j++) {
citrusbyte 9:48b088e317aa 37 bytes += print->print("{\"at\": \"");
citrusbyte 9:48b088e317aa 38 bytes += print->print(ats[value_index]);
citrusbyte 9:48b088e317aa 39 bytes += print->print("\", \"value\": \"");
citrusbyte 9:48b088e317aa 40 bytes += print->print(values[value_index]);
citrusbyte 9:48b088e317aa 41 bytes += print->print("\"}");
citrusbyte 9:48b088e317aa 42 if (j < counts[i] - 1) { bytes += print->print(","); }
citrusbyte 9:48b088e317aa 43 value_index++;
citrusbyte 9:48b088e317aa 44 }
citrusbyte 9:48b088e317aa 45 bytes += print->print("]");
citrusbyte 9:48b088e317aa 46 if (i < streamNum - 1) { bytes += print->print(","); }
citrusbyte 9:48b088e317aa 47 }
citrusbyte 9:48b088e317aa 48 bytes += print->print("}}");
citrusbyte 9:48b088e317aa 49 return bytes;
citrusbyte 9:48b088e317aa 50 }
citrusbyte 6:e6d66d99dd6f 51
citrusbyte 9:48b088e317aa 52 template <class T>
citrusbyte 9:48b088e317aa 53 int M2XStreamClient::postMultiple(const char* feedId, int streamNum,
citrusbyte 9:48b088e317aa 54 const char* names[], const int counts[],
citrusbyte 9:48b088e317aa 55 const char* ats[], T values[]) {
citrusbyte 9:48b088e317aa 56 if (_client->connect(_host, _port)) {
citrusbyte 9:48b088e317aa 57 DBGLN("%s", "Connected to M2X server!");
citrusbyte 9:48b088e317aa 58 int length = write_multiple_values(&_null_print, streamNum, names,
citrusbyte 9:48b088e317aa 59 counts, ats, values);
citrusbyte 9:48b088e317aa 60 _client->print("POST /v1/feeds/");
citrusbyte 9:48b088e317aa 61 print_encoded_string(_client, feedId);
citrusbyte 9:48b088e317aa 62 _client->println(" HTTP/1.0");
citrusbyte 9:48b088e317aa 63 writeHttpHeader(length);
citrusbyte 9:48b088e317aa 64 write_multiple_values(_client, streamNum, names, counts, ats, values);
citrusbyte 9:48b088e317aa 65 } else {
citrusbyte 9:48b088e317aa 66 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
citrusbyte 9:48b088e317aa 67 return E_NOCONNECTION;
citrusbyte 9:48b088e317aa 68 }
citrusbyte 9:48b088e317aa 69 return readStatusCode(true);
citrusbyte 9:48b088e317aa 70 }
citrusbyte 9:48b088e317aa 71
citrusbyte 9:48b088e317aa 72 template <class T>
citrusbyte 9:48b088e317aa 73 static int write_location_data(Print* print, const char* name,
citrusbyte 9:48b088e317aa 74 T latitude, T longitude,
citrusbyte 9:48b088e317aa 75 T elevation) {
citrusbyte 9:48b088e317aa 76 int bytes = 0;
citrusbyte 9:48b088e317aa 77 bytes += print->print("{\"name\":\"");
citrusbyte 9:48b088e317aa 78 bytes += print->print(name);
citrusbyte 9:48b088e317aa 79 bytes += print->print("\",\"latitude\":\"");
citrusbyte 9:48b088e317aa 80 bytes += print->print(latitude);
citrusbyte 9:48b088e317aa 81 bytes += print->print("\",\"longitude\":\"");
citrusbyte 9:48b088e317aa 82 bytes += print->print(longitude);
citrusbyte 9:48b088e317aa 83 bytes += print->print("\",\"elevation\":\"");
citrusbyte 9:48b088e317aa 84 bytes += print->print(elevation);
citrusbyte 9:48b088e317aa 85 bytes += print->print("\"}");
citrusbyte 9:48b088e317aa 86 return bytes;
citrusbyte 9:48b088e317aa 87 }
citrusbyte 9:48b088e317aa 88
citrusbyte 9:48b088e317aa 89 static int write_location_data(Print* print, const char* name,
citrusbyte 9:48b088e317aa 90 double latitude, double longitude,
citrusbyte 9:48b088e317aa 91 double elevation) {
citrusbyte 9:48b088e317aa 92 int bytes = 0;
citrusbyte 9:48b088e317aa 93 bytes += print->print("{\"name\":\"");
citrusbyte 9:48b088e317aa 94 bytes += print->print(name);
citrusbyte 9:48b088e317aa 95 bytes += print->print("\",\"latitude\":\"");
citrusbyte 9:48b088e317aa 96 bytes += print->print(latitude, MAX_DOUBLE_DIGITS);
citrusbyte 9:48b088e317aa 97 bytes += print->print("\",\"longitude\":\"");
citrusbyte 9:48b088e317aa 98 bytes += print->print(longitude, MAX_DOUBLE_DIGITS);
citrusbyte 9:48b088e317aa 99 bytes += print->print("\",\"elevation\":\"");
citrusbyte 9:48b088e317aa 100 bytes += print->print(elevation);
citrusbyte 9:48b088e317aa 101 bytes += print->print("\"}");
citrusbyte 9:48b088e317aa 102 return bytes;
citrusbyte 9:48b088e317aa 103 }
citrusbyte 9:48b088e317aa 104
citrusbyte 9:48b088e317aa 105 template <class T>
citrusbyte 9:48b088e317aa 106 int M2XStreamClient::updateLocation(const char* feedId,
citrusbyte 9:48b088e317aa 107 const char* name,
citrusbyte 9:48b088e317aa 108 T latitude,
citrusbyte 9:48b088e317aa 109 T longitude,
citrusbyte 9:48b088e317aa 110 T elevation) {
citrusbyte 9:48b088e317aa 111 if (_client->connect(_host, _port)) {
citrusbyte 9:48b088e317aa 112 DBGLN("%s", "Connected to M2X server!");
citrusbyte 9:48b088e317aa 113
citrusbyte 9:48b088e317aa 114 int length = write_location_data(&_null_print, name, latitude, longitude,
citrusbyte 9:48b088e317aa 115 elevation);
citrusbyte 9:48b088e317aa 116 _client->print("PUT /v1/feeds/");
citrusbyte 9:48b088e317aa 117 print_encoded_string(_client, feedId);
citrusbyte 9:48b088e317aa 118 _client->println("/location HTTP/1.0");
citrusbyte 9:48b088e317aa 119
citrusbyte 9:48b088e317aa 120 writeHttpHeader(length);
citrusbyte 9:48b088e317aa 121 write_location_data(_client, name, latitude, longitude, elevation);
citrusbyte 9:48b088e317aa 122 } else {
citrusbyte 9:48b088e317aa 123 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
citrusbyte 9:48b088e317aa 124 return E_NOCONNECTION;
citrusbyte 9:48b088e317aa 125 }
citrusbyte 9:48b088e317aa 126 return readStatusCode(true);
citrusbyte 9:48b088e317aa 127 }
citrusbyte 9:48b088e317aa 128
citrusbyte 9:48b088e317aa 129 #endif
citrusbyte 9:48b088e317aa 130