@@ -246,6 +246,8 @@ volatile uint16_t btn1Timer; // in ms
246
246
int lcdPowerTimeout ; // in ms
247
247
/// Is the LCD on?
248
248
bool lcdPowerOn ;
249
+ /// LCD Brightness - 255=full
250
+ uint8_t lcdBrightness ;
249
251
/// Is the compass on?
250
252
bool compassPowerOn ;
251
253
// compass data
@@ -459,6 +461,15 @@ void peripheralPollHandler() {
459
461
//jswrap_banglejs_ioWr(IOEXP_HRM,1); // debug using HRM LED
460
462
}
461
463
464
+ void backlightOnHandler () {
465
+ if (i2cBusy ) return ;
466
+ jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 0 ); // backlight on
467
+ }
468
+ void backlightOffHandler () {
469
+ if (i2cBusy ) return ;
470
+ jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 1 ); // backlight off
471
+ }
472
+
462
473
void btnHandlerCommon (int button , bool state , IOEventFlags flags ) {
463
474
// wake up
464
475
if (lcdPowerTimeout ) {
@@ -496,7 +507,27 @@ void btn5Handler(bool state, IOEventFlags flags) {
496
507
btnHandlerCommon (5 ,state ,flags );
497
508
}
498
509
499
-
510
+ /// Turn just the backlight on or off (or adjust brightness)
511
+ static void jswrap_banglejs_setLCDPowerBacklight (bool isOn ) {
512
+ jstStopExecuteFn (backlightOnHandler , 0 );
513
+ jstStopExecuteFn (backlightOffHandler , 0 );
514
+ if (isOn ) { // wake
515
+ if (lcdBrightness > 0 ) {
516
+ jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 0 ); // backlight on
517
+ if (lcdBrightness < 255 ) { // only do PWM if brightness isn't full
518
+ JsSysTime now = jshGetSystemTime ();
519
+ JsSysTime interval = jshGetTimeFromMilliseconds (10 ); // how often do we switch - 100Hz
520
+ JsSysTime ontime = interval * lcdBrightness /255 ; // how long to we stay on for?
521
+ jstExecuteFn (backlightOnHandler , NULL , now + interval , interval );
522
+ jstExecuteFn (backlightOffHandler , NULL , now + interval + ontime , interval );
523
+ }
524
+ } else { // lcdBrightness == 0
525
+ jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 1 ); // backlight off
526
+ }
527
+ } else { // sleep
528
+ jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 1 ); // backlight off
529
+ }
530
+ }
500
531
/*JSON{
501
532
"type" : "staticmethod",
502
533
"class" : "Bangle",
@@ -509,21 +540,20 @@ void btn5Handler(bool state, IOEventFlags flags) {
509
540
}
510
541
This function can be used to turn Bangle.js's LCD off or on.
511
542
512
- *When on, the LCD draws roughly 40mA*
543
+ **When on full, the LCD draws roughly 40mA.** You can adjust
544
+ When brightness using `Bange.setLCDBrightness`.
513
545
*/
514
546
void jswrap_banglejs_setLCDPower (bool isOn ) {
515
- // Note: LCD without backlight draws ~5mA
516
547
if (isOn ) { // wake
517
548
lcdST7789_cmd (0x11 , 0 , NULL ); // SLPOUT
518
549
jshDelayMicroseconds (20 );
519
550
lcdST7789_cmd (0x29 , 0 , NULL );
520
- jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 0 ); // backlight
521
551
} else { // sleep
522
552
lcdST7789_cmd (0x28 , 0 , NULL );
523
553
jshDelayMicroseconds (20 );
524
554
lcdST7789_cmd (0x10 , 0 , NULL ); // SLPIN
525
- jswrap_banglejs_ioWr (IOEXP_LCD_BACKLIGHT , 1 ); // backlight
526
555
}
556
+ jswrap_banglejs_setLCDPowerBacklight (isOn );
527
557
if (lcdPowerOn != isOn ) {
528
558
JsVar * bangle = jsvObjectGetChild (execInfo .root , "Bangle" , 0 );
529
559
if (bangle ) {
@@ -537,6 +567,41 @@ void jswrap_banglejs_setLCDPower(bool isOn) {
537
567
lcdPowerOn = isOn ;
538
568
}
539
569
570
+ /*JSON{
571
+ "type" : "staticmethod",
572
+ "class" : "Bangle",
573
+ "name" : "setLCDBrightness",
574
+ "generate" : "jswrap_banglejs_setLCDBrightness",
575
+ "params" : [
576
+ ["brightness","float","The brightness of Bangle.js's display - from 0(off) to 1(on full)"]
577
+ ],
578
+ "ifdef" : "BANGLEJS"
579
+ }
580
+ This function can be used to adjust the brightness of Bangle.js's display, and
581
+ hence prolong its battery life.
582
+
583
+ Due to hardware design constraints, software PWM has to be used which
584
+ means that the display may flicker slightly when Bluetooth is active
585
+ and the display is not at full power.
586
+
587
+ **Power consumption**
588
+
589
+ * 0 = 7mA
590
+ * 0.1 = 12mA
591
+ * 0.2 = 18mA
592
+ * 0.5 = 28mA
593
+ * 0.9 = 40mA (switching overhead)
594
+ * 1 = 40mA
595
+ */
596
+ void jswrap_banglejs_setLCDBrightness (JsVarFloat v ) {
597
+ int b = (int )(v * 256 + 0.5 );
598
+ if (b < 0 ) b = 0 ;
599
+ if (b > 255 ) b = 255 ;
600
+ lcdBrightness = b ;
601
+ if (lcdPowerOn ) // need to re-run to adjust brightness
602
+ jswrap_banglejs_setLCDPowerBacklight (1 );
603
+ }
604
+
540
605
/*JSON{
541
606
"type" : "staticmethod",
542
607
"class" : "Bangle",
@@ -817,6 +882,7 @@ void jswrap_banglejs_init() {
817
882
jshDelayMicroseconds (10000 );
818
883
819
884
lcdPowerOn = true;
885
+ lcdBrightness = 255 ;
820
886
lcdPowerTimeout = DEFAULT_LCD_POWER_TIMEOUT ;
821
887
// Create backing graphics for LCD
822
888
JsVar * graphics = jspNewObject (0 , "Graphics" );
@@ -952,6 +1018,8 @@ void jswrap_banglejs_init() {
952
1018
"generate" : "jswrap_banglejs_kill"
953
1019
}*/
954
1020
void jswrap_banglejs_kill () {
1021
+ jstStopExecuteFn (backlightOnHandler , 0 );
1022
+ jstStopExecuteFn (backlightOffHandler , 0 );
955
1023
jstStopExecuteFn (peripheralPollHandler , 0 );
956
1024
jsvUnLock (promiseBeep );
957
1025
promiseBeep = 0 ;
0 commit comments