Skip to content

Commit bf7b90c

Browse files
committed
Bangle.js: Add Bangle.setLCDBrightness
1 parent 449b1f8 commit bf7b90c

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed

ChangeLog

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
nRF52: fix issue where restarting the softdevice would reset the RTC
4242
- fixes Bangle.js watchdog reset
4343
nRF52: fix issue where advertising flags could get out of sync after SD restart
44-
Bangle.js fix units for GPS speed (was knots, now km/h)
44+
Bangle.js: fix units for GPS speed (was knots, now km/h)
45+
Bangle.js: Add Bangle.setLCDBrightness
4546

4647
2v04 : Allow \1..\9 escape codes in RegExp
4748
ESP8266: reading storage is not working for boot from user2 (fix #1507)

libs/banglejs/jswrap_bangle.c

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ volatile uint16_t btn1Timer; // in ms
246246
int lcdPowerTimeout; // in ms
247247
/// Is the LCD on?
248248
bool lcdPowerOn;
249+
/// LCD Brightness - 255=full
250+
uint8_t lcdBrightness;
249251
/// Is the compass on?
250252
bool compassPowerOn;
251253
// compass data
@@ -459,6 +461,15 @@ void peripheralPollHandler() {
459461
//jswrap_banglejs_ioWr(IOEXP_HRM,1); // debug using HRM LED
460462
}
461463

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+
462473
void btnHandlerCommon(int button, bool state, IOEventFlags flags) {
463474
// wake up
464475
if (lcdPowerTimeout) {
@@ -496,7 +507,27 @@ void btn5Handler(bool state, IOEventFlags flags) {
496507
btnHandlerCommon(5,state,flags);
497508
}
498509

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+
}
500531
/*JSON{
501532
"type" : "staticmethod",
502533
"class" : "Bangle",
@@ -509,21 +540,20 @@ void btn5Handler(bool state, IOEventFlags flags) {
509540
}
510541
This function can be used to turn Bangle.js's LCD off or on.
511542
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`.
513545
*/
514546
void jswrap_banglejs_setLCDPower(bool isOn) {
515-
// Note: LCD without backlight draws ~5mA
516547
if (isOn) { // wake
517548
lcdST7789_cmd(0x11, 0, NULL); // SLPOUT
518549
jshDelayMicroseconds(20);
519550
lcdST7789_cmd(0x29, 0, NULL);
520-
jswrap_banglejs_ioWr(IOEXP_LCD_BACKLIGHT, 0); // backlight
521551
} else { // sleep
522552
lcdST7789_cmd(0x28, 0, NULL);
523553
jshDelayMicroseconds(20);
524554
lcdST7789_cmd(0x10, 0, NULL); // SLPIN
525-
jswrap_banglejs_ioWr(IOEXP_LCD_BACKLIGHT, 1); // backlight
526555
}
556+
jswrap_banglejs_setLCDPowerBacklight(isOn);
527557
if (lcdPowerOn != isOn) {
528558
JsVar *bangle =jsvObjectGetChild(execInfo.root, "Bangle", 0);
529559
if (bangle) {
@@ -537,6 +567,41 @@ void jswrap_banglejs_setLCDPower(bool isOn) {
537567
lcdPowerOn = isOn;
538568
}
539569

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+
540605
/*JSON{
541606
"type" : "staticmethod",
542607
"class" : "Bangle",
@@ -817,6 +882,7 @@ void jswrap_banglejs_init() {
817882
jshDelayMicroseconds(10000);
818883

819884
lcdPowerOn = true;
885+
lcdBrightness = 255;
820886
lcdPowerTimeout = DEFAULT_LCD_POWER_TIMEOUT;
821887
// Create backing graphics for LCD
822888
JsVar *graphics = jspNewObject(0, "Graphics");
@@ -952,6 +1018,8 @@ void jswrap_banglejs_init() {
9521018
"generate" : "jswrap_banglejs_kill"
9531019
}*/
9541020
void jswrap_banglejs_kill() {
1021+
jstStopExecuteFn(backlightOnHandler, 0);
1022+
jstStopExecuteFn(backlightOffHandler, 0);
9551023
jstStopExecuteFn(peripheralPollHandler, 0);
9561024
jsvUnLock(promiseBeep);
9571025
promiseBeep = 0;

libs/banglejs/jswrap_bangle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
void jswrap_banglejs_lcdWr(JsVarInt cmd, JsVar *data);
1717
void jswrap_banglejs_setLCDPower(bool isOn);
18+
void jswrap_banglejs_setLCDBrightness(JsVarFloat v);
1819
void jswrap_banglejs_setLCDMode(JsVar *mode);
1920
void jswrap_banglejs_setLCDTimeout(JsVarFloat timeout);
2021
void jswrap_banglejs_setPollInterval(JsVarFloat interval);

0 commit comments

Comments
 (0)