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
Mid merge;

Who changed what in which revision?

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