forked from mirrors/qmk_firmware
Fix battery level code in adafruit_ble.cpp (#6648)
* Fix battery level code in adafruit_ble.cpp The code in tsk_core/protocol/lufa/adafluit_ble.cpp that polls the battery level for the Adafruit feather BLE controller reads the regulated voltage, not the raw voltage coming from the battery. To do that, the Adafruit Feather docs say you should read from pin A9: https://learn.adafruit.com/adafruit-feather-32u4-basic-proto/power-management#measuring-battery-4-9. (See also https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/pinouts#logic-pins-2-9.) I'm not sure why, but analogRead(9); doesn't read the correct pin. Checking all available analog pins experimentally, it turns out that analogRead(7); returns the correct value. So the code above should read: state.vbat = analogRead(7); * Update tmk_core/protocol/lufa/adafruit_ble.cpp Co-Authored-By: Drashna Jaelre <drashna@live.com> * Remove old comment * Fix linking error * Remove `#ifdef` around `#include analog.h`. * Really fix linking error
This commit is contained in:
parent
e6a6b1f122
commit
fa71c4c91e
3 changed files with 16 additions and 6 deletions
|
@ -19,9 +19,15 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
void analogReference(uint8_t mode);
|
void analogReference(uint8_t mode);
|
||||||
int16_t analogRead(uint8_t pin);
|
int16_t analogRead(uint8_t pin);
|
||||||
int16_t adc_read(uint8_t mux);
|
int16_t adc_read(uint8_t mux);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ADC_REF_POWER (1 << REFS0)
|
#define ADC_REF_POWER (1 << REFS0)
|
||||||
#define ADC_REF_INTERNAL ((1 << REFS1) | (1 << REFS0))
|
#define ADC_REF_INTERNAL ((1 << REFS1) | (1 << REFS0))
|
||||||
|
|
|
@ -29,6 +29,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
|
ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
|
||||||
|
LUFA_SRC += analog.c
|
||||||
LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
|
LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -51,6 +52,7 @@ SRC += $(LUFA_SRC)
|
||||||
# Search Path
|
# Search Path
|
||||||
VPATH += $(TMK_PATH)/$(LUFA_DIR)
|
VPATH += $(TMK_PATH)/$(LUFA_DIR)
|
||||||
VPATH += $(LUFA_PATH)
|
VPATH += $(LUFA_PATH)
|
||||||
|
VPATH += $(DRIVER_PATH)/avr
|
||||||
|
|
||||||
# Option modules
|
# Option modules
|
||||||
#ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
|
#ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "action_util.h"
|
#include "action_util.h"
|
||||||
#include "ringbuffer.hpp"
|
#include "ringbuffer.hpp"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "analog.h"
|
||||||
|
|
||||||
// These are the pin assignments for the 32u4 boards.
|
// These are the pin assignments for the 32u4 boards.
|
||||||
// You may define them to something else in your config.h
|
// You may define them to something else in your config.h
|
||||||
|
@ -29,6 +30,12 @@
|
||||||
#define SAMPLE_BATTERY
|
#define SAMPLE_BATTERY
|
||||||
#define ConnectionUpdateInterval 1000 /* milliseconds */
|
#define ConnectionUpdateInterval 1000 /* milliseconds */
|
||||||
|
|
||||||
|
#ifdef SAMPLE_BATTERY
|
||||||
|
#ifndef BATTERY_LEVEL_PIN
|
||||||
|
# define BATTERY_LEVEL_PIN 7
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
bool is_connected;
|
bool is_connected;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
@ -631,15 +638,10 @@ void adafruit_ble_task(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SAMPLE_BATTERY
|
#ifdef SAMPLE_BATTERY
|
||||||
// I don't know if this really does anything useful yet; the reported
|
|
||||||
// voltage level always seems to be around 3200mV. We may want to just rip
|
|
||||||
// this code out.
|
|
||||||
if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && resp_buf.empty()) {
|
if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && resp_buf.empty()) {
|
||||||
state.last_battery_update = timer_read();
|
state.last_battery_update = timer_read();
|
||||||
|
|
||||||
if (at_command_P(PSTR("AT+HWVBAT"), resbuf, sizeof(resbuf))) {
|
state.vbat = analogRead(BATTERY_LEVEL_PIN);
|
||||||
state.vbat = atoi(resbuf);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue