Skip to content

Commit bc3047a

Browse files
committed
add battery level
1 parent ca446b8 commit bc3047a

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

keyboard/__init__.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
import adafruit_ble
1111
from adafruit_ble.advertising import Advertisement
1212
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
13+
from adafruit_ble.services.standard import BatteryService
1314
from adafruit_ble.services.standard.hid import HIDService
1415

1516
from .hid import HID
16-
from .model import Matrix, COORDS, Backlight
17+
from .model import Matrix, COORDS, Backlight, battery_level
1718
from .action_code import *
1819

1920

@@ -160,7 +161,10 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
160161
self.heatmap = memoryview(self.data)[4:]
161162

162163
ble_hid = HIDService()
163-
self.advertisement = ProvideServicesAdvertisement(ble_hid)
164+
self.battery = BatteryService()
165+
self.battery.level = battery_level()
166+
self.battery_update_time = time.time() + 360
167+
self.advertisement = ProvideServicesAdvertisement(ble_hid, self.battery)
164168
self.advertisement.appearance = 961
165169
self.ble = adafruit_ble.BLERadio()
166170
self.change_bt(self.ble_id)
@@ -216,6 +220,11 @@ def check(self):
216220
self.backlight.set_hid_leds(leds)
217221
self.log('keyboard leds {}'.format(bin(leds)))
218222
self.update_current_conn()
223+
224+
# update battery level
225+
if time.time() > self.battery_update_time:
226+
self.battery_update_time = time.time() + 360
227+
self.battery.level = battery_level()
219228

220229
def setup(self):
221230
convert = lambda a: array.array('H', (get_action_code(k) for k in a))

keyboard/model/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
machine = os.uname().machine
44

5-
if machine.find('M60 Keyboard') >= 0:
6-
from .m60 import Matrix, COORDS, Backlight
7-
elif machine.find('Pitaya Go') >= 0:
8-
from .pitaya_go import Matrix, COORDS, Backlight
5+
if machine.find("M60 Keyboard") >= 0:
6+
from .m60 import Matrix, COORDS, Backlight, battery_level
7+
elif machine.find("Pitaya Go") >= 0:
8+
from .pitaya_go import Matrix, COORDS, Backlight, battery_level

keyboard/model/m60.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
import analogio
3+
import microcontroller
24
from .is32fl3733 import IS31FL3733
35

46
try:
@@ -27,6 +29,32 @@
2729
)
2830

2931

32+
BATTERY_LIMIT = 3100 # Cutoff voltage [mV].
33+
BATTERY_FULLLIMIT = 4190 # Full charge definition [mV].
34+
BATTERY_DELTA = 10 # mV between each element in the SoC vector.
35+
36+
BATTERY_VOLTAGE = (
37+
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
38+
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
39+
4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 16,
40+
18, 19, 22, 25, 28, 32, 36, 40, 44, 47, 51, 53, 56, 58, 60, 62, 64, 66, 67, 69,
41+
71, 72, 74, 76, 77, 79, 81, 82, 84, 85, 85, 86, 86, 86, 87, 88, 88, 89, 90, 91,
42+
91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100
43+
)
44+
45+
battery_in = analogio.AnalogIn(microcontroller.pin.P0_02)
46+
47+
def battery_level():
48+
# (3300 * 2 * battery.value) >> 16
49+
voltage = (3300 * battery_in.value) >> 15
50+
i = (voltage - BATTERY_LIMIT) // BATTERY_DELTA
51+
if i >= len(BATTERY_VOLTAGE):
52+
i = len(BATTERY_VOLTAGE) - 1
53+
elif i < 0:
54+
i = 0
55+
return BATTERY_VOLTAGE[i]
56+
57+
3058
class Backlight:
3159
def __init__(self):
3260
self.dev = IS31FL3733()

keyboard/model/pitaya_go.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@
1919
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 52, 0,
2020
53, 55, 54, 0, 0, 56, 0, 0, 57, 58, 59, 60, 0, 0
2121
)
22+
23+
def battery_level():
24+
return 100

0 commit comments

Comments
 (0)