Skip to content

Commit fddc29a

Browse files
authored
Merge pull request #27 from arduino/battery_charge_ctrl
added battery alert system
2 parents 177c436 + 91f3bb4 commit fddc29a

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

arduino_alvik/arduino_alvik.py

+21-7
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __init__(self):
4242
self.right_led = self.DL2 = _ArduinoAlvikRgbLed(self._packeter, 'right', self._led_state,
4343
rgb_mask=[0b00100000, 0b01000000, 0b10000000])
4444
self._battery_perc = None
45+
self._battery_is_charging = None
4546
self._touch_byte = None
4647
self._move_byte = None
4748
self._behaviour = None
@@ -92,18 +93,20 @@ def is_on() -> bool:
9293
return CHECK_STM32.value() == 1
9394

9495
@staticmethod
95-
def _progress_bar(percentage: float) -> None:
96+
def _print_battery_status(percentage: float, is_charging) -> None:
9697
"""
97-
Prints a progressbar
98-
:param percentage:
98+
Pretty prints the battery status
99+
:param percentage: SOC of the battery
100+
:param is_charging: True if the battery is charging
99101
:return:
100102
"""
101103
sys.stdout.write(bytes('\r'.encode('utf-8')))
102104
if percentage > 97:
103105
marks_str = ' \U0001F50B'
104106
else:
105107
marks_str = ' \U0001FAAB'
106-
word = marks_str + f" {percentage}% \t"
108+
charging_str = f' \U0001F50C' if is_charging else ' \U000026A0WARNING: battery is discharging!'
109+
word = marks_str + f" {percentage}%" + charging_str + " \t"
107110
sys.stdout.write(bytes((word.encode('utf-8'))))
108111

109112
def _lenghty_op(self, iterations=10000000) -> int:
@@ -140,8 +143,9 @@ def _idle(self, delay_=1, check_on_thread=False, blocking=False) -> None:
140143

141144
soc_raw = struct.unpack('h', self.i2c.readfrom(0x36, 2))[0]
142145
soc_perc = soc_raw * 0.00390625
143-
self._battery_perc = soc_perc
144-
self._progress_bar(round(soc_perc))
146+
self._battery_is_charging = soc_perc > 0
147+
self._battery_perc = abs(soc_perc)
148+
self._print_battery_status(round(soc_perc), self._battery_is_charging)
145149
if blocking:
146150
self._lenghty_op(10000)
147151
else:
@@ -219,6 +223,7 @@ def begin(self) -> int:
219223
self._snake_robot(2000)
220224
self.set_illuminator(True)
221225
self.set_behaviour(1)
226+
self.set_behaviour(2)
222227
self._set_color_reference()
223228
if self._has_events_registered():
224229
print('Starting events thread')
@@ -671,7 +676,9 @@ def _parse_message(self) -> int:
671676
_, self._ax, self._ay, self._az, self._gx, self._gy, self._gz = self._packeter.unpacketC6F()
672677
elif code == ord('p'):
673678
# battery percentage
674-
_, self._battery_perc = self._packeter.unpacketC1F()
679+
_, battery_perc = self._packeter.unpacketC1F()
680+
self._battery_is_charging = battery_perc > 0
681+
self._battery_perc = abs(battery_perc)
675682
elif code == ord('d'):
676683
# distance sensor
677684
_, self._left_tof, self._center_tof, self._right_tof = self._packeter.unpacketC3I()
@@ -726,6 +733,13 @@ def get_battery_charge(self) -> int | None:
726733
return 100
727734
return round(self._battery_perc)
728735

736+
def is_battery_charging(self) -> bool:
737+
"""
738+
Returns True if the device battery is charging
739+
:return:
740+
"""
741+
return self._battery_is_charging
742+
729743
@property
730744
def _touch_bits(self) -> int:
731745
"""

0 commit comments

Comments
 (0)