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:
Tue Jul 29 13:30:31 2014 +0000
Revision:
7:9409a72ab6c0
Parent:
5:fc8eefeb301b
Parent:
6:e57d6e9313f4
Child:
8:d4f705ba2ea5
Mid merge;

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 3:967be3d46701 4 #define plotlyURL "plot.ly"
AndyA 0:96532c59670f 5 #define dataURL "arduino.plot.ly"
AndyA 0:96532c59670f 6
AndyA 7:9409a72ab6c0 7 plotly::plotly(const char *username, const char *api_key, const char** stream_tokens, const char *filename, int nTraces)
AndyA 0:96532c59670f 8 {
AndyA 4:33006c37c633 9 log_level = 3; // 0 = Debugging, 1 = Informational, 2 = Status, 3 = Errors, 4 = Quiet (// Serial Off)
AndyA 0:96532c59670f 10 dry_run = false;
AndyA 0:96532c59670f 11 username_ = username;
AndyA 0:96532c59670f 12 api_key_ = api_key;
AndyA 7:9409a72ab6c0 13 stream_tokens = stream_tokens;
AndyA 0:96532c59670f 14 filename_ = filename;
AndyA 0:96532c59670f 15 maxpoints = 30;
AndyA 0:96532c59670f 16 world_readable = true;
AndyA 6:e57d6e9313f4 17 convertTimestamp = false;
AndyA 0:96532c59670f 18 timezone = "America/Montreal";
AndyA 0:96532c59670f 19 fileopt = "overwrite";
AndyA 1:d532e96fca12 20
AndyA 7:9409a72ab6c0 21 nTraces_ = nTraces;
AndyA 4:33006c37c633 22
AndyA 7:9409a72ab6c0 23 sockets = (TCPSocketConnection **)malloc(sizeof(TCPSocketConnection *) * nTraces_);
AndyA 7:9409a72ab6c0 24 for (int i = 0; i< nTraces_; i++) {
AndyA 6:e57d6e9313f4 25 *(sockets+i) = NULL;
AndyA 6:e57d6e9313f4 26 }
AndyA 1:d532e96fca12 27 initalised = false;
AndyA 7:9409a72ab6c0 28
AndyA 0:96532c59670f 29 }
AndyA 0:96532c59670f 30
AndyA 0:96532c59670f 31
AndyA 1:d532e96fca12 32 plotly::~plotly()
AndyA 1:d532e96fca12 33 {
AndyA 6:e57d6e9313f4 34 closeStreams();
AndyA 6:e57d6e9313f4 35 if (sockets)
AndyA 6:e57d6e9313f4 36 free(sockets);
AndyA 1:d532e96fca12 37 }
AndyA 0:96532c59670f 38
AndyA 4:33006c37c633 39
AndyA 0:96532c59670f 40 bool plotly::init()
AndyA 0:96532c59670f 41 {
AndyA 0:96532c59670f 42
AndyA 7:9409a72ab6c0 43 fprintf(stderr,"%d tokens\n",nTraces_);
AndyA 7:9409a72ab6c0 44 wait(1);
AndyA 7:9409a72ab6c0 45 for (int i = 0; i<nTraces_; i++) {
AndyA 7:9409a72ab6c0 46 fprintf(stderr,"%s\n",*(stream_tokens_+i));
AndyA 7:9409a72ab6c0 47 wait(1);
AndyA 7:9409a72ab6c0 48 }
AndyA 7:9409a72ab6c0 49
AndyA 0:96532c59670f 50 //
AndyA 4:33006c37c633 51 // Create plot with a REST post to plotly
AndyA 4:33006c37c633 52 // See the clientresp section of https://plot.ly/rest/ for details
AndyA 0:96532c59670f 53 //
AndyA 0:96532c59670f 54 if(dry_run && log_level < 3) {
AndyA 0:96532c59670f 55 fprintf(stderr,"... This is a dry run, we are not connecting to plotly's servers...\n");
AndyA 0:96532c59670f 56 } else if(log_level < 3) {
AndyA 0:96532c59670f 57 fprintf(stderr,"... Attempting to connect to plotly's REST servers\n");
AndyA 0:96532c59670f 58 }
AndyA 0:96532c59670f 59
AndyA 2:d53d74ed68ac 60 if (!dry_run) {
AndyA 4:33006c37c633 61 int pause = 1;
AndyA 6:e57d6e9313f4 62 *sockets = new TCPSocketConnection();
AndyA 6:e57d6e9313f4 63 if (!*sockets)
AndyA 6:e57d6e9313f4 64 return false;
AndyA 6:e57d6e9313f4 65 while ((*sockets)->connect(plotlyURL, 80) < 0) {
AndyA 4:33006c37c633 66 if (pause > 30) {
AndyA 4:33006c37c633 67 fprintf(stderr,"Failed to connect. :-(\n");
AndyA 7:9409a72ab6c0 68 delete (*sockets);
AndyA 4:33006c37c633 69 return false;
AndyA 4:33006c37c633 70 }
AndyA 0:96532c59670f 71 fprintf(stderr,"... Couldn\'t connect to plotly's REST servers... trying again!\n");
AndyA 4:33006c37c633 72 wait(pause);
AndyA 4:33006c37c633 73 pause *= 2;
AndyA 0:96532c59670f 74 }
AndyA 2:d53d74ed68ac 75 }
AndyA 1:d532e96fca12 76
AndyA 1:d532e96fca12 77 if(log_level < 3) fprintf(stderr,"... Connected to plotly's REST servers\n");
AndyA 2:d53d74ed68ac 78
AndyA 1:d532e96fca12 79 if(log_level < 3) fprintf(stderr,"... Sending HTTP Post to plotly\n");
AndyA 2:d53d74ed68ac 80
AndyA 0:96532c59670f 81 print_("POST /clientresp HTTP/1.1\r\n");
AndyA 0:96532c59670f 82 print_("Host: 107.21.214.199\r\n");
AndyA 3:967be3d46701 83 print_("User-Agent: Arduino/0.5.1\r\n");
AndyA 2:d53d74ed68ac 84 print_("plotly-streamtoken: ");
AndyA 6:e57d6e9313f4 85 for (int i = 0; i<nTraces_; i++) {
AndyA 6:e57d6e9313f4 86 print_(stream_tokens_[i]);
AndyA 6:e57d6e9313f4 87 if ( i < (nTraces_-1) )
AndyA 6:e57d6e9313f4 88 print_(",");
AndyA 6:e57d6e9313f4 89 }
AndyA 4:33006c37c633 90 printNetTerminator_();
AndyA 0:96532c59670f 91
AndyA 0:96532c59670f 92 print_("Content-Length: ");
AndyA 2:d53d74ed68ac 93
AndyA 7:9409a72ab6c0 94 unsigned long lineLen = snprintf(buffer,k_bufferSize,"version=2.3&origin=plot&platform=arduino&un=%s&key=%s&args=[",username_,api_key_);
AndyA 2:d53d74ed68ac 95 for(int i=0; i<nTraces_; i++) {
AndyA 2:d53d74ed68ac 96 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 97 }
AndyA 2:d53d74ed68ac 98 lineLen += snprintf((buffer+lineLen),k_bufferSize-lineLen,"]&kwargs={\"fileopt\": \"%s\", \"filename\": \"%s\", \"world_readable\": %s}",fileopt,filename_,world_readable?"true":"false");
AndyA 2:d53d74ed68ac 99
AndyA 2:d53d74ed68ac 100 print_(lineLen);
AndyA 4:33006c37c633 101 printNetTerminator_();
AndyA 4:33006c37c633 102 printNetTerminator_();
AndyA 6:e57d6e9313f4 103
AndyA 2:d53d74ed68ac 104 sendFormatedText(buffer,lineLen);
AndyA 6:e57d6e9313f4 105
AndyA 4:33006c37c633 106 printNetTerminator_();
AndyA 0:96532c59670f 107
AndyA 0:96532c59670f 108 //
AndyA 0:96532c59670f 109 // Wait for a response
AndyA 0:96532c59670f 110 // Parse the response for the "All Streams Go!" and proceed to streaming
AndyA 0:96532c59670f 111 // if we find it
AndyA 0:96532c59670f 112 //
AndyA 2:d53d74ed68ac 113
AndyA 0:96532c59670f 114 char allStreamsGo[] = "All Streams Go!";
AndyA 0:96532c59670f 115 int asgCnt = 0; // asg stands for All Streams Go
AndyA 0:96532c59670f 116 char url[] = "\"url\": \"http://107.21.214.199/~";
AndyA 0:96532c59670f 117 char fid[4];
AndyA 0:96532c59670f 118 int fidCnt = 0;
AndyA 0:96532c59670f 119 int urlCnt = 0;
AndyA 0:96532c59670f 120 int usernameCnt = 0;
AndyA 0:96532c59670f 121 bool proceed = false;
AndyA 0:96532c59670f 122 bool fidMatched = false;
AndyA 0:96532c59670f 123 char c;
AndyA 0:96532c59670f 124
AndyA 0:96532c59670f 125 if(log_level < 2) {
AndyA 0:96532c59670f 126 fprintf(stderr,"... Sent message, waiting for plotly's response...\n");
AndyA 0:96532c59670f 127 }
AndyA 0:96532c59670f 128
AndyA 0:96532c59670f 129 if(!dry_run) {
AndyA 0:96532c59670f 130 while(!proceed) {
AndyA 6:e57d6e9313f4 131 int32_t dataIn = (*sockets)->receive(buffer,k_bufferSize -1);
AndyA 1:d532e96fca12 132 if (dataIn < 0) {
AndyA 1:d532e96fca12 133 if(log_level < 3) fprintf(stderr,"error reading network socket\n");
AndyA 1:d532e96fca12 134 break;
AndyA 1:d532e96fca12 135 }
AndyA 0:96532c59670f 136 if(dataIn > 0) {
AndyA 2:d53d74ed68ac 137 buffer[dataIn]=0;
AndyA 0:96532c59670f 138
AndyA 2:d53d74ed68ac 139 if(log_level < 2) fprintf(stderr,buffer);
AndyA 0:96532c59670f 140
AndyA 0:96532c59670f 141 for (int i = 0; i<dataIn; i++) {
AndyA 2:d53d74ed68ac 142 c = buffer[i];
AndyA 0:96532c59670f 143 //
AndyA 0:96532c59670f 144 // Attempt to read the "All streams go" msg if it exists
AndyA 0:96532c59670f 145 // by comparing characters as they roll in
AndyA 0:96532c59670f 146 //
AndyA 0:96532c59670f 147
AndyA 6:e57d6e9313f4 148 if(asgCnt == strlen(allStreamsGo) && !proceed) {
AndyA 0:96532c59670f 149 proceed = true;
AndyA 0:96532c59670f 150 } else if(allStreamsGo[asgCnt]==c) {
AndyA 0:96532c59670f 151 asgCnt += 1;
AndyA 0:96532c59670f 152 } else if(asgCnt > 0) {
AndyA 0:96532c59670f 153 // reset counter
AndyA 0:96532c59670f 154 asgCnt = 0;
AndyA 0:96532c59670f 155 }
AndyA 0:96532c59670f 156
AndyA 0:96532c59670f 157 //
AndyA 0:96532c59670f 158 // Extract the last bit of the URL from the response
AndyA 0:96532c59670f 159 // The url is in the form http://107.21.214.199/~USERNAME/FID
AndyA 0:96532c59670f 160 // We'll character-count up through char url[] and through username_, then start
AndyA 0:96532c59670f 161 // filling in characters into fid
AndyA 0:96532c59670f 162 //
AndyA 0:96532c59670f 163
AndyA 0:96532c59670f 164 if(log_level < 3) {
AndyA 6:e57d6e9313f4 165 if(url[urlCnt]==c && urlCnt < strlen(url)) {
AndyA 0:96532c59670f 166 urlCnt += 1;
AndyA 6:e57d6e9313f4 167 } else if(urlCnt > 0 && urlCnt < strlen(url)) {
AndyA 0:96532c59670f 168 // Reset counter
AndyA 0:96532c59670f 169 urlCnt = 0;
AndyA 0:96532c59670f 170 }
AndyA 6:e57d6e9313f4 171 if(urlCnt == strlen(url) && fidCnt < 4 && !fidMatched) {
AndyA 0:96532c59670f 172 // We've counted through the url, start counting through the username
AndyA 6:e57d6e9313f4 173 if(usernameCnt < strlen(username_)+2) {
AndyA 0:96532c59670f 174 usernameCnt += 1;
AndyA 0:96532c59670f 175 } else {
AndyA 0:96532c59670f 176 // the url ends with "
AndyA 0:96532c59670f 177 if(c != '"') {
AndyA 0:96532c59670f 178 fid[fidCnt] = c;
AndyA 0:96532c59670f 179 fidCnt += 1;
AndyA 0:96532c59670f 180 } else if(fidCnt>0) {
AndyA 0:96532c59670f 181 fidMatched = true;
AndyA 0:96532c59670f 182 }
AndyA 0:96532c59670f 183
AndyA 0:96532c59670f 184 }
AndyA 0:96532c59670f 185 }
AndyA 0:96532c59670f 186 }
AndyA 0:96532c59670f 187 }
AndyA 0:96532c59670f 188 }
AndyA 0:96532c59670f 189 wait(0.1);
AndyA 0:96532c59670f 190 }
AndyA 0:96532c59670f 191 }
AndyA 0:96532c59670f 192
AndyA 0:96532c59670f 193 if(!dry_run && !proceed && log_level < 4) {
AndyA 7:9409a72ab6c0 194 fprintf(stderr,"... Error initializing stream, aborting.\n");
AndyA 0:96532c59670f 195 }
AndyA 0:96532c59670f 196
AndyA 0:96532c59670f 197 if(!dry_run && proceed && log_level < 3) {
AndyA 0:96532c59670f 198 fprintf(stderr,"... A-ok from plotly, All Streams Go!\n");
AndyA 0:96532c59670f 199 if(fidMatched) {
AndyA 0:96532c59670f 200 fprintf(stderr,"... View your streaming plot here: https://plot.ly/~");
AndyA 0:96532c59670f 201 fprintf(stderr,username_);
AndyA 0:96532c59670f 202 fprintf(stderr,"/");
AndyA 0:96532c59670f 203 for(int i=0; i<fidCnt; i++) {
AndyA 4:33006c37c633 204 fprintf(stderr,"%c",fid[i]);
AndyA 0:96532c59670f 205 }
AndyA 0:96532c59670f 206 fprintf(stderr,"\n");
AndyA 0:96532c59670f 207 }
AndyA 0:96532c59670f 208 }
AndyA 2:d53d74ed68ac 209
AndyA 2:d53d74ed68ac 210 if (proceed || dry_run) {
AndyA 6:e57d6e9313f4 211 initalised = true;
AndyA 2:d53d74ed68ac 212 }
AndyA 6:e57d6e9313f4 213 if (*sockets) {
AndyA 6:e57d6e9313f4 214 delete *sockets;
AndyA 6:e57d6e9313f4 215 *sockets=NULL;
AndyA 6:e57d6e9313f4 216 }
AndyA 2:d53d74ed68ac 217 return initalised;
AndyA 0:96532c59670f 218 }
AndyA 0:96532c59670f 219
AndyA 6:e57d6e9313f4 220 void plotly::openStreams()
AndyA 6:e57d6e9313f4 221 {
AndyA 6:e57d6e9313f4 222 for (int i = 0; i< nTraces_; i++) {
AndyA 6:e57d6e9313f4 223 openStream(i);
AndyA 6:e57d6e9313f4 224 }
AndyA 6:e57d6e9313f4 225 }
AndyA 6:e57d6e9313f4 226
AndyA 6:e57d6e9313f4 227 void plotly::closeStreams()
AndyA 0:96532c59670f 228 {
AndyA 6:e57d6e9313f4 229 for (int i = 0; i< nTraces_; i++) {
AndyA 6:e57d6e9313f4 230 closeStream(i);
AndyA 6:e57d6e9313f4 231 }
AndyA 6:e57d6e9313f4 232 }
AndyA 6:e57d6e9313f4 233
AndyA 6:e57d6e9313f4 234
AndyA 7:9409a72ab6c0 235 bool plotly::openStream(int stream)
AndyA 6:e57d6e9313f4 236 {
AndyA 6:e57d6e9313f4 237
AndyA 6:e57d6e9313f4 238 if (stream >= nTraces_)
AndyA 7:9409a72ab6c0 239 return false;
AndyA 1:d532e96fca12 240
AndyA 1:d532e96fca12 241 if (!initalised)
AndyA 4:33006c37c633 242 return false;
AndyA 4:33006c37c633 243
AndyA 0:96532c59670f 244 //
AndyA 0:96532c59670f 245 // Start request to stream servers
AndyA 0:96532c59670f 246 //
AndyA 2:d53d74ed68ac 247
AndyA 6:e57d6e9313f4 248 if (*(sockets+stream) != NULL) {
AndyA 6:e57d6e9313f4 249 delete *(sockets+stream);
AndyA 6:e57d6e9313f4 250 *(sockets+stream) = NULL;
AndyA 6:e57d6e9313f4 251 }
AndyA 2:d53d74ed68ac 252
AndyA 2:d53d74ed68ac 253 if(log_level < 3) fprintf(stderr,"... Connecting to plotly's streaming servers...\n");
AndyA 2:d53d74ed68ac 254
AndyA 6:e57d6e9313f4 255 if (!dry_run) {
AndyA 4:33006c37c633 256 int pause = 1;
AndyA 6:e57d6e9313f4 257 *(sockets + stream) = new TCPSocketConnection();
AndyA 6:e57d6e9313f4 258 while ((*(sockets + stream))->connect(dataURL, 80) < 0) {
AndyA 4:33006c37c633 259 if (pause > 30) {
AndyA 4:33006c37c633 260 fprintf(stderr,"Failed to connect. :-(\n");
AndyA 7:9409a72ab6c0 261 delete *(sockets + stream);
AndyA 4:33006c37c633 262 return false;
AndyA 4:33006c37c633 263 }
AndyA 4:33006c37c633 264 fprintf(stderr,"... Couldn\'t connect to plotly's REST servers... trying again!\n");
AndyA 4:33006c37c633 265 wait(pause);
AndyA 4:33006c37c633 266 pause *= 2;
AndyA 2:d53d74ed68ac 267 }
AndyA 0:96532c59670f 268 }
AndyA 2:d53d74ed68ac 269
AndyA 4:33006c37c633 270
AndyA 6:e57d6e9313f4 271 if(log_level < 3) fprintf(stderr,"... Connected to plotly's streaming servers\n... Initializing stream %d\n",stream);
AndyA 0:96532c59670f 272
AndyA 6:e57d6e9313f4 273 print_("POST / HTTP/1.1\r\n",stream);
AndyA 6:e57d6e9313f4 274 print_("Host: arduino.plot.ly\r\n",stream);
AndyA 6:e57d6e9313f4 275 print_("User-Agent: Python\r\n",stream);
AndyA 6:e57d6e9313f4 276 print_("Transfer-Encoding: chunked\r\n",stream);
AndyA 6:e57d6e9313f4 277 print_("Connection: close\r\n",stream);
AndyA 6:e57d6e9313f4 278 print_("plotly-streamtoken: ",stream);
AndyA 6:e57d6e9313f4 279 print_(stream_tokens_[stream],stream);
AndyA 7:9409a72ab6c0 280 printNetTerminator_(stream);
AndyA 6:e57d6e9313f4 281 if(convertTimestamp) {
AndyA 7:9409a72ab6c0 282 print_("plotly-convertTimestamp: \"",stream);
AndyA 7:9409a72ab6c0 283 print_(timezone,stream);
AndyA 7:9409a72ab6c0 284 print_("\"",stream);
AndyA 7:9409a72ab6c0 285 printNetTerminator_(stream);
AndyA 6:e57d6e9313f4 286 }
AndyA 7:9409a72ab6c0 287 printNetTerminator_(stream);
AndyA 0:96532c59670f 288
AndyA 1:d532e96fca12 289 if(log_level < 3) fprintf(stderr,"... Done initializing, ready to stream!\n");
AndyA 4:33006c37c633 290 return true;
AndyA 0:96532c59670f 291 }
AndyA 0:96532c59670f 292
AndyA 6:e57d6e9313f4 293 void plotly::closeStream( int stream)
AndyA 0:96532c59670f 294 {
AndyA 6:e57d6e9313f4 295 if (stream >= nTraces_)
AndyA 6:e57d6e9313f4 296 return;
AndyA 6:e57d6e9313f4 297
AndyA 6:e57d6e9313f4 298 if (*(sockets+stream) != NULL) {
AndyA 6:e57d6e9313f4 299 if ((*(sockets+stream))->is_connected()) {
AndyA 6:e57d6e9313f4 300 print_("0\r\n\r\n",stream);
AndyA 6:e57d6e9313f4 301 (*(sockets+stream))->close();
AndyA 2:d53d74ed68ac 302 }
AndyA 6:e57d6e9313f4 303 delete *(sockets+stream);
AndyA 6:e57d6e9313f4 304 *(sockets+stream)=NULL;
AndyA 0:96532c59670f 305 }
AndyA 0:96532c59670f 306 }
AndyA 2:d53d74ed68ac 307
AndyA 6:e57d6e9313f4 308 void plotly::reconnectStream(int number)
AndyA 0:96532c59670f 309 {
AndyA 6:e57d6e9313f4 310 while(!dry_run && (!(*(sockets+number)) || !(*(sockets+number))->is_connected())) {
AndyA 6:e57d6e9313f4 311 if(log_level<4) fprintf(stderr,"... Disconnected from streaming servers\n");
AndyA 6:e57d6e9313f4 312 closeStream(number);
AndyA 6:e57d6e9313f4 313 openStream(number);
AndyA 6:e57d6e9313f4 314 }
AndyA 0:96532c59670f 315 }
AndyA 0:96532c59670f 316
AndyA 6:e57d6e9313f4 317
AndyA 6:e57d6e9313f4 318 void plotly::plot(unsigned long x, int y, int stream)
AndyA 0:96532c59670f 319 {
AndyA 6:e57d6e9313f4 320 if (!initalised)
AndyA 6:e57d6e9313f4 321 return;
AndyA 6:e57d6e9313f4 322
AndyA 6:e57d6e9313f4 323 reconnectStream(stream);
AndyA 6:e57d6e9313f4 324
AndyA 4:33006c37c633 325 // need to prefix with the length so print it once to get the content lenght and then a second time with the prefix.
AndyA 6:e57d6e9313f4 326 int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %d}\n", x,y);
AndyA 6:e57d6e9313f4 327 len = snprintf(buffer,k_bufferSize,"%x\r\n{\"x\": %lu, \"y\": %d}\n\r\n",len, x,y);
AndyA 6:e57d6e9313f4 328 sendFormatedText(buffer,len,stream);
AndyA 0:96532c59670f 329 }
AndyA 6:e57d6e9313f4 330
AndyA 6:e57d6e9313f4 331 void plotly::plot(unsigned long x, float y, int stream)
AndyA 0:96532c59670f 332 {
AndyA 2:d53d74ed68ac 333 if (!initalised)
AndyA 2:d53d74ed68ac 334 return;
AndyA 2:d53d74ed68ac 335
AndyA 6:e57d6e9313f4 336 reconnectStream(stream);
AndyA 2:d53d74ed68ac 337
AndyA 4:33006c37c633 338 // need to prefix with the length so print it once to get the content lenght and then a second time with the prefix.
AndyA 6:e57d6e9313f4 339 int len = snprintf(buffer,k_bufferSize,"{\"x\": %lu, \"y\": %.3f}\n", x,y);
AndyA 6:e57d6e9313f4 340 len = snprintf(buffer,k_bufferSize,"%x\r\n{\"x\": %lu, \"y\": %.3f}\n\r\n",len, x,y);
AndyA 6:e57d6e9313f4 341 sendFormatedText(buffer,len,stream);
AndyA 0:96532c59670f 342 }
AndyA 0:96532c59670f 343
AndyA 6:e57d6e9313f4 344 void plotly::plot(float x, float y, int stream)
AndyA 0:96532c59670f 345 {
AndyA 2:d53d74ed68ac 346 if (!initalised)
AndyA 2:d53d74ed68ac 347 return;
AndyA 2:d53d74ed68ac 348
AndyA 6:e57d6e9313f4 349 reconnectStream(stream);
AndyA 5:fc8eefeb301b 350 // need to prefix with the length so print it once to get the content lenght and then a second time with the prefix.
AndyA 6:e57d6e9313f4 351 int len = snprintf(buffer,k_bufferSize,"{\"x\": %.3f, \"y\": %.3f}\n", x,y);
AndyA 6:e57d6e9313f4 352 len = snprintf(buffer,k_bufferSize,"%x\r\n{\"x\": %.3f, \"y\": %.3f}\n\r\n",len, x,y);
AndyA 6:e57d6e9313f4 353 sendFormatedText(buffer,len,stream);
AndyA 0:96532c59670f 354 }
AndyA 0:96532c59670f 355
AndyA 6:e57d6e9313f4 356
AndyA 6:e57d6e9313f4 357 bool plotly::print_(int d, int stream)
AndyA 0:96532c59670f 358 {
AndyA 4:33006c37c633 359 char smallBuffer[10];
AndyA 4:33006c37c633 360 int32_t len = snprintf(smallBuffer,10,"%d",d);
AndyA 7:9409a72ab6c0 361 return sendFormatedText(smallBuffer,len,stream);
AndyA 2:d53d74ed68ac 362 }
AndyA 1:d532e96fca12 363
AndyA 6:e57d6e9313f4 364 bool plotly::print_(unsigned long d, int stream)
AndyA 0:96532c59670f 365 {
AndyA 4:33006c37c633 366 char smallBuffer[12];
AndyA 4:33006c37c633 367 int32_t len = snprintf(smallBuffer,12,"%lu",d);
AndyA 7:9409a72ab6c0 368 return sendFormatedText(smallBuffer,len,stream);
AndyA 2:d53d74ed68ac 369 }
AndyA 2:d53d74ed68ac 370
AndyA 6:e57d6e9313f4 371 bool plotly::print_(float d, int stream)
AndyA 2:d53d74ed68ac 372 {
AndyA 4:33006c37c633 373 char smallBuffer[12];
AndyA 4:33006c37c633 374 int32_t len = snprintf(smallBuffer,12,"%f",d);
AndyA 7:9409a72ab6c0 375 return sendFormatedText(smallBuffer,len,stream);
AndyA 2:d53d74ed68ac 376 }
AndyA 2:d53d74ed68ac 377
AndyA 7:9409a72ab6c0 378 bool plotly::printNetTerminator_(int stream)
AndyA 4:33006c37c633 379 {
AndyA 7:9409a72ab6c0 380 return sendFormatedText("\r\n",2,stream);
AndyA 4:33006c37c633 381 }
AndyA 4:33006c37c633 382
AndyA 4:33006c37c633 383
AndyA 7:9409a72ab6c0 384
AndyA 7:9409a72ab6c0 385 bool plotly::print_(const char *d, int stream)// strings could be long, use the big buffer
AndyA 2:d53d74ed68ac 386 {
AndyA 2:d53d74ed68ac 387 int32_t len = snprintf(buffer,k_bufferSize,"%s",d);
AndyA 6:e57d6e9313f4 388 return sendFormatedText(buffer,len,stream);
AndyA 2:d53d74ed68ac 389 }
AndyA 2:d53d74ed68ac 390
AndyA 6:e57d6e9313f4 391 bool plotly::printHex_(uint16_t d, int stream)
AndyA 2:d53d74ed68ac 392 {
AndyA 2:d53d74ed68ac 393 int32_t len = snprintf(buffer,k_bufferSize,"%X",d);
AndyA 6:e57d6e9313f4 394 return sendFormatedText(buffer,len,stream);
AndyA 2:d53d74ed68ac 395 }
AndyA 2:d53d74ed68ac 396
AndyA 6:e57d6e9313f4 397 bool plotly::sendFormatedText(char* data, int size, int stream)
AndyA 2:d53d74ed68ac 398 {
AndyA 2:d53d74ed68ac 399 if(log_level < 2) {
AndyA 2:d53d74ed68ac 400 fprintf(stderr,"%s",data);
AndyA 2:d53d74ed68ac 401 }
AndyA 1:d532e96fca12 402 if(!dry_run) {
AndyA 6:e57d6e9313f4 403 if (!*(sockets+stream)) {
AndyA 2:d53d74ed68ac 404 fprintf(stderr,"\nTX failed, No network socket exists\n");
AndyA 2:d53d74ed68ac 405 return false;
AndyA 6:e57d6e9313f4 406 }
AndyA 6:e57d6e9313f4 407 if (!((*(sockets+stream))->is_connected())) {
AndyA 2:d53d74ed68ac 408 fprintf(stderr,"\nTX failed, Network socket not connected\n");
AndyA 6:e57d6e9313f4 409 return false;
AndyA 6:e57d6e9313f4 410 }
AndyA 6:e57d6e9313f4 411
AndyA 6:e57d6e9313f4 412 int32_t sent = (*(sockets+stream))->send_all(data,size);
AndyA 2:d53d74ed68ac 413 if (sent == size)
AndyA 1:d532e96fca12 414 return true;
AndyA 1:d532e96fca12 415 else {
AndyA 2:d53d74ed68ac 416 fprintf(stderr,"\nTX failed to send _%s_ Sent %d of %d bytes\n",data,sent,size);
AndyA 1:d532e96fca12 417 return false;
AndyA 1:d532e96fca12 418 }
AndyA 1:d532e96fca12 419 } else
AndyA 1:d532e96fca12 420 return true;
AndyA 0:96532c59670f 421 }
AndyA 0:96532c59670f 422