# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: Copyright 2026 Sam Blenny
#
# See NOTES.md for documentation links
#
import alarm
import bitmaptools
import board
from displayio import Bitmap, Group, Palette, TileGrid
from digitalio import DigitalInOut
import displayio
from micropython import const
import terminalio
import time

from adafruit_display_text import bitmap_label
from adafruit_max1704x import MAX17048


STORAGE_VOLTS = const(3.8)

# Init I2C battery fuel gauge
time.sleep(0.5)
i2c = board.I2C()
max17 = MAX17048(i2c)
time.sleep(1)  # let max17 finish initializing

# Init display with text label for voltage
display = board.DISPLAY
display.rotation = 180
grp = Group(scale=1)
display.root_group = grp
volts = bitmap_label.Label(terminalio.FONT, text="", color=0xFFFF00, scale=5)
volts.line_spacing = 1.0
volts.anchor_point = (0, 0)
volts.anchored_position = (32, 32)
grp.append(volts)

# Wait for battery volts to reach storage voltage
while True:
    v = max17.cell_voltage
    volts.text = f"{v:.2f} V"
    time.sleep(3)
    if v <= STORAGE_VOLTS:
        break

# Put fuel gauge in low power mode
max17.hibernate()
time.sleep(0.5)

# Make sure Neopixel, I2C, TFT, and TFT backlight are off
displayio.release_displays()
npp = DigitalInOut(board.NEOPIXEL_POWER)
npp.switch_to_output(value=False)
tip = DigitalInOut(board.TFT_I2C_POWER)
tip.switch_to_output(value=False)
tb = DigitalInOut(board.TFT_BACKLIGHT)
tb.switch_to_output(value=False)

# Deep sleep for an hour
alarm.exit_and_deep_sleep_until_alarms(
    alarm.time.TimeAlarm(monotonic_time=time.monotonic() + 3600))
