Merge pull request #50 from kienvo/batt-indicator
feat: Charging status
This commit is contained in:
1
Makefile
1
Makefile
@@ -69,6 +69,7 @@ src/usb/composite/cdc-serial.c \
|
||||
src/xbm.c \
|
||||
src/resource.c \
|
||||
src/animation.c \
|
||||
src/font.c \
|
||||
|
||||
|
||||
# ASM sources
|
||||
|
||||
100
src/font.c
Normal file
100
src/font.c
Normal file
@@ -0,0 +1,100 @@
|
||||
#include <stdint.h>
|
||||
|
||||
uint8_t font5x7[][6] = { //Font 5x7
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 20 ' '
|
||||
{0x00, 0x00, 0x00, 0x5f, 0x00, 0x00}, // 21 !
|
||||
{0x00, 0x00, 0x07, 0x00, 0x07, 0x00}, // 22 "
|
||||
{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14}, // 23 #
|
||||
{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12}, // 24 $
|
||||
{0x00, 0x23, 0x13, 0x08, 0x64, 0x62}, // 25 %
|
||||
{0x00, 0x36, 0x49, 0x55, 0x22, 0x50}, // 26 &
|
||||
{0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // 27 '
|
||||
{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00}, // 28 (
|
||||
{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00}, // 29 )
|
||||
{0x00, 0x14, 0x08, 0x3e, 0x08, 0x14}, // 2a *
|
||||
{0x00, 0x08, 0x08, 0x3e, 0x08, 0x08}, // 2b +
|
||||
{0x00, 0x00, 0x50, 0x30, 0x00, 0x00}, // 2c ,
|
||||
{0x00, 0x08, 0x08, 0x08, 0x08, 0x08}, // 2d -
|
||||
{0x00, 0x00, 0x60, 0x60, 0x00, 0x00}, // 2e .
|
||||
{0x00, 0x20, 0x10, 0x08, 0x04, 0x02}, // 2f /
|
||||
{0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e}, // 30 0
|
||||
{0x00, 0x00, 0x42, 0x7f, 0x40, 0x00}, // 31 1
|
||||
{0x00, 0x42, 0x61, 0x51, 0x49, 0x46}, // 32 2
|
||||
{0x00, 0x21, 0x41, 0x45, 0x4b, 0x31}, // 33 3
|
||||
{0x00, 0x18, 0x14, 0x12, 0x7f, 0x10}, // 34 4
|
||||
{0x00, 0x27, 0x45, 0x45, 0x45, 0x39}, // 35 5
|
||||
{0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30}, // 36 6
|
||||
{0x00, 0x01, 0x71, 0x09, 0x05, 0x03}, // 37 7
|
||||
{0x00, 0x36, 0x49, 0x49, 0x49, 0x36}, // 38 8
|
||||
{0x00, 0x06, 0x49, 0x49, 0x29, 0x1e}, // 39 9
|
||||
{0x00, 0x00, 0x36, 0x36, 0x00, 0x00}, // 3a :
|
||||
{0x00, 0x00, 0x56, 0x36, 0x00, 0x00}, // 3b ;
|
||||
{0x00, 0x08, 0x14, 0x22, 0x41, 0x00}, // 3c <
|
||||
{0x00, 0x14, 0x14, 0x14, 0x14, 0x14}, // 3d =
|
||||
{0x00, 0x00, 0x41, 0x22, 0x14, 0x08}, // 3e >
|
||||
{0x00, 0x02, 0x01, 0x51, 0x09, 0x06}, // 3f ?
|
||||
{0x00, 0x32, 0x49, 0x79, 0x41, 0x3e}, // 40 @
|
||||
{0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e}, // 41 A
|
||||
{0x00, 0x7f, 0x49, 0x49, 0x49, 0x36}, // 42 B
|
||||
{0x00, 0x3e, 0x41, 0x41, 0x41, 0x22}, // 43 C
|
||||
{0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c}, // 44 D
|
||||
{0x00, 0x7f, 0x49, 0x49, 0x49, 0x41}, // 45 E
|
||||
{0x00, 0x7f, 0x09, 0x09, 0x09, 0x01}, // 46 F
|
||||
{0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a}, // 47 G
|
||||
{0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f}, // 48 H
|
||||
{0x00, 0x00, 0x41, 0x7f, 0x41, 0x00}, // 49 I
|
||||
{0x00, 0x20, 0x40, 0x41, 0x3f, 0x01}, // 4a J
|
||||
{0x00, 0x7f, 0x08, 0x14, 0x22, 0x41}, // 4b K
|
||||
{0x00, 0x7f, 0x40, 0x40, 0x40, 0x40}, // 4c L
|
||||
{0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f}, // 4d M
|
||||
{0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f}, // 4e N
|
||||
{0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e}, // 4f O
|
||||
{0x00, 0x7f, 0x09, 0x09, 0x09, 0x06}, // 50 P
|
||||
{0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e}, // 51 Q
|
||||
{0x00, 0x7f, 0x09, 0x19, 0x29, 0x46}, // 52 R
|
||||
{0x00, 0x46, 0x49, 0x49, 0x49, 0x31}, // 53 S
|
||||
{0x00, 0x01, 0x01, 0x7f, 0x01, 0x01}, // 54 T
|
||||
{0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f}, // 55 U
|
||||
{0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f}, // 56 V
|
||||
{0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f}, // 57 W
|
||||
{0x00, 0x63, 0x14, 0x08, 0x14, 0x63}, // 58 X
|
||||
{0x00, 0x07, 0x08, 0x70, 0x08, 0x07}, // 59 Y
|
||||
{0x00, 0x61, 0x51, 0x49, 0x45, 0x43}, // 5a Z
|
||||
{0x00, 0x00, 0x7f, 0x41, 0x41, 0x00}, // 5b [
|
||||
{0x00, 0x02, 0x04, 0x08, 0x10, 0x20}, // 5c ¥
|
||||
{0x00, 0x00, 0x41, 0x41, 0x7f, 0x00}, // 5d ]
|
||||
{0x00, 0x04, 0x02, 0x01, 0x02, 0x04}, // 5e ^
|
||||
{0x00, 0x40, 0x40, 0x40, 0x40, 0x40}, // 5f _
|
||||
{0x00, 0x00, 0x01, 0x02, 0x04, 0x00}, // 60 `
|
||||
{0x00, 0x20, 0x54, 0x54, 0x54, 0x78}, // 61 a
|
||||
{0x00, 0x7f, 0x48, 0x44, 0x44, 0x38}, // 62 b
|
||||
{0x00, 0x38, 0x44, 0x44, 0x44, 0x20}, // 63 c
|
||||
{0x00, 0x38, 0x44, 0x44, 0x48, 0x7f}, // 64 d
|
||||
{0x00, 0x38, 0x54, 0x54, 0x54, 0x18}, // 65 e
|
||||
{0x00, 0x08, 0x7e, 0x09, 0x01, 0x02}, // 66 f
|
||||
{0x00, 0x0c, 0x52, 0x52, 0x52, 0x3e}, // 67 g
|
||||
{0x00, 0x7f, 0x08, 0x04, 0x04, 0x78}, // 68 h
|
||||
{0x00, 0x00, 0x44, 0x7d, 0x40, 0x00}, // 69 i
|
||||
{0x00, 0x20, 0x40, 0x44, 0x3d, 0x00}, // 6a j
|
||||
{0x00, 0x7f, 0x10, 0x28, 0x44, 0x00}, // 6b k
|
||||
{0x00, 0x00, 0x41, 0x7f, 0x40, 0x00}, // 6c l
|
||||
{0x00, 0x7c, 0x04, 0x18, 0x04, 0x78}, // 6d m
|
||||
{0x00, 0x7c, 0x08, 0x04, 0x04, 0x78}, // 6e n
|
||||
{0x00, 0x38, 0x44, 0x44, 0x44, 0x38}, // 6f o
|
||||
{0x00, 0x7c, 0x14, 0x14, 0x14, 0x08}, // 70 p
|
||||
{0x00, 0x08, 0x14, 0x14, 0x18, 0x7c}, // 71 q
|
||||
{0x00, 0x7c, 0x08, 0x04, 0x04, 0x08}, // 72 r
|
||||
{0x00, 0x48, 0x54, 0x54, 0x54, 0x20}, // 73 s
|
||||
{0x00, 0x04, 0x3f, 0x44, 0x40, 0x20}, // 74 t
|
||||
{0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c}, // 75 u
|
||||
{0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c}, // 76 v
|
||||
{0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c}, // 77 w
|
||||
{0x00, 0x44, 0x28, 0x10, 0x28, 0x44}, // 78 x
|
||||
{0x00, 0x0c, 0x50, 0x50, 0x50, 0x3c}, // 79 y
|
||||
{0x00, 0x44, 0x64, 0x54, 0x4c, 0x44}, // 7a z
|
||||
{0x00, 0x00, 0x08, 0x36, 0x41, 0x00}, // 7b {
|
||||
{0x00, 0x00, 0x00, 0x7f, 0x00, 0x00}, // 7c |
|
||||
{0x00, 0x00, 0x41, 0x36, 0x08, 0x00}, // 7d }
|
||||
{0x00, 0x10, 0x08, 0x08, 0x10, 0x08}, // 7e ->
|
||||
{0x00, 0x78, 0x46, 0x41, 0x46, 0x78} // 7f <-
|
||||
};
|
||||
8
src/font.h
Normal file
8
src/font.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef __FONT_H__
|
||||
#define __FONT_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern uint8_t font5x7[][6]; // Font 5x7
|
||||
|
||||
#endif /* __FONT_H__ */
|
||||
129
src/main.c
129
src/main.c
@@ -7,6 +7,7 @@
|
||||
#include "bmlist.h"
|
||||
#include "resource.h"
|
||||
#include "animation.h"
|
||||
#include "font.h"
|
||||
|
||||
#include "power.h"
|
||||
#include "data.h"
|
||||
@@ -25,7 +26,8 @@
|
||||
(v) = (min)
|
||||
|
||||
enum MODES {
|
||||
NORMAL = 0,
|
||||
BOOT = 0,
|
||||
NORMAL,
|
||||
DOWNLOAD,
|
||||
POWER_OFF,
|
||||
MODES_COUNT,
|
||||
@@ -47,6 +49,8 @@ enum MODES {
|
||||
#define SCAN_BOOTLD_BTN (1 << 3)
|
||||
#define BLE_NEXT_STEP (1 << 4)
|
||||
|
||||
#define CHARGE_STT_PIN GPIO_Pin_0 // PA0
|
||||
|
||||
static tmosTaskID common_taskid = INVALID_TASK_ID ;
|
||||
|
||||
volatile uint16_t fb[LED_COLS] = {0};
|
||||
@@ -114,6 +118,8 @@ void poweroff()
|
||||
// Configure wake-up
|
||||
GPIOA_ModeCfg(KEY1_PIN, GPIO_ModeIN_PD);
|
||||
GPIOA_ITModeCfg(KEY1_PIN, GPIO_ITMode_RiseEdge);
|
||||
GPIOA_ModeCfg(CHARGE_STT_PIN, GPIO_ModeIN_PU);
|
||||
GPIOA_ITModeCfg(CHARGE_STT_PIN, GPIO_ITMode_FallEdge);
|
||||
PFIC_EnableIRQ(GPIO_A_IRQn);
|
||||
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
|
||||
|
||||
@@ -323,6 +329,115 @@ static void debug_init()
|
||||
UART1_BaudRateCfg(921600);
|
||||
}
|
||||
|
||||
uint16_t adcBuff[40];
|
||||
static int read_batt_raw()
|
||||
{
|
||||
int ret = 0;
|
||||
/* adc 1 - pa5 */
|
||||
PRINT("\n2.Single channel sampling...\n");
|
||||
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);
|
||||
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
|
||||
|
||||
int16_t RoughCalib_Value = ADC_DataCalib_Rough();
|
||||
PRINT("RoughCalib_Value =%d \n", RoughCalib_Value);
|
||||
|
||||
ADC_ChannelCfg(1);
|
||||
|
||||
for(int i = 0; i < 20; i++) {
|
||||
adcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;
|
||||
ret += adcBuff[i];
|
||||
}
|
||||
for(int i = 0; i < 20; i++) {
|
||||
PRINT("%d \n", adcBuff[i]);
|
||||
}
|
||||
|
||||
return ret / 20;
|
||||
}
|
||||
|
||||
static int is_charging()
|
||||
{
|
||||
GPIOA_ModeCfg(CHARGE_STT_PIN, GPIO_ModeIN_PU);
|
||||
return GPIOA_ReadPortPin(CHARGE_STT_PIN) == 0;
|
||||
}
|
||||
|
||||
static void disp_bat_stt(int bat_percent, int col, int row)
|
||||
{
|
||||
if (bat_percent < 0) {
|
||||
xbm2fb(&batwarn_xbm, fb, col, row);
|
||||
return;
|
||||
}
|
||||
|
||||
xbm2fb(&bat_xbm, fb, col, row);
|
||||
bat_percent /= 10;
|
||||
for (int i=1; i <= bat_percent; i++) {
|
||||
fb[col + i] = fb[col];
|
||||
}
|
||||
}
|
||||
|
||||
#define ZERO_PERCENT_THRES (3.3)
|
||||
#define _100_PERCENT_THRES (4.2)
|
||||
#define ADC_MAX_VAL (4096.0) // 12 bit
|
||||
#define ADC_MAX_VOLT (2.1) // Volt
|
||||
#define R1 (182.0) // kOhm
|
||||
#define R2 (100.0) // kOhm
|
||||
#define PERCENT_RANGE (_100_PERCENT_THRES - ZERO_PERCENT_THRES)
|
||||
#define VOLT_DIV(v) ((v) / (R1 + R2) * R2) // Voltage divider
|
||||
#define VOLT_DIV_INV(v) ((v) / R2 * (R1 + R2)) // .. Inverse
|
||||
#define ADC2VOLT(raw) ((raw) / ADC_MAX_VAL * ADC_MAX_VOLT)
|
||||
#define VOLT2ADC(volt) ((volt) / ADC_MAX_VOLT * ADC_MAX_VAL)
|
||||
|
||||
static int bat_raw2percent(int r)
|
||||
{
|
||||
float vadc = ADC2VOLT(r);
|
||||
float vbat = VOLT_DIV_INV(vadc);
|
||||
float strip = vbat - ZERO_PERCENT_THRES;
|
||||
if (strip < PERCENT_RANGE) {
|
||||
// Negative values meaning the battery is not connected or died
|
||||
return (int)(strip / PERCENT_RANGE * 100.0);
|
||||
}
|
||||
return 100;
|
||||
}
|
||||
|
||||
static void fb_putchar(char c, int col, int row)
|
||||
{
|
||||
for (int i=0; i < 6; i++) {
|
||||
if (col + i >= LED_COLS) break;
|
||||
fb[col + i] = (fb[col + i] & ~(0x7f << row))
|
||||
| (font5x7[c - ' '][i] << row);
|
||||
}
|
||||
}
|
||||
|
||||
static void fb_puts(char *s, int len, int col, int row)
|
||||
{
|
||||
while (*s && len--) {
|
||||
fb_putchar(*s, col, row);
|
||||
col += 6;
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
static void disp_charging()
|
||||
{
|
||||
int blink = 0;
|
||||
while (mode == BOOT) {
|
||||
int percent = bat_raw2percent(read_batt_raw());
|
||||
|
||||
if (is_charging()) {
|
||||
disp_bat_stt(blink ? percent : 0, 2, 2);
|
||||
if (ani_xbm_next_frame(&fabm_xbm, fb, 16, 0) == 0) {
|
||||
fb_puts("v0.1", 4, 16, 2); // TODO: get version from git tag
|
||||
fb_putchar(' ', 40, 2);
|
||||
}
|
||||
blink = !blink;
|
||||
DelayMs(500);
|
||||
} else {
|
||||
disp_bat_stt(percent, 7, 2);
|
||||
DelayMs(500);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
SetSysClock(CLK_SOURCE_PLL_60MHz);
|
||||
@@ -340,19 +455,23 @@ int main()
|
||||
PFIC_EnableIRQ(TMR0_IRQn);
|
||||
|
||||
bmlist_init(LED_COLS * 4);
|
||||
|
||||
play_splash(&splash, 0, 0);
|
||||
|
||||
load_bmlist();
|
||||
|
||||
btn_init();
|
||||
btn_onOnePress(KEY1, change_mode);
|
||||
btn_onOnePress(KEY2, bm_transition);
|
||||
btn_onLongPress(KEY1, change_brightness);
|
||||
|
||||
disp_charging();
|
||||
|
||||
play_splash(&splash, 0, 0);
|
||||
|
||||
load_bmlist();
|
||||
|
||||
ble_setup();
|
||||
|
||||
spawn_tasks();
|
||||
|
||||
mode = NORMAL;
|
||||
while (1) {
|
||||
handle_mode_transition();
|
||||
TMOS_SystemProcess();
|
||||
|
||||
5
src/res/bat-icon.xbm
Normal file
5
src/res/bat-icon.xbm
Normal file
@@ -0,0 +1,5 @@
|
||||
#define bat_icon_width 13
|
||||
#define bat_icon_height 7
|
||||
static unsigned char bat_icon_bits[] = {
|
||||
0xff, 0x0f, 0x01, 0x08, 0x01, 0x18, 0x01, 0x18, 0x01, 0x18, 0x01, 0x08,
|
||||
0xff, 0x0f };
|
||||
5
src/res/bat-warn-icon.xbm
Normal file
5
src/res/bat-warn-icon.xbm
Normal file
@@ -0,0 +1,5 @@
|
||||
#define bat_warn_icon_width 13
|
||||
#define bat_warn_icon_height 7
|
||||
static unsigned char bat_warn_icon_bits[] = {
|
||||
0xff, 0x0f, 0x01, 0x08, 0x01, 0x18, 0xf5, 0x1b, 0x01, 0x18, 0x01, 0x08,
|
||||
0xff, 0x0f };
|
||||
14
src/res/fossasia-badgemagic-ani.xbm
Normal file
14
src/res/fossasia-badgemagic-ani.xbm
Normal file
@@ -0,0 +1,14 @@
|
||||
#define fossasia_badgemagic_ani_width 26
|
||||
#define fossasia_badgemagic_ani_height 33
|
||||
static unsigned char fossasia_badgemagic_ani_bits[] = {
|
||||
0x9c, 0xc7, 0xe7, 0x03, 0x42, 0x28, 0x10, 0x00, 0x5f, 0xc8, 0xe3, 0x01,
|
||||
0x42, 0x08, 0x04, 0x02, 0x82, 0xe7, 0xf3, 0x01, 0x02, 0x00, 0x00, 0x00,
|
||||
0x3e, 0x7c, 0xf2, 0x01, 0x40, 0x02, 0x02, 0x02, 0x7e, 0x3c, 0xf2, 0x03,
|
||||
0x42, 0x40, 0x12, 0x02, 0x7c, 0x3e, 0xe2, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x73, 0x9c, 0x03,
|
||||
0xa2, 0x94, 0x42, 0x00, 0x9e, 0x94, 0xc2, 0x01, 0xa2, 0x97, 0x5a, 0x00,
|
||||
0xa2, 0x94, 0x52, 0x00, 0x9e, 0x74, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x22, 0xe3, 0xce, 0x01, 0xb6, 0x14, 0x24, 0x00,
|
||||
0xaa, 0x14, 0x24, 0x00, 0xa2, 0xd7, 0x24, 0x00, 0xa2, 0x94, 0x24, 0x00,
|
||||
0xa2, 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
#include "res/bluetooth.xbm"
|
||||
#include "res/foss-asia-2.xbm"
|
||||
#include "res/bat-icon.xbm"
|
||||
#include "res/bat-warn-icon.xbm"
|
||||
#include "res/fossasia-badgemagic-ani.xbm"
|
||||
|
||||
xbm_t bluetooth = {
|
||||
.bits = bluetooth_bits,
|
||||
@@ -15,4 +18,25 @@ xbm_t splash = {
|
||||
.w = foss_asia_2_width,
|
||||
.h = foss_asia_2_height,
|
||||
.fh = 11
|
||||
};
|
||||
|
||||
xbm_t bat_xbm = {
|
||||
.bits = bat_icon_bits,
|
||||
.w = bat_icon_width,
|
||||
.h = bat_icon_height,
|
||||
.fh = 11
|
||||
};
|
||||
|
||||
xbm_t batwarn_xbm = {
|
||||
.bits = bat_warn_icon_bits,
|
||||
.w = bat_warn_icon_width,
|
||||
.h = bat_warn_icon_height,
|
||||
.fh = 11
|
||||
};
|
||||
|
||||
xbm_t fabm_xbm = {
|
||||
.bits = fossasia_badgemagic_ani_bits,
|
||||
.w = fossasia_badgemagic_ani_width,
|
||||
.h = fossasia_badgemagic_ani_height,
|
||||
.fh = 11
|
||||
};
|
||||
@@ -6,5 +6,8 @@
|
||||
|
||||
extern xbm_t bluetooth;
|
||||
extern xbm_t splash;
|
||||
extern xbm_t bat_xbm;
|
||||
extern xbm_t batwarn_xbm;
|
||||
extern xbm_t fabm_xbm; // FOSSASIA-BADGEMAGIC animation
|
||||
|
||||
#endif /* __RES_H__ */
|
||||
|
||||
Reference in New Issue
Block a user