plotly interface based on ardunio sample code

Dependents:   Plotly_HelloWorld

Library for plotting a simple x/y scatter chart on the plot.ly website.

See plotly_HelloWorld for sample usage.

Committer:
AndyA
Date:
Thu Jul 03 15:21:30 2014 +0000
Revision:
2:d53d74ed68ac
Parent:
1:d532e96fca12
Child:
3:967be3d46701
update;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:96532c59670f 1 #include "plotly.h"
AndyA 0:96532c59670f 2 #include "mbed.h"
AndyA 0:96532c59670f 3
AndyA 2:d53d74ed68ac 4 #define plotlyURL "arduino.plot.ly"
AndyA 0:96532c59670f 5
AndyA 0:96532c59670f 6 #define dataURL "arduino.plot.ly"
AndyA 0:96532c59670f 7
AndyA 0:96532c59670f 8
AndyA 0:96532c59670f 9 //#define plotlyURL "192.168.1.87"
AndyA 0:96532c59670f 10 //#define dataURL "192.168.1.87"
AndyA 0:96532c59670f 11
AndyA 0:96532c59670f 12 plotly::plotly(char *username, char *api_key, char* stream_tokens[], char *filename, int nTraces)
AndyA 0:96532c59670f 13 {
AndyA 0:96532c59670f 14 log_level = 0; // 0 = Debugging, 1 = Informational, 2 = Status, 3 = Errors, 4 = Quiet (// Serial Off)
AndyA 0:96532c59670f 15 dry_run = false;
AndyA 0:96532c59670f 16 username_ = username;
AndyA 0:96532c59670f 17 api_key_ = api_key;
AndyA 0:96532c59670f 18 stream_tokens_ = stream_tokens;
AndyA 0:96532c59670f 19 filename_ = filename;
AndyA 0:96532c59670f 20 nTraces_ = nTraces;
AndyA 0:96532c59670f 21 maxpoints = 30;
AndyA 0:96532c59670f 22 fibonacci_ = 1;
AndyA 0:96532c59670f 23 world_readable = true;
AndyA 0:96532c59670f 24 convertTimestamp = true;
AndyA 0:96532c59670f 25 timezone = "America/Montreal";
AndyA 0:96532c59670f 26 fileopt = "overwrite";
AndyA 1:d532e96fca12 27
AndyA 2:d53d74ed68ac 28 socket = NULL;
AndyA 1:d532e96fca12 29 initalised = false;
AndyA 0:96532c59670f 30 }
AndyA 0:96532c59670f 31
AndyA 0:96532c59670f 32
AndyA 1:d532e96fca12 33 plotly::~plotly()
AndyA 1:d532e96fca12 34 {
AndyA 1:d532e96fca12 35 closeStream();
AndyA 1:d532e96fca12 36 }
AndyA 0:96532c59670f 37
AndyA 0:96532c59670f 38 bool plotly::init()
AndyA 0:96532c59670f 39 {
AndyA 0:96532c59670f 40
AndyA 0:96532c59670f 41 //
AndyA 0:96532c59670f 42 // Validate a stream with a REST post to plotly
AndyA 0:96532c59670f 43 //
AndyA 0:96532c59670f 44 if(dry_run && log_level < 3) {
AndyA 0:96532c59670f 45 fprintf(stderr,"... This is a dry run, we are not connecting to plotly's servers...\n");
AndyA 0:96532c59670f 46 } else if(log_level < 3) {
AndyA 0:96532c59670f 47 fprintf(stderr,"... Attempting to connect to plotly's REST servers\n");
AndyA 0:96532c59670f 48 }
AndyA 0:96532c59670f 49
AndyA 2:d53d74ed68ac 50 // socket.set_blocking(false);
AndyA 1:d532e96fca12 51
AndyA 2:d53d74ed68ac 52 if (!dry_run) {
AndyA 2:d53d74ed68ac 53 socket = new TCPSocketConnection();
AndyA 2:d53d74ed68ac 54 while (socket->connect(plotlyURL, 80) < 0) {
AndyA 0:96532c59670f 55 fprintf(stderr,"... Couldn\'t connect to plotly's REST servers... trying again!\n");
AndyA 2:d53d74ed68ac 56 wait(1);
AndyA 0:96532c59670f 57 }
AndyA 2:d53d74ed68ac 58 }
AndyA 1:d532e96fca12 59
AndyA 1:d532e96fca12 60 if(log_level < 3) fprintf(stderr,"... Connected to plotly's REST servers\n");
AndyA 2:d53d74ed68ac 61
AndyA 1:d532e96fca12 62 if(log_level < 3) fprintf(stderr,"... Sending HTTP Post to plotly\n");
AndyA 2:d53d74ed68ac 63
AndyA 0:96532c59670f 64 print_("POST /clientresp HTTP/1.1\r\n");
AndyA 0:96532c59670f 65 print_("Host: 107.21.214.199\r\n");
AndyA 2:d53d74ed68ac 66 print_("User-Agent: mBedAA0.01\r\n");
AndyA 2:d53d74ed68ac 67 print_("plotly-streamtoken: ");
AndyA 2:d53d74ed68ac 68 print_(stream_tokens_[0]);
AndyA 2:d53d74ed68ac 69 print_("\r\n");
AndyA 0:96532c59670f 70
AndyA 0:96532c59670f 71 print_("Content-Length: ");
AndyA 0:96532c59670f 72 int contentLength = 126 + len_(username_) + len_(fileopt) + nTraces_*(87+len_(maxpoints)) + (nTraces_-1)*2 + len_(filename_);
AndyA 0:96532c59670f 73 if(world_readable) {
AndyA 0:96532c59670f 74 contentLength += 4;
AndyA 0:96532c59670f 75 } else {
AndyA 0:96532c59670f 76 contentLength += 5;
AndyA 0:96532c59670f 77 }
AndyA 0:96532c59670f 78 // contentLength =
AndyA 0:96532c59670f 79 // 44 // first part of querystring below
AndyA 0:96532c59670f 80 // + len_(username) // upper bound on username length
AndyA 0:96532c59670f 81 // + 5 // &key=
AndyA 0:96532c59670f 82 // + 10 // api_key length
AndyA 0:96532c59670f 83 // + 7 // &args=[...
AndyA 0:96532c59670f 84 // + nTraces*(87+len(maxpoints)) // len({\"y\": [], \"x\": [], \"type\": \"scatter\", \"stream\": {\"token\": \") + 10 + len(\", "maxpoints": )+len(maxpoints)+len(}})
AndyA 0:96532c59670f 85 // + (nTraces-1)*2 // ", " in between trace objects
AndyA 0:96532c59670f 86 // + 22 // ]&kwargs={\"fileopt\": \"
AndyA 0:96532c59670f 87 // + len_(fileopt)
AndyA 0:96532c59670f 88 // + 16 // \", \"filename\": \"
AndyA 0:96532c59670f 89 // + len_(filename)
AndyA 0:96532c59670f 90 // + 21 // ", "world_readable":
AndyA 0:96532c59670f 91 // + 4 if world_readable, 5 otherwise
AndyA 0:96532c59670f 92 // + 1 // closing }
AndyA 0:96532c59670f 93 //------
AndyA 0:96532c59670f 94 // 126 + len_(username) + len_(fileopt) + nTraces*(86+len(maxpoints)) + (nTraces-1)*2 + len_(filename)
AndyA 0:96532c59670f 95 //
AndyA 0:96532c59670f 96 // Terminate headers with new lines
AndyA 2:d53d74ed68ac 97
AndyA 2:d53d74ed68ac 98
AndyA 2:d53d74ed68ac 99 // big buffer method to generate the string so that length can be measured directly.
AndyA 2:d53d74ed68ac 100
AndyA 2:d53d74ed68ac 101
AndyA 2:d53d74ed68ac 102 // fprintf(stderr,"AutoVersion:\n");
AndyA 2:d53d74ed68ac 103 int lineLen = snprintf(buffer,k_bufferSize,"version=2.2&origin=plot&platform=arduino&un=%s&key=%s&args=[",username_,api_key_);
AndyA 2:d53d74ed68ac 104 for(int i=0; i<nTraces_; i++) {
AndyA 2:d53d74ed68ac 105 lineLen += snprintf((buffer+lineLen),k_bufferSize-lineLen,"{\"y\": [], \"x\": [], \"type\": \"scatter\", \"stream\": {\"token\": \"%s\", \"maxpoints\": %d}}%s",stream_tokens_[i],maxpoints,((nTraces_ > 1) && (i != nTraces_-1))?", ":"");
AndyA 2:d53d74ed68ac 106 }
AndyA 2:d53d74ed68ac 107 lineLen += snprintf((buffer+lineLen),k_bufferSize-lineLen,"]&kwargs={\"fileopt\": \"%s\", \"filename\": \"%s\", \"world_readable\": %s}",fileopt,filename_,world_readable?"true":"false");
AndyA 2:d53d74ed68ac 108
AndyA 2:d53d74ed68ac 109 // fprintf(stderr,buffer);
AndyA 2:d53d74ed68ac 110 // fprintf(stderr,"\nLen = %d",lineLen);
AndyA 2:d53d74ed68ac 111
AndyA 2:d53d74ed68ac 112 print_(lineLen);
AndyA 0:96532c59670f 113 print_("\r\n\r\n");
AndyA 2:d53d74ed68ac 114
AndyA 2:d53d74ed68ac 115 lineLen = snprintf(buffer,k_bufferSize,"version=2.2&origin=plot&platform=arduino&un=%s&key=%s&args=[",username_,api_key_);
AndyA 2:d53d74ed68ac 116 for(int i=0; i<nTraces_; i++) {
AndyA 2:d53d74ed68ac 117 lineLen += snprintf((buffer+lineLen),k_bufferSize-lineLen,"{\"y\": [], \"x\": [], \"type\": \"scatter\", \"stream\": {\"token\": \"%s\", \"maxpoints\": %d}}%s",stream_tokens_[i],maxpoints,((nTraces_ > 1) && (i != nTraces_-1))?", ":"");
AndyA 2:d53d74ed68ac 118 }
AndyA 2:d53d74ed68ac 119 lineLen += snprintf((buffer+lineLen),k_bufferSize-lineLen,"]&kwargs={\"fileopt\": \"%s\", \"filename\": \"%s\", \"world_readable\": %s}",fileopt,filename_,world_readable?"true":"false");
AndyA 2:d53d74ed68ac 120 sendFormatedText(buffer,lineLen);
AndyA 2:d53d74ed68ac 121
AndyA 2:d53d74ed68ac 122 print_("\r\n");
AndyA 2:d53d74ed68ac 123 /*
AndyA 0:96532c59670f 124 // Start printing querystring body
AndyA 0:96532c59670f 125 print_("version=2.2&origin=plot&platform=arduino&un=");
AndyA 0:96532c59670f 126 print_(username_);
AndyA 0:96532c59670f 127 print_("&key=");
AndyA 0:96532c59670f 128 print_(api_key_);
AndyA 0:96532c59670f 129 print_("&args=[");
AndyA 0:96532c59670f 130 // print a trace for each token supplied
AndyA 0:96532c59670f 131 for(int i=0; i<nTraces_; i++) {
AndyA 0:96532c59670f 132 print_("{\"y\": [], \"x\": [], \"type\": \"scatter\", \"stream\": {\"token\": \"");
AndyA 0:96532c59670f 133 print_(stream_tokens_[i]);
AndyA 0:96532c59670f 134 print_("\", \"maxpoints\": ");
AndyA 0:96532c59670f 135 print_(maxpoints);
AndyA 0:96532c59670f 136 print_("}}");
AndyA 0:96532c59670f 137 if(nTraces_ > 1 && i != nTraces_-1) {
AndyA 0:96532c59670f 138 print_(", ");
AndyA 0:96532c59670f 139 }
AndyA 0:96532c59670f 140 }
AndyA 0:96532c59670f 141 print_("]&kwargs={\"fileopt\": \"");
AndyA 0:96532c59670f 142 print_(fileopt);
AndyA 0:96532c59670f 143 print_("\", \"filename\": \"");
AndyA 0:96532c59670f 144 print_(filename_);
AndyA 0:96532c59670f 145 print_("\", \"world_readable\": ");
AndyA 0:96532c59670f 146 if(world_readable) {
AndyA 0:96532c59670f 147 print_("true");
AndyA 0:96532c59670f 148 } else {
AndyA 0:96532c59670f 149 print_("false");
AndyA 0:96532c59670f 150 }
AndyA 0:96532c59670f 151 print_("}");
AndyA 0:96532c59670f 152 // final newline to terminate the POST
AndyA 0:96532c59670f 153 print_("\r\n");
AndyA 2:d53d74ed68ac 154 */
AndyA 0:96532c59670f 155
AndyA 0:96532c59670f 156 //
AndyA 0:96532c59670f 157 // Wait for a response
AndyA 0:96532c59670f 158 // Parse the response for the "All Streams Go!" and proceed to streaming
AndyA 0:96532c59670f 159 // if we find it
AndyA 0:96532c59670f 160 //
AndyA 2:d53d74ed68ac 161
AndyA 0:96532c59670f 162 char allStreamsGo[] = "All Streams Go!";
AndyA 0:96532c59670f 163 int asgCnt = 0; // asg stands for All Streams Go
AndyA 0:96532c59670f 164 char url[] = "\"url\": \"http://107.21.214.199/~";
AndyA 0:96532c59670f 165 char fid[4];
AndyA 0:96532c59670f 166 int fidCnt = 0;
AndyA 0:96532c59670f 167 int urlCnt = 0;
AndyA 0:96532c59670f 168 int usernameCnt = 0;
AndyA 0:96532c59670f 169 bool proceed = false;
AndyA 0:96532c59670f 170 bool fidMatched = false;
AndyA 0:96532c59670f 171 char c;
AndyA 0:96532c59670f 172
AndyA 0:96532c59670f 173 if(log_level < 2) {
AndyA 0:96532c59670f 174 fprintf(stderr,"... Sent message, waiting for plotly's response...\n");
AndyA 0:96532c59670f 175 }
AndyA 0:96532c59670f 176
AndyA 0:96532c59670f 177 if(!dry_run) {
AndyA 0:96532c59670f 178 while(!proceed) {
AndyA 2:d53d74ed68ac 179 int32_t dataIn = socket->receive(buffer,k_bufferSize -1);
AndyA 1:d532e96fca12 180 if (dataIn < 0) {
AndyA 1:d532e96fca12 181 if(log_level < 3) fprintf(stderr,"error reading network socket\n");
AndyA 1:d532e96fca12 182 break;
AndyA 1:d532e96fca12 183 }
AndyA 0:96532c59670f 184 if(dataIn > 0) {
AndyA 2:d53d74ed68ac 185 buffer[dataIn]=0;
AndyA 0:96532c59670f 186
AndyA 2:d53d74ed68ac 187 if(log_level < 2) fprintf(stderr,buffer);
AndyA 0:96532c59670f 188
AndyA 0:96532c59670f 189 for (int i = 0; i<dataIn; i++) {
AndyA 2:d53d74ed68ac 190 c = buffer[i];
AndyA 0:96532c59670f 191 //
AndyA 0:96532c59670f 192 // Attempt to read the "All streams go" msg if it exists
AndyA 0:96532c59670f 193 // by comparing characters as they roll in
AndyA 0:96532c59670f 194 //
AndyA 0:96532c59670f 195
AndyA 0:96532c59670f 196 if(asgCnt == len_(allStreamsGo) && !proceed) {
AndyA 0:96532c59670f 197 proceed = true;
AndyA 0:96532c59670f 198 } else if(allStreamsGo[asgCnt]==c) {
AndyA 0:96532c59670f 199 asgCnt += 1;
AndyA 0:96532c59670f 200 } else if(asgCnt > 0) {
AndyA 0:96532c59670f 201 // reset counter
AndyA 0:96532c59670f 202 asgCnt = 0;
AndyA 0:96532c59670f 203 }
AndyA 0:96532c59670f 204
AndyA 0:96532c59670f 205 //
AndyA 0:96532c59670f 206 // Extract the last bit of the URL from the response
AndyA 0:96532c59670f 207 // The url is in the form http://107.21.214.199/~USERNAME/FID
AndyA 0:96532c59670f 208 // We'll character-count up through char url[] and through username_, then start
AndyA 0:96532c59670f 209 // filling in characters into fid
AndyA 0:96532c59670f 210 //
AndyA 0:96532c59670f 211
AndyA 0:96532c59670f 212 if(log_level < 3) {
AndyA 0:96532c59670f 213 if(url[urlCnt]==c && urlCnt < len_(url)) {
AndyA 0:96532c59670f 214 urlCnt += 1;
AndyA 0:96532c59670f 215 } else if(urlCnt > 0 && urlCnt < len_(url)) {
AndyA 0:96532c59670f 216 // Reset counter
AndyA 0:96532c59670f 217 urlCnt = 0;
AndyA 0:96532c59670f 218 }
AndyA 0:96532c59670f 219 if(urlCnt == len_(url) && fidCnt < 4 && !fidMatched) {
AndyA 0:96532c59670f 220 // We've counted through the url, start counting through the username
AndyA 0:96532c59670f 221 if(usernameCnt < len_(username_)+2) {
AndyA 0:96532c59670f 222 usernameCnt += 1;
AndyA 0:96532c59670f 223 } else {
AndyA 0:96532c59670f 224 // the url ends with "
AndyA 0:96532c59670f 225 if(c != '"') {
AndyA 0:96532c59670f 226 fid[fidCnt] = c;
AndyA 0:96532c59670f 227 fidCnt += 1;
AndyA 0:96532c59670f 228 } else if(fidCnt>0) {
AndyA 0:96532c59670f 229 fidMatched = true;
AndyA 0:96532c59670f 230 }
AndyA 0:96532c59670f 231
AndyA 0:96532c59670f 232 }
AndyA 0:96532c59670f 233 }
AndyA 0:96532c59670f 234 }
AndyA 0:96532c59670f 235 }
AndyA 0:96532c59670f 236 }
AndyA 0:96532c59670f 237 wait(0.1);
AndyA 0:96532c59670f 238 }
AndyA 0:96532c59670f 239 }
AndyA 0:96532c59670f 240
AndyA 0:96532c59670f 241 if(!dry_run && !proceed && log_level < 4) {
AndyA 0:96532c59670f 242 fprintf(stderr,"... Error initializing stream, aborting. Try again or get in touch with Chris at chris@plot.ly\n");
AndyA 0:96532c59670f 243 }
AndyA 0:96532c59670f 244
AndyA 0:96532c59670f 245 if(!dry_run && proceed && log_level < 3) {
AndyA 0:96532c59670f 246 fprintf(stderr,"... A-ok from plotly, All Streams Go!\n");
AndyA 0:96532c59670f 247 if(fidMatched) {
AndyA 0:96532c59670f 248 fprintf(stderr,"... View your streaming plot here: https://plot.ly/~");
AndyA 0:96532c59670f 249 fprintf(stderr,username_);
AndyA 0:96532c59670f 250 fprintf(stderr,"/");
AndyA 0:96532c59670f 251 for(int i=0; i<fidCnt; i++) {
AndyA 0:96532c59670f 252 fprintf(stderr,"%d ",fid[i]);
AndyA 0:96532c59670f 253 }
AndyA 0:96532c59670f 254 fprintf(stderr,"\n");
AndyA 0:96532c59670f 255 }
AndyA 0:96532c59670f 256 }
AndyA 2:d53d74ed68ac 257
AndyA 2:d53d74ed68ac 258 if (proceed || dry_run) {
AndyA 2:d53d74ed68ac 259 initalised = true;
AndyA 2:d53d74ed68ac 260 }
AndyA 2:d53d74ed68ac 261 if (socket) {
AndyA 2:d53d74ed68ac 262 delete socket;
AndyA 2:d53d74ed68ac 263 socket=NULL;
AndyA 2:d53d74ed68ac 264 }
AndyA 2:d53d74ed68ac 265 return initalised;
AndyA 0:96532c59670f 266 }
AndyA 0:96532c59670f 267
AndyA 0:96532c59670f 268 void plotly::openStream()
AndyA 0:96532c59670f 269 {
AndyA 1:d532e96fca12 270
AndyA 1:d532e96fca12 271 if (!initalised)
AndyA 1:d532e96fca12 272 return;
AndyA 0:96532c59670f 273 //
AndyA 0:96532c59670f 274 // Start request to stream servers
AndyA 0:96532c59670f 275 //
AndyA 2:d53d74ed68ac 276
AndyA 2:d53d74ed68ac 277 if (socket) {
AndyA 2:d53d74ed68ac 278 delete socket;
AndyA 2:d53d74ed68ac 279 socket = NULL;
AndyA 2:d53d74ed68ac 280 }
AndyA 2:d53d74ed68ac 281
AndyA 2:d53d74ed68ac 282
AndyA 2:d53d74ed68ac 283 if(log_level < 3) fprintf(stderr,"... Connecting to plotly's streaming servers...\n");
AndyA 2:d53d74ed68ac 284
AndyA 2:d53d74ed68ac 285
AndyA 2:d53d74ed68ac 286 if (!dry_run && !socket) {
AndyA 2:d53d74ed68ac 287 socket = new TCPSocketConnection();
AndyA 2:d53d74ed68ac 288 while (socket->connect(dataURL, 80) < 0) {
AndyA 2:d53d74ed68ac 289 fprintf(stderr,"... Couldn\'t connect to servers... trying again!\n");
AndyA 2:d53d74ed68ac 290 wait(10);
AndyA 2:d53d74ed68ac 291 }
AndyA 0:96532c59670f 292 }
AndyA 2:d53d74ed68ac 293
AndyA 2:d53d74ed68ac 294 if(log_level < 3) fprintf(stderr,"... Connected to plotly's streaming servers\n... Initializing stream\n");
AndyA 0:96532c59670f 295
AndyA 0:96532c59670f 296 print_("POST / HTTP/1.1\r\n");
AndyA 0:96532c59670f 297 print_("Host: 127.0.0.1\r\n");
AndyA 2:d53d74ed68ac 298 print_("User-Agent: mBedAA0.01\r\n");
AndyA 0:96532c59670f 299 print_("Transfer-Encoding: chunked\r\n");
AndyA 2:d53d74ed68ac 300 print_("Connection: keep-alive\r\n");
AndyA 2:d53d74ed68ac 301 print_("plotly-streamtoken: ");
AndyA 2:d53d74ed68ac 302 print_(stream_tokens_[0]);
AndyA 2:d53d74ed68ac 303 print_("\r\n");
AndyA 2:d53d74ed68ac 304 // if(convertTimestamp) {
AndyA 2:d53d74ed68ac 305 // print_("plotly-convertTimestamp: \"");
AndyA 2:d53d74ed68ac 306 // print_(timezone);
AndyA 2:d53d74ed68ac 307 // print_("\"");
AndyA 2:d53d74ed68ac 308 // print_("\r\n");
AndyA 2:d53d74ed68ac 309 // }
AndyA 2:d53d74ed68ac 310 print_("\r\n");
AndyA 0:96532c59670f 311
AndyA 1:d532e96fca12 312 if(log_level < 3) fprintf(stderr,"... Done initializing, ready to stream!\n");
AndyA 0:96532c59670f 313 }
AndyA 0:96532c59670f 314
AndyA 0:96532c59670f 315 void plotly::closeStream()
AndyA 0:96532c59670f 316 {
AndyA 2:d53d74ed68ac 317 if (socket) {
AndyA 2:d53d74ed68ac 318 if (socket->is_connected()) {
AndyA 2:d53d74ed68ac 319 print_("0\r\n\r\n");
AndyA 2:d53d74ed68ac 320 socket->close();
AndyA 2:d53d74ed68ac 321 }
AndyA 2:d53d74ed68ac 322 delete socket;
AndyA 2:d53d74ed68ac 323 socket=NULL;
AndyA 2:d53d74ed68ac 324 }
AndyA 0:96532c59670f 325 }
AndyA 1:d532e96fca12 326
AndyA 0:96532c59670f 327 void plotly::reconnectStream()
AndyA 0:96532c59670f 328 {
AndyA 2:d53d74ed68ac 329 while(!dry_run && (!socket || !socket->is_connected())) {
AndyA 0:96532c59670f 330 if(log_level<4) fprintf(stderr,"... Disconnected from streaming servers\n");
AndyA 0:96532c59670f 331 closeStream();
AndyA 0:96532c59670f 332 openStream();
AndyA 0:96532c59670f 333 }
AndyA 0:96532c59670f 334 }
AndyA 2:d53d74ed68ac 335
AndyA 0:96532c59670f 336 void plotly::jsonStart(int i)
AndyA 0:96532c59670f 337 {
AndyA 0:96532c59670f 338 // Print the length of the message in hex:
AndyA 0:96532c59670f 339 // 15 char for the json that wraps the data: {"x": , "y": }\n
AndyA 0:96532c59670f 340 // + 23 char for the token: , "token": "abcdefghij"
AndyA 0:96532c59670f 341 // = 38
AndyA 2:d53d74ed68ac 342 printHex_(i+38);
AndyA 0:96532c59670f 343 print_("\r\n{\"x\": ");
AndyA 0:96532c59670f 344 }
AndyA 0:96532c59670f 345 void plotly::jsonMiddle()
AndyA 0:96532c59670f 346 {
AndyA 0:96532c59670f 347 print_(", \"y\": ");
AndyA 0:96532c59670f 348 }
AndyA 0:96532c59670f 349 void plotly::jsonEnd(char *token)
AndyA 0:96532c59670f 350 {
AndyA 0:96532c59670f 351 print_(", \"streamtoken\": \"");
AndyA 0:96532c59670f 352 print_(token);
AndyA 2:d53d74ed68ac 353 print_("\"");
AndyA 2:d53d74ed68ac 354 print_("}\n\r\n");
AndyA 0:96532c59670f 355 }
AndyA 0:96532c59670f 356
AndyA 0:96532c59670f 357 int plotly::len_(int i)
AndyA 0:96532c59670f 358 {
AndyA 0:96532c59670f 359 // int range: -32,768 to 32,767
AndyA 0:96532c59670f 360 if(i > 9999) return 5;
AndyA 0:96532c59670f 361 else if(i > 999) return 4;
AndyA 0:96532c59670f 362 else if(i > 99) return 3;
AndyA 0:96532c59670f 363 else if(i > 9) return 2;
AndyA 0:96532c59670f 364 else if(i > -1) return 1;
AndyA 0:96532c59670f 365 else if(i > -10) return 2;
AndyA 0:96532c59670f 366 else if(i > -100) return 3;
AndyA 0:96532c59670f 367 else if(i > -1000) return 4;
AndyA 0:96532c59670f 368 else if(i > -10000) return 5;
AndyA 0:96532c59670f 369 else return 6;
AndyA 0:96532c59670f 370 }
AndyA 0:96532c59670f 371 int plotly::len_(unsigned long i)
AndyA 0:96532c59670f 372 {
AndyA 0:96532c59670f 373 // max length of unsigned long: 4294967295
AndyA 0:96532c59670f 374 if(i > 999999999) return 10;
AndyA 0:96532c59670f 375 else if(i > 99999999) return 9;
AndyA 0:96532c59670f 376 else if(i > 9999999) return 8;
AndyA 0:96532c59670f 377 else if(i > 999999) return 7;
AndyA 0:96532c59670f 378 else if(i > 99999) return 6;
AndyA 0:96532c59670f 379 else if(i > 9999) return 5;
AndyA 0:96532c59670f 380 else if(i > 999) return 4;
AndyA 0:96532c59670f 381 else if(i > 99) return 3;
AndyA 0:96532c59670f 382 else if(i > 9) return 2;
AndyA 0:96532c59670f 383 else return 1;
AndyA 0:96532c59670f 384 }
AndyA 0:96532c59670f 385 int plotly::len_(char *i)
AndyA 0:96532c59670f 386 {
AndyA 0:96532c59670f 387 return strlen(i);
AndyA 0:96532c59670f 388 }
AndyA 0:96532c59670f 389 void plotly::plot(unsigned long x, int y, char *token)
AndyA 0:96532c59670f 390 {
AndyA 2:d53d74ed68ac 391 if (!initalised)
AndyA 2:d53d74ed68ac 392 return;
AndyA 2:d53d74ed68ac 393
AndyA 0:96532c59670f 394 reconnectStream();
AndyA 2:d53d74ed68ac 395
AndyA 2:d53d74ed68ac 396 // int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %d, \"streamtoken\": \"%s\"}\n", x,y,token);
AndyA 2:d53d74ed68ac 397 // len = snprintf(buffer,k_bufferSize,"%X\r\n{\"x\": %lu, \"y\": %d, \"streamtoken\": \"%s\"}\n\r\n",len, x,y,token);
AndyA 2:d53d74ed68ac 398 int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %d}\n", x,y);
AndyA 2:d53d74ed68ac 399 len = snprintf(buffer,k_bufferSize,"%x\r\n{\"x\": %lu, \"y\": %d}\n\r\n",len, x,y);
AndyA 2:d53d74ed68ac 400 sendFormatedText(buffer,len);
AndyA 0:96532c59670f 401 }
AndyA 0:96532c59670f 402
AndyA 0:96532c59670f 403 void plotly::plot(unsigned long x, float y, char *token)
AndyA 0:96532c59670f 404 {
AndyA 2:d53d74ed68ac 405 if (!initalised)
AndyA 2:d53d74ed68ac 406 return;
AndyA 2:d53d74ed68ac 407
AndyA 0:96532c59670f 408 reconnectStream();
AndyA 0:96532c59670f 409
AndyA 2:d53d74ed68ac 410 int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %.3f}\n", x,y);
AndyA 2:d53d74ed68ac 411 len = snprintf(buffer,k_bufferSize,"%x\r\n{\"x\": %lu, \"y\": %.3f}\n\r\n",len, x,y);
AndyA 2:d53d74ed68ac 412 // int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %.3f, \"streamtoken\": \"%s\"}\n", x,y,token);
AndyA 2:d53d74ed68ac 413 // len = snprintf(buffer,k_bufferSize,"%X\r\n{\"x\": %lu, \"y\": %.3f, \"streamtoken\": \"%s\"}\n\r\n",len, x,y,token);
AndyA 2:d53d74ed68ac 414 sendFormatedText(buffer,len);
AndyA 0:96532c59670f 415 }
AndyA 0:96532c59670f 416
AndyA 1:d532e96fca12 417 bool plotly::print_(int d)
AndyA 0:96532c59670f 418 {
AndyA 2:d53d74ed68ac 419 int32_t len = snprintf(buffer,k_bufferSize,"%d",d);
AndyA 2:d53d74ed68ac 420 return sendFormatedText(buffer,len);
AndyA 2:d53d74ed68ac 421 }
AndyA 1:d532e96fca12 422
AndyA 1:d532e96fca12 423 bool plotly::print_(unsigned long d)
AndyA 0:96532c59670f 424 {
AndyA 2:d53d74ed68ac 425 int32_t len = snprintf(buffer,k_bufferSize,"%lu",d);
AndyA 2:d53d74ed68ac 426 return sendFormatedText(buffer,len);
AndyA 2:d53d74ed68ac 427 }
AndyA 2:d53d74ed68ac 428
AndyA 2:d53d74ed68ac 429 bool plotly::print_(float d)
AndyA 2:d53d74ed68ac 430 {
AndyA 2:d53d74ed68ac 431 int32_t len = snprintf(buffer,k_bufferSize,"%f",d);
AndyA 2:d53d74ed68ac 432 return sendFormatedText(buffer,len);
AndyA 2:d53d74ed68ac 433 }
AndyA 2:d53d74ed68ac 434
AndyA 2:d53d74ed68ac 435 bool plotly::print_(char *d)
AndyA 2:d53d74ed68ac 436 {
AndyA 2:d53d74ed68ac 437 int32_t len = snprintf(buffer,k_bufferSize,"%s",d);
AndyA 2:d53d74ed68ac 438 return sendFormatedText(buffer,len);
AndyA 2:d53d74ed68ac 439 }
AndyA 2:d53d74ed68ac 440
AndyA 2:d53d74ed68ac 441 bool plotly::printHex_(uint16_t d)
AndyA 2:d53d74ed68ac 442 {
AndyA 2:d53d74ed68ac 443 int32_t len = snprintf(buffer,k_bufferSize,"%X",d);
AndyA 2:d53d74ed68ac 444 return sendFormatedText(buffer,len);
AndyA 2:d53d74ed68ac 445 }
AndyA 2:d53d74ed68ac 446
AndyA 2:d53d74ed68ac 447 bool plotly::sendFormatedText(char* data, int size)
AndyA 2:d53d74ed68ac 448 {
AndyA 2:d53d74ed68ac 449 if(log_level < 2) {
AndyA 2:d53d74ed68ac 450 fprintf(stderr,"%s",data);
AndyA 2:d53d74ed68ac 451 }
AndyA 1:d532e96fca12 452 if(!dry_run) {
AndyA 2:d53d74ed68ac 453 if (!socket) {
AndyA 2:d53d74ed68ac 454 fprintf(stderr,"\nTX failed, No network socket exists\n");
AndyA 2:d53d74ed68ac 455 return false;
AndyA 2:d53d74ed68ac 456 }
AndyA 2:d53d74ed68ac 457 if (!(socket->is_connected())) {
AndyA 2:d53d74ed68ac 458 fprintf(stderr,"\nTX failed, Network socket not connected\n");
AndyA 2:d53d74ed68ac 459 return false;
AndyA 2:d53d74ed68ac 460 }
AndyA 2:d53d74ed68ac 461
AndyA 2:d53d74ed68ac 462 int32_t sent = socket->send_all(data,size);
AndyA 2:d53d74ed68ac 463 if (sent == size)
AndyA 1:d532e96fca12 464 return true;
AndyA 1:d532e96fca12 465 else {
AndyA 2:d53d74ed68ac 466 fprintf(stderr,"\nTX failed to send _%s_ Sent %d of %d bytes\n",data,sent,size);
AndyA 2:d53d74ed68ac 467 echoRxData();
AndyA 1:d532e96fca12 468 return false;
AndyA 1:d532e96fca12 469 }
AndyA 1:d532e96fca12 470 } else
AndyA 1:d532e96fca12 471 return true;
AndyA 0:96532c59670f 472 }
AndyA 0:96532c59670f 473
AndyA 2:d53d74ed68ac 474 void plotly::echoRxData()
AndyA 0:96532c59670f 475 {
AndyA 2:d53d74ed68ac 476
AndyA 2:d53d74ed68ac 477 int32_t dataIn = socket->receive(buffer,k_bufferSize -1);
AndyA 2:d53d74ed68ac 478 if (dataIn < 0) {
AndyA 2:d53d74ed68ac 479 if (socket->is_connected()) {
AndyA 2:d53d74ed68ac 480 fprintf(stderr,"error reading network socket. Closing it\n");
AndyA 2:d53d74ed68ac 481 socket->close();
AndyA 2:d53d74ed68ac 482 delete socket;
AndyA 2:d53d74ed68ac 483 socket = NULL;
AndyA 2:d53d74ed68ac 484 }
AndyA 1:d532e96fca12 485 else {
AndyA 2:d53d74ed68ac 486 fprintf(stderr,"error reading network socket, socket isn't connected\n");
AndyA 2:d53d74ed68ac 487 delete socket;
AndyA 2:d53d74ed68ac 488 socket = NULL;
AndyA 2:d53d74ed68ac 489 }
AndyA 2:d53d74ed68ac 490 }
AndyA 2:d53d74ed68ac 491 if(dataIn > 0) {
AndyA 2:d53d74ed68ac 492 buffer[dataIn]=0;
AndyA 2:d53d74ed68ac 493 fprintf(stderr,"Rx Data __");
AndyA 2:d53d74ed68ac 494 fprintf(stderr,buffer);
AndyA 2:d53d74ed68ac 495 fprintf(stderr,"__\n");
AndyA 2:d53d74ed68ac 496 }
AndyA 2:d53d74ed68ac 497
AndyA 2:d53d74ed68ac 498 }