Skip to content

Commit

Permalink
Merge pull request fossasia#50 from kienvo/batt-indicator
Browse files Browse the repository at this point in the history
feat: Charging status
  • Loading branch information
fcartegnie authored Oct 4, 2024
2 parents 88f4bca + 907bf59 commit bb33a6d
Show file tree
Hide file tree
Showing 9 changed files with 284 additions and 5 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ src/usb/composite/cdc-serial.c \
src/xbm.c \
src/resource.c \
src/animation.c \
src/font.c \


# ASM sources
Expand Down
100 changes: 100 additions & 0 deletions src/font.c
Original file line number Diff line number Diff line change
@@ -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 changes: 8 additions & 0 deletions src/font.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __FONT_H__
#define __FONT_H__

#include <stdint.h>

extern uint8_t font5x7[][6]; // Font 5x7

#endif /* __FONT_H__ */
129 changes: 124 additions & 5 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "bmlist.h"
#include "resource.h"
#include "animation.h"
#include "font.h"

#include "power.h"
#include "data.h"
Expand All @@ -25,7 +26,8 @@
(v) = (min)

enum MODES {
NORMAL = 0,
BOOT = 0,
NORMAL,
DOWNLOAD,
POWER_OFF,
MODES_COUNT,
Expand All @@ -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};
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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();
Expand Down
5 changes: 5 additions & 0 deletions src/res/bat-icon.xbm
Original file line number Diff line number Diff line change
@@ -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 changes: 5 additions & 0 deletions src/res/bat-warn-icon.xbm
Original file line number Diff line number Diff line change
@@ -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 changes: 14 additions & 0 deletions src/res/fossasia-badgemagic-ani.xbm
Original file line number Diff line number Diff line change
@@ -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 };
24 changes: 24 additions & 0 deletions src/resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
};
3 changes: 3 additions & 0 deletions src/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__ */

0 comments on commit bb33a6d

Please sign in to comment.