]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Fix battery level code in adafruit_ble.cpp (#6648)
authorbwhelm <bwhelm@users.noreply.github.com>
Tue, 3 Sep 2019 18:29:23 +0000 (14:29 -0400)
committerfauxpark <fauxpark@gmail.com>
Tue, 3 Sep 2019 18:29:23 +0000 (04:29 +1000)
* 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

drivers/avr/analog.h
tmk_core/protocol/lufa.mk
tmk_core/protocol/lufa/adafruit_ble.cpp

index 32452a1ec210c14a4daa9b6b865dfe4714480ef2..1b773d82cefa87b84b6924ed47c366f2506ff998 100644 (file)
 
 #include <stdint.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 void    analogReference(uint8_t mode);
 int16_t analogRead(uint8_t pin);
 int16_t adc_read(uint8_t mux);
+#ifdef __cplusplus
+}
+#endif
 
 #define ADC_REF_POWER (1 << REFS0)
 #define ADC_REF_INTERNAL ((1 << REFS1) | (1 << REFS0))
index bb82a31e17cc37b6866514e1d6fc5d1773382973..d7d1d9ffccf9ed15ffcd9c16959ed651dbec1efe 100644 (file)
@@ -29,6 +29,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
 endif
 
 ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
+               LUFA_SRC += analog.c
                LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
 endif
 
@@ -51,6 +52,7 @@ SRC += $(LUFA_SRC)
 # Search Path
 VPATH += $(TMK_PATH)/$(LUFA_DIR)
 VPATH += $(LUFA_PATH)
+VPATH += $(DRIVER_PATH)/avr
 
 # Option modules
 #ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
index 71d0936f8f4e7040f8c575bbb6ab5f9e0d874612..1d8ae1038ba928e4a99362775149361d868b8191 100644 (file)
@@ -10,6 +10,7 @@
 #include "action_util.h"
 #include "ringbuffer.hpp"
 #include <string.h>
+#include "analog.h"
 
 // These are the pin assignments for the 32u4 boards.
 // You may define them to something else in your config.h
 #define SAMPLE_BATTERY
 #define ConnectionUpdateInterval 1000 /* milliseconds */
 
+#ifdef SAMPLE_BATTERY
+#ifndef BATTERY_LEVEL_PIN
+#    define BATTERY_LEVEL_PIN 7
+#endif
+#endif
+
 static struct {
     bool is_connected;
     bool initialized;
@@ -631,15 +638,10 @@ void adafruit_ble_task(void) {
     }
 
 #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()) {
         state.last_battery_update = timer_read();
 
-        if (at_command_P(PSTR("AT+HWVBAT"), resbuf, sizeof(resbuf))) {
-            state.vbat = atoi(resbuf);
-        }
+        state.vbat = analogRead(BATTERY_LEVEL_PIN);
     }
 #endif
 }