Bangle.setLCDTimeout() question

Posted on
  • I have noticed that with Navigation Compass the LCD does not go off if you shake the watch or keep moving. The timeout is set to 30seconds but I can keep the watch on for 2 minutes if i shake my arm.

    Can movement (which might keep an App busy) keep the LCD screen on or cause the timeout to be missed ?

  • Well, apps can override the LCD timeout from settings - and it seems this is what Navigation Compass does: https://github.com/espruino/BangleApps/b­lob/master/apps/magnav/magnav.js#L5

    I think realistically we could should remove that though so the default settings are used.

    If an app calls g.flip() it can keep the LCD on, but this app doesn't do that.

    Do you have 'wake on twist' or similar enabled in your settings?

  • I do have wake on twist enabled, though I have set it to be fairly insensitive. I only used magnav as an example as I have similar code that runs like

    set a 200ms timer
    check the compass
    adjust the compass based on tilt
    draw the compass

    I have noticed that sometimes with the watch 100% stationary the screen does not always timeout and I dont see the Bangle.on('lcdPower', .......); being called.

  • If it's when running your own code, is it possible you call g.flip() at some point?

  • Here's the latest code for arrow. I can reproduce the problem with this code. There is no use of g.flip(). flip1() and flip2() just draw buf1 and buf2 which are different sizes. I have also taken out the setLCDTimeout(30);

    The LCD will only go of if the watch is totally still. I have disabled switch on on twist in the settings.

    For simplicity I have taken out the calibrate functions in the code below.

    
    var pal1color = new Uint16Array([0x0000,0xFFC0],0,1);
    var pal2color = new Uint16Array([0x0000,0xffff],0,1);
    var buf1 = Graphics.createArrayBuffer(128,128,1,{ms­b:true});
    var buf2 = Graphics.createArrayBuffer(80,40,1,{msb:­true});
    var intervalRef;
    var bearing=0; // always point north
    var heading = 0;
    var oldHeading = 0;
    var candraw = false;
    var CALIBDATA = require("Storage").readJSON("magnav.json­",1)||null;
    
    function flip1(x,y) {
      g.drawImage({width:128,height:128,bpp:1,­buffer:buf1.buffer, palette:pal1color},x,y);
      buf1.clear();
    }
    
    function flip2(x,y) {
     g.drawImage({width:80,height:40,bpp:1,bu­ffer:buf2.buffer, palette:pal2color},x,y);
     buf2.clear();
    }
    
    function radians(d) {
      return (d*Math.PI) / 180;
    }
    
    // takes 32ms
    function drawCompass(hd) {
      if(!candraw) return;
      if (Math.abs(hd - oldHeading) < 2) return 0;
      var t1 = getTime();
      hd=hd*Math.PI/180;
      var p = [0, 1.1071, Math.PI/4, 2.8198, 3.4633, 7*Math.PI/4 , 5.1760];
      
      // using polar cordinates, 64,64 is the offset from the 0,0 origin
      var poly = [
        64+60*Math.sin(hd+p[0]),       64-60*Math.cos(hd+p[0]),
        64+44.7214*Math.sin(hd+p[1]),  64-44.7214*Math.cos(hd+p[1]),
        64+28.2843*Math.sin(hd+p[2]),  64-28.2843*Math.cos(hd+p[2]),
        64+63.2455*Math.sin(hd+p[3]),  64-63.2455*Math.cos(hd+p[3]),
        64+63.2455*Math.sin(hd+p[4]),  64-63.2455*Math.cos(hd+p[4]),
        64+28.2843*Math.sin(hd+p[5]),  64-28.2843*Math.cos(hd+p[5]),
        64+44.7214*Math.sin(hd+p[6]),  64-44.7214*Math.cos(hd+p[6])
      ];
          
      buf1.fillPoly(poly);
      flip1(56, 56);
      var t = Math.round((getTime() - t1)*1000);
      LED1.write((t > 100));
    }
    
    // stops violent compass swings and wobbles, takes 3ms
    function newHeading(m,h){ 
        var s = Math.abs(m - h);
        var delta = (m>h)?1:-1;
        if (s>=180){s=360-s; delta = -delta;} 
        if (s<2) return h;
        var hd = h + delta*(1 + Math.round(s/5));
        if (hd<0) hd+=360;
        if (hd>360)hd-= 360;
        return hd;
    }
    
    // takes approx 7ms
    function tiltfixread(O,S){
      var start = Date.now();
      var m = Bangle.getCompass();
      var g = Bangle.getAccel();
      m.dx =(m.x-O.x)*S.x; m.dy=(m.y-O.y)*S.y; m.dz=(m.z-O.z)*S.z;
      var d = Math.atan2(-m.dx,m.dy)*180/Math.PI;
      if (d<0) d+=360;
      var phi = Math.atan(-g.x/-g.z);
      var cosphi = Math.cos(phi), sinphi = Math.sin(phi);
      var theta = Math.atan(-g.y/(-g.x*sinphi-g.z*cosphi))­;
      var costheta = Math.cos(theta), sintheta = Math.sin(theta);
      var xh = m.dy*costheta + m.dx*sinphi*sintheta + m.dz*cosphi*sintheta;
      var yh = m.dz*sinphi - m.dx*cosphi;
      var psi = Math.atan2(yh,xh)*180/Math.PI;
      if (psi<0) psi+=360;
      return psi;
    }
    
    function reading() {
      var d = tiltfixread(CALIBDATA.offset,CALIBDATA.s­cale);
      heading = newHeading(d,heading);
      var dir = bearing - heading;
      if (dir < 0) dir += 360;
      if (dir > 360) dir -= 360;
      drawCompass(dir);  // we want compass to show us where to go
      oldHeading = dir;
      buf2.setColor(1);
      buf2.setFontAlign(-1,-1);
      buf2.setFont("Vector",38);
      var course = Math.round(heading);
      var cs = course.toString();
      cs = course<10?"00"+cs : course<100 ?"0"+cs : cs;
      buf2.drawString(cs,0,0);
      flip2(90, 200);
    }
    
    function startdraw(){
      g.clear();
      g.setColor(1,1,1);
      Bangle.drawWidgets();
      candraw = true;
      intervalRef = setInterval(reading,500);
    }
    
    function stopdraw() {
      candraw=false;
      if(intervalRef) {clearInterval(intervalRef);}
    }
    
    function setButtons(){
      setWatch(()=>{load();}, BTN1, {repeat:false,edge:"falling"});
      setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
    }
     
    Bangle.on('lcdPower',function(on) {
      if (on) {
        startdraw();
      } else {
        stopdraw();
      }
    });
    
    Bangle.on('kill',()=>{Bangle.setCompassP­ower(0);});
    
    Bangle.loadWidgets();
    Bangle.setCompassPower(1);
    startdraw();
    setButtons();
    
    
    
  • It's the LED1.write command I reckon :)

  • Could be. Its the only thing that would make sense. Will test tomorrow.

  • Right on the money. Took that line out and the LCD goes off as expected.
    Is that a defect with LCD1.write() ?

  • Is that a defect with LCD1.write()

    No - LED1.write is just a debugging aid and shouldn't really be in any apps. In fact it was only added so normal Espruino tutorials would work with Bangle.js!

    The idea is, if you're connected to the Bangle and you do 'LED.set()', you see something on the screen even if it was off, so really it's intentional

  • Post a reply
    • Bold
    • Italics
    • Link
    • Image
    • List
    • Quote
    • code
    • Preview
About

Bangle.setLCDTimeout() question

Posted by Avatar for user126378 @user126378

Actions