Skip to content

Commit

Permalink
Implement battery level interface
Browse files Browse the repository at this point in the history
  • Loading branch information
zvecr committed Dec 2, 2024
1 parent b3a1dc0 commit 93a0dd4
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 0 deletions.
20 changes: 20 additions & 0 deletions builddefs/common_features.mk
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,26 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
endif
endif

VALID_BATTERY_DRIVER_TYPES := adc custom

BATTERY_DRIVER ?= adc
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
endif

OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))

COMMON_VPATH += $(DRIVER_PATH)/battery

SRC += battery_$(strip $(BATTERY_DRIVER)).c

# add extra deps
ifeq ($(strip $(BATTERY_DRIVER)), adc)
ANALOG_DRIVER_REQUIRED = yes
endif
endif

VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor

WS2812_DRIVER ?= bitbang
Expand Down
10 changes: 10 additions & 0 deletions drivers/battery/battery.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <stdint.h>

void battery_init(void);

uint8_t battery_get_percent(void);
59 changes: 59 additions & 0 deletions drivers/battery/battery_adc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#include "analog.h"
#include "gpio.h"

#ifndef BATTERY_PIN
# error("BATTERY_PIN not configured!")
#endif

#ifndef BATTERY_REF_VOLTAGE_MV
# define BATTERY_REF_VOLTAGE_MV 3300
#endif

#ifndef BATTERY_VOLTAGE_DIVIDER_R1
# define BATTERY_VOLTAGE_DIVIDER_R1 100000
#endif

#ifndef BATTERY_VOLTAGE_DIVIDER_R2
# define BATTERY_VOLTAGE_DIVIDER_R2 100000
#endif

// TODO: infer from adc config?
#ifndef BATTERY_ADC_RESOLUTION
# define BATTERY_ADC_RESOLUTION 10
#endif

void battery_init(void) {
gpio_set_pin_input(BATTERY_PIN);
}

__attribute__((weak)) uint16_t battery_raw_to_mv(uint32_t raw) {
uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION);

#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0
bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2;
#endif

return bat_mv;
}

__attribute__((weak)) uint8_t battery_mv_to_percent(uint16_t bat_mv) {
// https://github.com/zmkfirmware/zmk/blob/3f7c9d7cc4f46617faad288421025ea2a6b0bd28/app/module/drivers/sensor/battery/battery_common.c#L33
if (bat_mv >= 4200) {
return 100;
} else if (bat_mv <= 3450) {
return 0;
}

return bat_mv * 2 / 15 - 459;
}

uint8_t battery_get_percent(void) {
uint16_t raw = analogReadPin(BATTERY_PIN);

uint16_t bat_mv = battery_raw_to_mv(raw);

return battery_mv_to_percent(bat_mv);
}
6 changes: 6 additions & 0 deletions keyboards/handwired/onekey/keymaps/battery/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#define BATTERY_PIN ADC_PIN
28 changes: 28 additions & 0 deletions keyboards/handwired/onekey/keymaps/battery/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#include QMK_KEYBOARD_H
#include "battery.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_ortho_1x1(KC_A)
};

void keyboard_post_init_user(void) {
// Customise these values to desired behaviour
debug_enable=true;
// debug_matrix=false;
// debug_keyboard=true;
// debug_mouse=false;

battery_init();
}

void housekeeping_task_user(void) {
static uint32_t last = 0;
if (timer_elapsed32(last) > 2000) {
uprintf("Bat: %d!\n", battery_get_percent());

last = timer_read32();
}
}
7 changes: 7 additions & 0 deletions keyboards/handwired/onekey/keymaps/battery/keymap.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"config": {
"features": {
"console": true
}
}
}
1 change: 1 addition & 0 deletions keyboards/handwired/onekey/keymaps/battery/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BATTERY_DRIVER_REQUIRED = yes

0 comments on commit 93a0dd4

Please sign in to comment.