]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - keyboard/hhkb_rn42/rn42/rn42_task.c
Add battery management
[tmk_firmware.git] / keyboard / hhkb_rn42 / rn42 / rn42_task.c
index 437dd46f490983f2512efc02cc00b4bc7f03940e..07b34e111a4317f8b15382fb1f77cdc9d479f4ce 100644 (file)
@@ -9,44 +9,25 @@
 #include "print.h"
 #include "timer.h"
 #include "command.h"
+#include "battery.h"
 
 static bool config_mode = false;
 static bool force_usb = false;
 
-static void battery_adc_init(void)
+static void status_led(bool on)
 {
-    ADMUX = (1<<REFS1) | (1<<REFS0);                // Ref:2.56V band-gap, Input:ADC0(PF0)
-    ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // Prescale:128 16MHz/128=125KHz
-    ADCSRA |= (1<<ADEN);                            // enable ADC
-}
-
-static uint16_t battery_adc(void)
-{
-    volatile uint16_t bat;
-    ADCSRA |= (1<<ADEN);
-
-    // discard first result
-    ADCSRA |= (1<<ADSC);
-    while (ADCSRA & (1<<ADSC)) ;
-    bat = ADC;
-
-    // discard second result
-    ADCSRA |= (1<<ADSC);
-    while (ADCSRA & (1<<ADSC)) ;
-    bat = ADC;
-
-    ADCSRA |= (1<<ADSC);
-    while (ADCSRA & (1<<ADSC)) ;
-    bat = ADC;
-
-    ADCSRA &= ~(1<<ADEN);
-    return bat;
+    if (on) {
+        DDRE  |=  (1<<6);
+        PORTE &= ~(1<<6);
+    } else {
+        DDRE  |=  (1<<6);
+        PORTE |=  (1<<6);
+    }
 }
 
-
 void rn42_task_init(void)
 {
-    battery_adc_init();
+    battery_init();
 }
 
 void rn42_task(void)
@@ -99,6 +80,20 @@ void rn42_task(void)
             host_set_driver(&lufa_driver);
         }
     }
+
+    /* Low voltage alert */
+    if (battery_status() == LOW_VOLTAGE) {
+        battery_led(LED_ON);
+    } else {
+        battery_led(LED_CHARGER);
+    }
+
+    /* Connection monitor */
+    if (rn42_linked()) {
+        status_led(true);
+    } else {
+        status_led(false);
+    }
 }
 
 
@@ -108,6 +103,8 @@ void rn42_task(void)
  ******************************************************************************/
 bool command_extra(uint8_t code)
 {
+    uint32_t t;
+    uint16_t b;
     static host_driver_t *prev_driver = &rn42_driver;
     switch (code) {
         case KC_H:
@@ -166,10 +163,17 @@ bool command_extra(uint8_t code)
             xprintf("rn42_rts(): %X\n", rn42_rts());
             xprintf("config_mode: %X\n", config_mode);
             xprintf("VBUS: %X\n", USBSTA&(1<<VBUS));
+            xprintf("battery_charging: %X\n", battery_charging());
+            xprintf("battery_status: %X\n", battery_status());
             return true;
         case KC_B:
             // battery monitor
-            xprintf("BAT: %04X(%08lX)\n",  battery_adc(), timer_read32());
+            t = timer_read32()/1000;
+            b = battery_voltage();
+            xprintf("BAT: %umV\t", b);
+            xprintf("%02u:",   t/3600);
+            xprintf("%02u:",   t%3600/60);
+            xprintf("%02u\n",  t%60);
             return true;
         default:
             if (config_mode)