implemented auto-dim, fixed up idle / sleep stuff
This commit is contained in:
parent
ea3f6ae9e0
commit
2eeb952b10
|
@ -69,27 +69,28 @@ void aw20x_init(struct AW20x *aw, uint8_t addr, uint8_t cols, uint8_t rows, uint
|
|||
aw->config = imax & AW20X_CONF_IMAX_MASK;
|
||||
|
||||
// wake up (and set page to config page)
|
||||
aw20x_sleep(aw, 0);
|
||||
aw20x_set_sleep(aw, 0);
|
||||
|
||||
// enabled columns
|
||||
aw_buf[0] = cols - 1;
|
||||
while (AW20X_I2C_busy());
|
||||
AW20X_I2C_writereg(aw->addr, AW20X_REG_SIZE, aw_buf, 1);
|
||||
|
||||
// general config
|
||||
aw_buf[0] = imax & AW20X_CONF_IMAX_MASK;
|
||||
AW20X_I2C_writereg(aw->addr, AW20X_REG_GCCR, aw_buf, 1);
|
||||
while (AW20X_I2C_busy());
|
||||
AW20X_I2C_writereg(aw->addr, AW20X_REG_GCCR, aw_buf, 1);
|
||||
}
|
||||
|
||||
void aw20x_sleep(struct AW20x *aw, uint8_t sleep)
|
||||
void aw20x_set_sleep(struct AW20x *aw, uint8_t sleep)
|
||||
{
|
||||
// make sure we're on the config page
|
||||
AW20X_SET_PAGE(AW20X_PAGE0_CONFIG);
|
||||
// don't touch the buffer until we are allowed
|
||||
while (AW20X_I2C_busy());
|
||||
|
||||
aw_buf[0] = sleep ? AW20X_SLPCR_SLEEP : 0;
|
||||
|
||||
// send sleep bit
|
||||
aw_buf[0] = sleep ? AW20X_SLPCR_SLEEP : 0;
|
||||
while (AW20X_I2C_busy());
|
||||
AW20X_I2C_writereg(aw->addr, AW20X_REG_SLPCR, aw_buf, 1);
|
||||
|
||||
// set state
|
||||
|
@ -102,9 +103,16 @@ void aw20x_sleep(struct AW20x *aw, uint8_t sleep)
|
|||
|
||||
void aw20x_set_imax(struct AW20x *aw, uint8_t imax)
|
||||
{
|
||||
// make sure we're on the config page
|
||||
AW20X_SET_PAGE(AW20X_PAGE0_CONFIG);
|
||||
|
||||
// todo: implement
|
||||
aw_buf[0] = imax & AW20X_CONF_IMAX_MASK;
|
||||
|
||||
// send imax
|
||||
while (AW20X_I2C_busy());
|
||||
AW20X_I2C_writereg(aw->addr, AW20X_REG_GCCR, aw_buf, 1);
|
||||
|
||||
aw->config = imax & AW20X_CONF_IMAX_MASK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -181,7 +181,8 @@ typedef struct AW20x {
|
|||
|
||||
void aw20x_init(struct AW20x *aw, uint8_t addr, uint8_t cols, uint8_t rows, uint8_t imax);
|
||||
|
||||
void aw20x_sleep(struct AW20x *aw, uint8_t sleep);
|
||||
void aw20x_set_sleep(struct AW20x *aw, uint8_t sleep);
|
||||
void aw20x_set_imax(struct AW20x *aw, uint8_t imax);
|
||||
|
||||
void aw20x_set_fade(struct AW20x *aw);
|
||||
void aw20x_set_dim_global(struct AW20x *aw, uint8_t dim);
|
||||
|
|
|
@ -159,3 +159,13 @@ void rgbled_runprog(uint8_t tick_ctr)
|
|||
led_matrix_needs_update = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void rgbled_set_imax_normal()
|
||||
{
|
||||
aw20x_set_imax(&awled, RGBLED_BRT_STANDARD);
|
||||
}
|
||||
|
||||
void rgbled_set_imax_dim()
|
||||
{
|
||||
aw20x_set_imax(&awled, RGBLED_BRT_DIMMED);
|
||||
}
|
||||
|
|
|
@ -22,11 +22,8 @@
|
|||
|
||||
#define RGBLED_COUNT 12
|
||||
|
||||
#define RGB_STR_UNUSED rgb_str_unused
|
||||
#define RGB_STR_RESERVED rgb_str_reserved
|
||||
#define RGB_STR_INCREMENT rgb_str_increment
|
||||
#define RGB_STR_DELAY rgb_str_delay
|
||||
#define RGB_STR_BRIGHTNESS rgb_str_brightness
|
||||
#define RGBLED_BRT_STANDARD AW20X_IMAX_13_3MA
|
||||
#define RGBLED_BRT_DIMMED AW20X_IMAX_3_3MA
|
||||
|
||||
|
||||
|
||||
|
@ -38,12 +35,20 @@ typedef struct LedProgram {
|
|||
|
||||
|
||||
|
||||
#define RGB_STR_UNUSED rgb_str_unused
|
||||
#define RGB_STR_RESERVED rgb_str_reserved
|
||||
#define RGB_STR_INCREMENT rgb_str_increment
|
||||
#define RGB_STR_DELAY rgb_str_delay
|
||||
#define RGB_STR_BRIGHTNESS rgb_str_brightness
|
||||
|
||||
extern const uint8_t rgb_str_unused[];
|
||||
extern const uint8_t rgb_str_reserved[];
|
||||
extern const uint8_t rgb_str_increment[];
|
||||
extern const uint8_t rgb_str_delay[];
|
||||
extern const uint8_t rgb_str_brightness[];
|
||||
|
||||
|
||||
|
||||
extern const uint8_t rgb_map[RGBLED_COUNT];
|
||||
extern const LedProgram rgb_pgm[6];
|
||||
|
||||
|
@ -56,6 +61,9 @@ void rgbled_init();
|
|||
void rgbled_send();
|
||||
void rgbled_runprog(uint8_t tick_ctr);
|
||||
|
||||
void rgbled_set_imax_normal();
|
||||
void rgbled_set_imax_dim();
|
||||
|
||||
|
||||
|
||||
#endif /* USER_LED_RGBLED_H_ */
|
||||
|
|
|
@ -19,6 +19,9 @@
|
|||
* - implementing USB interface (once I get time)
|
||||
* - implementing BLE (maybe)
|
||||
*
|
||||
* todo:
|
||||
* - decouple oled render routine from interrupt off time. not an issue for now...
|
||||
*
|
||||
*/
|
||||
|
||||
#include <hw/ch32sub.h>
|
||||
|
@ -55,6 +58,14 @@
|
|||
#define PROG_TICK_RATE ((32768-8192-4096) / 256) // not sure why this value can't be 32768/256
|
||||
// this was checked with a stopwatch and is close enough
|
||||
// this value IS FRAMERATE DEPENDENT for some reason... figure it out later
|
||||
#define IDLE_SLEEP_START (1 << 0)
|
||||
#define IDLE_MENU_START (1 << 1)
|
||||
#define IDLE_DIM_START (1 << 2)
|
||||
#define IDLE_SLEEP_READY (1 << 4)
|
||||
#define IDLE_MENU_READY (1 << 5)
|
||||
#define IDLE_DIM_READY (1 << 6)
|
||||
|
||||
|
||||
|
||||
const uint8_t vers[] = "241026b";
|
||||
|
||||
|
@ -68,9 +79,8 @@ uint16_t uptime_hour;
|
|||
uint8_t uptime_min;
|
||||
uint8_t uptime_sec;
|
||||
|
||||
uint32_t idle_time_menu;
|
||||
uint32_t idle_time_still;
|
||||
uint8_t idle_go_sleep;
|
||||
uint32_t idle_time = 0;
|
||||
uint8_t idle_flags;
|
||||
|
||||
|
||||
static volatile uint8_t flags_lo = 0;
|
||||
|
@ -136,6 +146,25 @@ void systick_init(void)
|
|||
SysTick->CTLR = SysTick_CTLR_STCLK | SysTick_CTLR_STE; // enable counter in /1 mode
|
||||
}
|
||||
|
||||
|
||||
static void idle_clear()
|
||||
{
|
||||
if (idle_flags & IDLE_SLEEP_READY) {
|
||||
// wake up things
|
||||
ssd1306_set_display(1);
|
||||
|
||||
uconf.flags &= ~UCONF_FLAGS_LEDS_DISABLE;
|
||||
rgbled_send();
|
||||
}
|
||||
|
||||
if (idle_flags & IDLE_DIM_READY) {
|
||||
rgbled_set_imax_normal();
|
||||
}
|
||||
|
||||
idle_flags = 0;
|
||||
idle_time = 0;
|
||||
}
|
||||
|
||||
__HIGH_CODE
|
||||
void oled_update_done()
|
||||
{
|
||||
|
@ -180,15 +209,19 @@ void oled_update_done()
|
|||
// power saving
|
||||
// todo: don't hardcode the movement values
|
||||
if (accel_get_movement() > 3) {
|
||||
idle_go_sleep = 0;
|
||||
|
||||
idle_time_still = 0;
|
||||
idle_time_menu = 0;
|
||||
idle_clear();
|
||||
}
|
||||
|
||||
// start going to sleep if the option is enabled and if we've been still for enough time
|
||||
if (uconf.sleep_timeout && (idle_time_still > uconf.sleep_timeout)) {
|
||||
idle_go_sleep = 1;
|
||||
if (uconf.sleep_timeout && (idle_time == uconf.sleep_timeout)) {
|
||||
idle_flags |= IDLE_SLEEP_START;
|
||||
}
|
||||
if (uconf.menu_timeout && (idle_time == uconf.menu_timeout)) {
|
||||
idle_flags |= IDLE_MENU_START;
|
||||
}
|
||||
if (uconf.dim_timeout && (idle_time == uconf.dim_timeout)) {
|
||||
rgbled_set_imax_dim();
|
||||
idle_flags |= IDLE_DIM_START | IDLE_DIM_READY;
|
||||
}
|
||||
|
||||
|
||||
|
@ -239,7 +272,25 @@ void lowprio_task() {
|
|||
|
||||
// todo: implement proper sleep mode that saves power
|
||||
// and wakes up on interrupt, instead of this
|
||||
if (!idle_go_sleep) {
|
||||
if (idle_flags & IDLE_SLEEP_START) {
|
||||
if (!(idle_flags & IDLE_SLEEP_READY)) {
|
||||
idle_flags |= IDLE_SLEEP_READY;
|
||||
|
||||
// just entered the mode? then turn things off
|
||||
ssd1306_set_display(0);
|
||||
|
||||
uconf.flags |= UCONF_FLAGS_LEDS_DISABLE;
|
||||
rgbled_send();
|
||||
} else {
|
||||
// check to see if we should wake
|
||||
if (accel_get_movement() > 3) {
|
||||
idle_clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// run normal program
|
||||
else {
|
||||
// temporary: re-send sub interrupts, sub button holds, enable rgb_hwen
|
||||
if (flags_lo & FLAG_CH32V_RESEND_CONF) {
|
||||
flags_lo &= ~FLAG_CH32V_RESEND_CONF;
|
||||
|
@ -301,36 +352,6 @@ void lowprio_task() {
|
|||
// now run a program
|
||||
rgbled_runprog(st_tick >> 2);
|
||||
}
|
||||
} else {
|
||||
switch (idle_go_sleep) {
|
||||
case 1: {
|
||||
idle_go_sleep++;
|
||||
|
||||
// just entered the mode? then turn things off
|
||||
ssd1306_set_display(0);
|
||||
|
||||
uconf.flags |= UCONF_FLAGS_LEDS_DISABLE;
|
||||
rgbled_send();
|
||||
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
// check to see if we should wake
|
||||
if (accel_get_movement() > 3) {
|
||||
idle_go_sleep = 0;
|
||||
|
||||
idle_time_still = 0;
|
||||
idle_time_menu = 0;
|
||||
|
||||
// wake up things
|
||||
ssd1306_set_display(1);
|
||||
|
||||
uconf.flags &= ~UCONF_FLAGS_LEDS_DISABLE;
|
||||
rgbled_send();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// re-enable IRQs
|
||||
|
@ -405,8 +426,7 @@ void RTC_IRQHandler(void)
|
|||
flags_lo |= FLAG_CH32V_RESEND_CONF;
|
||||
}
|
||||
|
||||
idle_time_still++;
|
||||
idle_time_menu++;
|
||||
idle_time++;
|
||||
}
|
||||
|
||||
oled_tick++;
|
||||
|
|
Loading…
Reference in New Issue