/* execute download ------------------------------------------------------------ * execute download * args : gtime_t ts,te I time start and end * double tint I time interval (s) * int seqnos I sequence number start * int seqnoe I sequence number end * url_t *urls I url address list * int nurl I number of urls * char **stas I station list * int nsta I number of stations * char *dir I local directory * char *remote_p I previous remote file path * char *usr I login user for ftp * char *pwd I login password for ftp * char *proxy I proxy server address * int opts I download options (or of the followings) * DLOPT_FORCE = force download existing file * DLOPT_KEEPCMP=keep compressed file * DLOPT_HOLDERR=hold on error file * DLOPT_HOLDLST=hold on listing file * char *msg O output messages * FILE *fp IO log file pointer (NULL: no output log) * return : status (1:ok,0:error,-1:aborted) * notes : urls should be read by using dl_readurl() *-----------------------------------------------------------------------------*/ extern int dl_exec(gtime_t ts, gtime_t te, double ti, int seqnos, int seqnoe, const url_t *urls, int nurl, char **stas, int nsta, const char *dir, const char *usr, const char *pwd, const char *proxy, int opts, char *msg, FILE *fp) { paths_t paths={0}; gtime_t ts_p={0}; char str[2048],remot_p[1024]=""; int i,n[4]={0}; unsigned int tick=tickget(); showmsg("STAT=_"); /* generate download paths */ while (timediff(ts,te)<1E-3) { for (i=0;i<nurl;i++) { if (!gen_paths(ts,ts_p,seqnos,seqnoe,urls+i,stas,nsta,dir,&paths)) { free_path(&paths); return 0; } } ts_p=ts; ts=timeadd(ts,ti); } /* compact download paths */ compact_paths(&paths); if (paths.n<=0) { sprintf(msg,"no download data"); return 0; } for (i=0;i<paths.n;i++) { sprintf(str,"%s->%s (%d/%d)",paths.path[i].remot,paths.path[i].local,i+1, paths.n); if (showmsg(str)) break; /* execute download */ if (exec_down(paths.path+i,remot_p,usr,pwd,proxy,opts,n,fp)) { break; } } if (!(opts&DLOPT_HOLDLST)) { remove(FTP_LISTING); } sprintf(msg,"OK=%d No_File=%d Skip=%d Error=%d (Time=%.1f s)",n[0],n[1],n[2], n[3],(tickget()-tick)*0.001); free_path(&paths); return 1; }
void onDraw(int loops, SkCanvas* canvas) override { bool sizeChanged = false; if (canvas->getBaseLayerSize() != fSize) { fSize = canvas->getBaseLayerSize(); sizeChanged = true; } SkScalar ySpread = SkIntToScalar(fSize.fHeight / 20); SkScalar height = SkIntToScalar(fSize.fHeight); if (sizeChanged) { int dataPointCount = SkMax32(fSize.fWidth / kPixelsPerTick + 1, 2); SkRandom random; for (int i = 0; i < kNumGraphs; ++i) { SkScalar y = (kNumGraphs - i) * (height - ySpread) / (kNumGraphs + 1); fData[i].reset(); gen_data(y, ySpread, dataPointCount, &random, fData + i); } } SkRandom colorRand; SkColor colors[kNumGraphs]; for (int i = 0; i < kNumGraphs; ++i) { colors[i] = colorRand.nextU() | 0xff000000; } for (int frame = 0; frame < loops; ++frame) { canvas->clear(0xFFE0F0E0); SkPath plotPath; SkPath fillPath; static const SkScalar kStrokeWidth = SkIntToScalar(2); SkPaint plotPaint; SkPaint fillPaint; plotPaint.setAntiAlias(fAA); plotPaint.setStyle(SkPaint::kStroke_Style); plotPaint.setStrokeWidth(kStrokeWidth); plotPaint.setStrokeCap(SkPaint::kRound_Cap); plotPaint.setStrokeJoin(SkPaint::kRound_Join); fillPaint.setAntiAlias(fAA); fillPaint.setStyle(SkPaint::kFill_Style); SkTDArray<SkScalar>* prevData = nullptr; for (int i = 0; i < kNumGraphs; ++i) { gen_paths(fData[i], prevData, height, 0, SkIntToScalar(kPixelsPerTick), fShift, &plotPath, &fillPath); // Make the fills partially transparent fillPaint.setColor((colors[i] & 0x00ffffff) | 0x80000000); canvas->drawPath(fillPath, fillPaint); plotPaint.setColor(colors[i]); canvas->drawPath(plotPath, plotPaint); prevData = fData + i; } fShift += kShiftPerFrame; } }