From b72013268abb25758a6de0135b40c44ac551b3d1 Mon Sep 17 00:00:00 2001 From: dapgo Date: Fri, 23 Dec 2022 13:13:00 +0100 Subject: [PATCH] Improvements and code refactor --- apps/mixdiganclock/ChangeLog | 1 + apps/mixdiganclock/README.md | 12 +- apps/mixdiganclock/metadata.json | 6 +- apps/mixdiganclock/mixdiganclock.app.js | 220 ++++++++++++++-------- apps/mixdiganclock/mixdiganclock.info | 1 + apps/mixdiganclock/ss_mixdigan_ems2_2.png | Bin 0 -> 2976 bytes apps/mixdiganclock/ss_mixdigan_ems2_3.png | Bin 0 -> 3391 bytes apps/mixdiganclock/ss_mixdigan_ems_2.png | Bin 0 -> 4311 bytes apps/tempmonitor/CSV_IDE_view.png | Bin 0 -> 14447 bytes apps/tempmonitor/CSV_excel_view.png | Bin 0 -> 16237 bytes apps/tempmonitor/README.md | 4 + apps/tempmonitor/interface.html | 62 ++++++ apps/tempmonitor/metadata.json | 1 + apps/tempmonitor/tempmonitor.app.js | 9 +- 14 files changed, 224 insertions(+), 92 deletions(-) create mode 100644 apps/mixdiganclock/mixdiganclock.info create mode 100644 apps/mixdiganclock/ss_mixdigan_ems2_2.png create mode 100644 apps/mixdiganclock/ss_mixdigan_ems2_3.png create mode 100644 apps/mixdiganclock/ss_mixdigan_ems_2.png create mode 100644 apps/tempmonitor/CSV_IDE_view.png create mode 100644 apps/tempmonitor/CSV_excel_view.png create mode 100644 apps/tempmonitor/interface.html diff --git a/apps/mixdiganclock/ChangeLog b/apps/mixdiganclock/ChangeLog index 0263ea13d..a498d258a 100644 --- a/apps/mixdiganclock/ChangeLog +++ b/apps/mixdiganclock/ChangeLog @@ -1 +1,2 @@ 0.01: fork from miclock, Added compatib with b widgets, devices(dynamic x,y) and themes(dynamic colors) +0.02: code refactored, change colors in real time \ No newline at end of file diff --git a/apps/mixdiganclock/README.md b/apps/mixdiganclock/README.md index 8ba1cf762..a435c77db 100644 --- a/apps/mixdiganclock/README.md +++ b/apps/mixdiganclock/README.md @@ -1,6 +1,6 @@ # Mix Digital & Analog Clock A dual and simultaneous Analog and Digital Clock, also shows day, month and year. -Color are automatically set depending on the configured Theme or device +Color are automatically set depending on the configured Theme or device, bunt also change on realtime through touching the right side. Compatible with BangleJS1,BangleJS2,and EMSCRIPTENx emulators @@ -8,7 +8,7 @@ Compatible with BangleJS1,BangleJS2,and EMSCRIPTENx emulators Bangle JS1 -![](pic_mixdigan_bjs1.jpg) +![](photo_mixdigan_bjs1.jpg) Screenshot emulator BJS2 @@ -19,6 +19,14 @@ Screenshot emulator BJS1 ![](ss_mixdigan_ems.png) +SS emulator -color change +![](ss_mixdigan_ems_2.png) + +SS emulator -color change +![](ss_mixdigan_ems2_2.png) + +SS emulator -color change +![](ss_mixdigan_ems2_3.png) ## Usage diff --git a/apps/mixdiganclock/metadata.json b/apps/mixdiganclock/metadata.json index 0e77a681d..54d83df5f 100644 --- a/apps/mixdiganclock/metadata.json +++ b/apps/mixdiganclock/metadata.json @@ -1,8 +1,8 @@ { "id": "mixdiganclock", "name": "Mix Dig&Anal Clock", - "version": "0.01", - "description": "A dual Analog and Digital Clock", + "version": "0.02", + "description": "A dual Analog and Digital Clock, based in Mixed Clock, but with more compatibility, change of colors, thicker clock hands... ", "icon": "mixdiganclock.png", "type": "clock", "tags": "clock", @@ -10,7 +10,7 @@ "supports": ["BANGLEJS","BANGLEJS"], "allow_emulator": true, "storage": [ - {"name":"mixdiganclock.app.js","url":"mixdiganclock.app.js"}, + {"name":"mixdiganclock.app.js","url":"mixdiganclock.js"}, {"name":"mixdiganclock.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/mixdiganclock/mixdiganclock.app.js b/apps/mixdiganclock/mixdiganclock.app.js index e28a961b7..fe1a41432 100644 --- a/apps/mixdiganclock/mixdiganclock.app.js +++ b/apps/mixdiganclock/mixdiganclock.app.js @@ -1,53 +1,73 @@ -//fork of miclock, dynamic x,y compatible with BJS1, BJS2 and bottom widgets -/*replace g.setFontVector(height) by g.setFont("Vector", 60); -below size 20 replace g.setFontVector(13) by -g.setFont("6x8",2 or 4x6 (built into all devices */ -/* jshint esversion: 6 */ +/*fork of miclock, dynamic x,y, colors on realtime, +compatible with BJS1, BJS2 and bottom widgets +*/ var locale = require("locale"); -var v_mode_debug=1; //, 0=no, 1 min, 2 prone detail +var v_mode_debug=0; //, 0=no, 1 min, 2 prone detail var v_model=process.env.BOARD; +var LastDrawDay; // to notice a change and repaint static texts +//RGB565 0x White , black, 'Orange',blue,red, olive,... +var a_colors= [0xFFFF,0x0000, 0xFD20, 0x001F,0xF800,0x7be0,0x780F,0x07E0]; //new Array(0xFFFF +var Radius= []; //new Array(); +var TxtPosition=[]; +var v_bfont_size; +var v_vfont_size; +var v_color1; +var v_color2; +var v_color3; +var v_color_erase; +var v_count_col; +var rect = Bangle.appRect; +var v_center_x; +var v_center_y; +if (v_mode_debug>0) console.log("a_colors.length "+a_colors.length); g.clear(); //show the exit button -Bangle.setUI(); - +//Bangle.setUI(); +Bangle.setUI("clock"); //implies center button for launcher /*{ mode : "custom", - back : Bangle.showLauncher + back : Bangle.showLauncher });*/ Bangle.loadWidgets(); -// different values depending on loaded widgets or not, so after load widgets -var rect = Bangle.appRect; -var v_center_x = g.getWidth()/2; -var v_center_y = g.getHeight()/2; //vertical middle - -if (v_mode_debug>0) console.log(v_model+" center x, y "+v_center_x+" , "+v_center_y+" Max y,y2"+rect.y+" ,"+rect.y2); -var TxtPosition = { - "x1": 3, "x2": g.getWidth()-3, - "y1": rect.y+17, "y2": rect.y2-6, - "x_HH": g.getWidth()/2 ,"y_mm": v_center_y+32 - }; -//emuls EMSCRIPTEN,EMSCRIPTEN2 -if (v_model=='BANGLEJS'||v_model=='EMSCRIPTEN') { - var Radius = { "center": 7, "hour": 50, "min": 70, "dots": 88 }; - var v_bfont_size=3; - var v_vfont_size=35; - var v_color1=0xFD20; // orange - var v_color2=0x7be0; - var v_color3=0xFFFF; //white , for hands PEND replace hardcoded by logic - var v_color_erase=g.getBgColor(); //0 - }else{ - var Radius = { "center": 5, "hour": 35, "min": 50, "dots": 60 }; - var v_bfont_size=2; - var v_vfont_size=22; - var v_color1=0x001F; // blue - var v_color2=0x03E0; //darkgreen - var v_color3=0x0000; //opposite to bg, for hands PEND replace hardcoded by logic - var v_color_erase=g.getBgColor(); - } + +function setVariables() { +// different values depending on loaded widgets or not, so after load widgets + rect = Bangle.appRect; + v_center_x = g.getWidth()/2; + v_center_y = g.getHeight()/2; //vertical middle + //if (v_mode_debug>1) console.log(v_model+" center x, y "+v_center_x+" , "+v_center_y+" Max y,y2"+rect.y+" ,"+rect.y2); + TxtPosition = { + "x1": 3, "x2": g.getWidth()-3, + "y1": rect.y+17, "y2": rect.y2-6, + "x_HH": g.getWidth()/2 ,"y_mm": v_center_y+32 + }; + + //emuls EMSCRIPTEN,EMSCRIPTEN2 + v_count_col=2; //1st=0 1st compatible color (dark/light theme) + v_color_erase=g.getBgColor(); + if (v_model=='BANGLEJS'||v_model=='EMSCRIPTEN') { + Radius = { "center": 7, "hour": 50, "min": 70, "dots": 88 }; + v_bfont_size=3; + v_vfont_size=35; + v_color1=2; // orange + v_color2=4; + v_color3=0; //white , for hands PEND replace hardcoded by logic + }else{ + Radius = { "center": 5, "hour": 35, "min": 50, "dots": 60 }; + v_bfont_size=2; + v_vfont_size=22; + v_color1=3; // blue + v_color2=1; + v_color3=1; //opposite to bg, for hands PEND replace hardcoded by logic + } + if (v_mode_debug>0) console.log("set vars for: "+v_model); +} + + function rotatePoint(x, y, d) { rad = -1 * d / 180 * Math.PI; var sin = Math.sin(rad); @@ -58,17 +78,33 @@ function rotatePoint(x, y, d) { return p; } -function drawMixedClock() { - var date = new Date(); - var dateArray = date.toString().split(" "); - var isEn = locale.name.startsWith("en"); - var point = []; - var minute = date.getMinutes(); - var hour = date.getHours(); - var radius; +//no need to repaint +function drawStaticRing(){ + // draw hour and minute dots + g.setColor(a_colors[v_color1]); // orange + for (i = 0; i < 60; i++) { + radius = (i % 5) ? 2 : 4; + point = rotatePoint(0, Radius.dots, i * 6); + //if (v_mode_debug>1) console.log("point"+point); + g.fillCircle(point[0], point[1], radius); + } +} - // draw date - g.setColor(v_color2); +//no need to repaint every min +function drawDailyTxt(){ + var date = new Date(); + var isEn = locale.name.startsWith("en"); + var dateArray = date.toString().split(" "); + LastDrawDay=locale.dow(date,true); + var hour = date.getHours(); + + if (v_mode_debug>1) { + console.log("full date "+date.toString()); + console.log("locale time "+locale.time(date,true)); + console.log("LastDrawDay "+LastDrawDay); + console.log("locale new day "+(locale.dow(date,true))); + } + g.setColor(a_colors[v_color2]); //small size then bitmap g.setFont("4x6", v_bfont_size); //6x8 g.setFontAlign(-1, 0); @@ -77,23 +113,27 @@ function drawMixedClock() { g.setFontAlign(1, 0); g.drawString(isEn?locale.month(date,true):(' ' + dateArray[2]), TxtPosition.x2, TxtPosition.y1, true); g.drawString(dateArray[3], TxtPosition.x2, TxtPosition.y2, true); +} - // draw hour and minute dots - g.setColor(v_color1); // orange - for (i = 0; i < 60; i++) { - radius = (i % 5) ? 2 : 4; - point = rotatePoint(0, Radius.dots, i * 6); - g.fillCircle(point[0], point[1], radius); - } - // erase last minutes hand +function drawMixedClock() { + var date = new Date(); + var dateArray = date.toString().split(" "); + //var isEn = locale.name.startsWith("en"); + var point = []; + var minute = date.getMinutes(); + var hour = date.getHours(); + var radius; + //Call function only after a change of day + if (LastDrawDay!=locale.dow(date,true)) drawDailyTxt(); + //ERASE previous hands + // erase last MINutes hand g.setColor(v_color_erase); point = rotatePoint(0, Radius.min, (minute - 1) * 6); g.drawLine(v_center_x, v_center_y, point[0], point[1]); //to increase thicknes g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); - - // erase last two hour hands + // erase last two HOUR hands ¿2? g.setColor(v_color_erase); p = rotatePoint(0, Radius.hour, hour % 12 * 30 + (minute - 2) / 2 | 0); g.drawLine(v_center_x, v_center_y, p[0], p[1]); @@ -105,43 +145,54 @@ function drawMixedClock() { //to increase thicknes g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); - // draw digital time + // here time DIGITs are draw under hands + + // draw new MINute hand + point = rotatePoint(0, Radius.min, minute * 6); + g.setColor(a_colors[v_color3]); + g.drawLine(v_center_x, v_center_y, point[0], point[1]); + //to increase thicknes + g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); + // draw new HOUR hand + point = rotatePoint(0, Radius.hour, hour % 12 * 30 + date.getMinutes() / 2 | 0); + g.setColor(a_colors[v_color3]); + g.drawLine(v_center_x, v_center_y, point[0], point[1]); + //to increase thicknes + g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); + + // draw DIGITs of time above hands for better UX //g.setFont("6x8", 3); 3 bigger size g.setFontVector(v_vfont_size); - g.setColor(v_color2); + g.setColor(a_colors[v_color2]); g.setFontAlign(0, 0); + //by default 24H, to use format config 12H 24H read from locale g.drawString(dateArray[4].substr(0, 5), TxtPosition.x_HH, TxtPosition.y_mm, true); - - // draw new minute hand - point = rotatePoint(0, Radius.min, minute * 6); - g.setColor(v_color3); - g.drawLine(v_center_x, v_center_y, point[0], point[1]); - //to increase thicknes - g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); - - // draw new hour hand - point = rotatePoint(0, Radius.hour, hour % 12 * 30 + date.getMinutes() / 2 | 0); - g.setColor(v_color3); - g.drawLine(v_center_x, v_center_y, point[0], point[1]); - //to increase thicknes - g.drawLine(v_center_x+1, v_center_y, point[0]+1, point[1]); - - // draw center - g.setColor(v_color1); - g.fillCircle(v_center_x, v_center_y, Radius.center); + // the central point requires redrawing because hands draw over it + g.setColor(a_colors[v_color1]); + g.fillCircle(v_center_x, v_center_y, Radius.center); } function UserInput(){ Bangle.on('touch', function(button){ switch(button){ case 1: - //console.log("Touch 1");//left Bangle.showLauncher(); break; case 2: - //console.log("Touch 2");//right + //testing to improve + if (v_mode_debug>0) console.log("v_count_col/total: "+v_count_col+"/"+a_colors.length); + if (v_count_col0) console.log("paint on color: "+v_count_col); + drawStaticRing(); + drawDailyTxt(); break; - case 3: - //console.log("Touch 3");//center 1+2 + case 3: + //console.log("Touch 3 aka 1+2 not for emul");//center 1+2 break; } }); @@ -151,9 +202,14 @@ Bangle.on('lcdPower', function(on) { drawMixedClock(); }); +setVariables(); Bangle.drawWidgets(); UserInput(); + setInterval(drawMixedClock, 5E3); +drawStaticRing(); //pend best position +drawDailyTxt(); //1st time drawMixedClock(); + diff --git a/apps/mixdiganclock/mixdiganclock.info b/apps/mixdiganclock/mixdiganclock.info new file mode 100644 index 000000000..f9057ef5a --- /dev/null +++ b/apps/mixdiganclock/mixdiganclock.info @@ -0,0 +1 @@ +{"id":"mixdiganclock","name":"Mix Dig&Anal","type":"clock","src":"mixdiganclock.app.js","icon":"mixdiganclock.img","version":"0.02","tags":"clock","files":"mixdiganclock.info,mixdiganclock.app.js,mixdiganclock.img"} \ No newline at end of file diff --git a/apps/mixdiganclock/ss_mixdigan_ems2_2.png b/apps/mixdiganclock/ss_mixdigan_ems2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc16fa365e756d1756865f115500435bd0377df GIT binary patch literal 2976 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 literal 0 HcmV?d00001 diff --git a/apps/mixdiganclock/ss_mixdigan_ems2_3.png b/apps/mixdiganclock/ss_mixdigan_ems2_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c61b67fdd284c846d0ebf27e39f036fe718145b8 GIT binary patch literal 3391 zcmV-F4Z!k=P)Px>`AI}URCr$Po!yq~Cm2(jIeVT?fB=tmA!_fSK<<=m04L6#UKpkjg8;`i z+71Ygjd7*}U&fw#I|%UD(4zJZ3Yd1_9Rd(z98(}1cuc>jt*k&euyO$6^kWLRa^UL< z^ZI$VNw}^!$0Ur}nhKbA;1tpn;DA>X8$0Ko>A>WD;M{Rj*#clY5NY-VbH}Wwf0%Zg z+h`AX1aV|kk`Q-2jrODt>7eopw^n*FB1Y8pselB; z!_Na>Qr6r!0QL#mO1+L-$ty*3!?6UwLP5VDf;v9m)$3lxp!HCwFDo}201HI72=4=P zK+LLm06ZvX6V}{;YyS?YyQ2^QW2HO)UCe$jYX9EA&G*Zx|9;;4`q_6Mf2jdGI=AHl zU}WfOIW3n1N6w54L{=;SP6TN}r0Bo_cOC8k`2BFld)FX&e?`@SYm=wXw3e#1FTe#T zin;4^fkl9*YZs!?J~mBZcoEng+{*(z>YTk$urB+A$;NtK2RJVcFxI)6y9NffxKfE63$)yId{A^k#oO%&=f`m{r>hwU_~9Cq1FZZ4?y7d5DK%j9=o8rpxh zGQOO%ykF4q*LC;nPYl$8PIacI9cn#l5F6!D4yD*X#-ZL#xf*ZI+0T1I+2m}*>6Jo2 z&Y2&F%5w(^Y7Z4euZ{~2p6JMiCNIQM>-akdhMY4$4wZ*Q=RQtN8w>?;R0`LV7viXK zyy(EMd;N_&RU^5}XuwMKNkLo)-bV{>;~#O}@0go8Ff})UavKS1fjeo1J|4r5|wKo85In|vk9p7tQDdLnc9Cv{UA=p_knB6E+i_~J~AR0 zst$ta-)IrYEV$Z#T_em&w;)ak*HV6OB`Z3}C_GSoX?XARFQT6hfEN)P0{43yTItXY z5equh*#*F>rwch|Qydt(1ve|LAkMY&K5%Cv;?*2F!;mK7z-alxfzeV;DyRi-?SY_h zV1~eNrRV6*a-#;H&lbl}>BoR#?86aV!_hEQtPYSy{~Pl4DfybjU`b$~59@XLV& z??_FVB)#T@c=JW`0$Uwm>kd2x;&9;J>7}1Sq!%z&U%(V~NW<`=F60DPCJfcO4h$_% z%HpH~N7P50e1Jyg8*z^9Ju(vk%7;2 zsRC?iCSy#98#eCtFk|2-V<~Q`0K0Qw?mK1zj?Mun*oL9!vsD1LG=srlb*d%V36GdekW6=AAiA&x2lyLVuQ zTsRzed$kz*DZ#|AabGBh2jw%3iim2LFZyL~BPj#?1PaXh|#-#(sRUCL! zI*$5t0XDRM$RXa<1{FqXd9Hqnwxbx=sQ_EZnIr;9g0jQ0CHlin}o5JSi3_t^g# zr#Y}@qCYcCO-NUDV8t|I8oe0Gt2z8Dm6I!CcLO5tCN(H6w9=Q9%s{W}HTIo6?T2IKbh+pTp`m z-&jx&2R@HaI4}!K8jY;)z|cpMSAiEAr=idCbA!J0E<|&4e<65LH!)VbfJ7n+m7!C*CD%{HrHXL}lkZv}hT^x9` zu*PsFC@?n%o-m*|#a;@i0IZoa?G;|x(OQV33c#@&Aq&>D))jN#XN)QUTbQ}ig1qpF zEW}X-;BeqYs164{kI%vnc`t%#br}0P@Hc_^`(uF$-%EIjPk1w=w_cHg#KB0fp7++{ zno$OvS2YLzp8QN4c$O3Qir-tW08Q^38@=_oxK)i?We_?!u$BYYUIB+3xVIh^-o_-> ze*5<|6voLsI=NHzI*E-;C-F9krw1SVe5^;QL8^SZonW^0R}&M0y!fg zLXYTA@UgjUZ@sRZw>P)#t=FMn@gpsls2@UOj74<;{u{`Y-0nQyB4dNzTMu&J!sNtG zs=VpmdRUI8#0T4%teiT)TDe_s(6RN3<)BFe9j~tG|8{e@olq-2Sf14Z2Ga(DCLjzyzJFr4N@L>Huraa4amn%eANjGwzB&PNx+gs9z@bf$vUeece#nfdzBm z8dTirgKB(`1cw73w6A0KI(H635w?y=)!br3LeMG}4vY{{MWhZ`P!Kl83&9T^NA1fB zY(3U;-~0EB=R=_KQ$*c?p$n5oJnrRD1r})1K*wkALO|)AGQ1`(;z}`@a;HZDmgc0% zVJZBP#G>Oh>h(BUT4zce20LlSfnVbgxYv$KQwq-_u+*!;n1A%z+OrS>aTw&)ZVDkj z^P%Oi_DCl~z1p)2qT{JRwKsPi@sybFXw;|vELlCN6Xqcg}TA=|1)ox_1;nef$mIPk=H zITU-MI`F9$(a(ni7sBCjxr3>iS7H_Y+yWdQM;U}Y9C%Q`!Ro6x$e;|})mPDPDFKEYB5D~XqEj$8N0+{2wXY#gz{TNUCR$G@io z6P`W5P9E)YBzUD>096p-1+et%DbnNHHHf#a*z}2E@?tr8%H_E=R3AE?a`bj!!H1)z z;mzAe!EE4-0xn&qju*?xQ!dvTst+AcL@PRQ{`sZa460qVQf3fW0Dsz{I+C|#)zJ8I zr-lAqGaHDf(($qbKQjiJK{W>>%pfU%QI3>9-|NVcO^q+-1p4<6!GF(tLp+t9t4?4RUNLNTGJSf@~0KtK)!jT!@QW{U@%_@jLZ@ZKFXmr?zZCjt!9}c)WJU2@6H< z=05A4E^NB+`IK*3NUbc`6&hQP>dZO7SO@OORRkIBYnlK>?J6JAfpllE@oa+hWTOfQ zIpa)@`W(0;SD}ieQl1J?&GDdj=L%^`)3L2RcvExK@7kZ`w9v}l;k@5dm2zO{VF@K&lEaTVZfph0E3*X<%C=ywH!Dz* z1*QPpTFPswN2%kHLO|i%?|2p9XSpxI*Mcie6Y~F0>-D54`FTqz0hFRZE6IKc_#SaJ z2hN8D1-^9=SGz!?xNj|grltzDT-tXS_w9XiAD9Z*zB0zhwG@aO8CuH6d07+)fLUaW zMzjv`0GLI_Xhcha09Z@;I4_F=0Wgb<(TJ7;0kD?xab6Y$0$>&yqY*6y{sWCu VZU3k*9Jc@f002ovPDHLkV1lvNR8jx{ literal 0 HcmV?d00001 diff --git a/apps/mixdiganclock/ss_mixdigan_ems_2.png b/apps/mixdiganclock/ss_mixdigan_ems_2.png new file mode 100644 index 0000000000000000000000000000000000000000..94c1c5d78fc8224d841ac811698d1810a26de246 GIT binary patch literal 4311 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 literal 0 HcmV?d00001 diff --git a/apps/tempmonitor/CSV_excel_view.png b/apps/tempmonitor/CSV_excel_view.png new file mode 100644 index 0000000000000000000000000000000000000000..b903515e82e63e4fca2df722e8255aa0f37b1d1e GIT binary patch literal 16237 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 literal 0 HcmV?d00001 diff --git a/apps/tempmonitor/README.md b/apps/tempmonitor/README.md index 094a47868..234426b43 100644 --- a/apps/tempmonitor/README.md +++ b/apps/tempmonitor/README.md @@ -17,6 +17,10 @@ Screenshot BJS1 ![](ss_emul_bjs1.png) +Screenshot data file content + +![](CSV_IDE_view.png) +![](CSV_excel_view.png) ## Usage diff --git a/apps/tempmonitor/interface.html b/apps/tempmonitor/interface.html new file mode 100644 index 000000000..e9fd569d7 --- /dev/null +++ b/apps/tempmonitor/interface.html @@ -0,0 +1,62 @@ + + + + + +
+ + + + + + \ No newline at end of file diff --git a/apps/tempmonitor/metadata.json b/apps/tempmonitor/metadata.json index bba8c6095..ca6fa698f 100644 --- a/apps/tempmonitor/metadata.json +++ b/apps/tempmonitor/metadata.json @@ -5,6 +5,7 @@ "description": "Displays the current temperature and stores in a CSV file", "icon": "app.png", "tags": "tool", + "interface": "interface.html", "supports": ["BANGLEJS", "BANGLEJS2"], "screenshots": [{"url":"photo_banglejs1.jpg"}], "allow_emulator": true, diff --git a/apps/tempmonitor/tempmonitor.app.js b/apps/tempmonitor/tempmonitor.app.js index d0757d076..662fa391e 100644 --- a/apps/tempmonitor/tempmonitor.app.js +++ b/apps/tempmonitor/tempmonitor.app.js @@ -1,7 +1,6 @@ // Temperature monitor that saves a log of measures -// Version 001 standalone for developer -// PEND -//test with small savefreq +// standalone ver for developer, to remove testing lines +// delimiter ; (excel) or , (oldscool) { var v_mode_debug=0; //, 0=no, 1 min, 2 prone detail //var required for drawing with dynamic screen @@ -69,10 +68,10 @@ function saveToFile() { var strlastSaveTime=new String(); strlastSaveTime=a.toISOString(); //strlastSaveTime=strlastSaveTime.concat(a.getFullYear(),a.getMonth()+1,a.getDate(),a.getHours(),a.getMinutes());; - if (v_mode_debug==1) console.log("saving="+strlastSaveTime+","+lastMeasure); + if (v_mode_debug==1) console.log("saving="+strlastSaveTime+";"+lastMeasure); if (v_saveToFile=='Y'){ - require("Storage").open(filename,"a").write(strlastSaveTime+","+lastMeasure+"\n"); + require("Storage").open(filename,"a").write(strlastSaveTime+";"+lastMeasure+"\n"); //(getTime()+","); v_saved_entries=v_saved_entries+1; }