branch with improvemnts

Fork of M2XStreamClient by AT&T M2X Team

Committer:
citrusbyte
Date:
Wed Sep 10 13:07:34 2014 +0000
Revision:
10:4ce9eba38dbe
Parent:
0:f479e4f4db0e
Sync changes with github repo

Who changed what in which revision?

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