MPyATE_Firmware/src/app_sys_utils.c
Yilin Sun 6d1eca00f2
All checks were successful
continuous-integration/drone/push Build is passing
Added LED controls.
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-06-03 16:35:53 +08:00

130 lines
3.2 KiB
C

/* App */
#include "app_led.h"
#include "app_reg_if.h"
/* Private */
#include "app_sys_utils.h"
#define APP_SYS_REG_OFFSET_CFG (0x00U)
#define APP_SYS_REG_OFFSET_AUX (0x01U)
#define APP_SYS_REG_OFFSET_VER (0x0EU)
#define APP_SYS_REG_OFFSET_ID (0x0FU)
#define APP_SYS_CONST_ID (0xEACEU)
#define APP_SYS_CONST_VER (0x0000U)
#define APP_SYS_CFG_RST_Pos (15U)
#define APP_SYS_CFG_RST_Msk (1U << APP_SYS_CFG_RST_Pos)
#define APP_SYS_AUX_LED_R_Pos (0U)
#define APP_SYS_AUX_LED_R_Msk (1U << APP_SYS_AUX_LED_R_Pos)
#define APP_SYS_AUX_LED_G_Pos (1U)
#define APP_SYS_AUX_LED_G_Msk (1U << APP_SYS_AUX_LED_G_Pos)
#define APP_SYS_AUX_LED_B_Pos (2U)
#define APP_SYS_AUX_LED_B_Msk (1U << APP_SYS_AUX_LED_B_Pos)
static inline uint16_t app_sys_utils_read_reg_cfg(void);
static inline uint16_t app_sys_utils_read_reg_aux(void);
static inline uint16_t app_sys_utils_read_reg_ver(void);
static inline uint16_t app_sys_utils_read_reg_id(void);
static inline void app_sys_utils_write_reg_cfg(uint16_t data);
static inline void app_sys_utils_write_reg_aux(uint16_t data);
void app_sys_utils_init(void) {
app_led_off(APP_LED_RED);
app_led_off(APP_LED_GREEN);
app_led_off(APP_LED_BLUE);
}
uint16_t app_sys_utils_module_reg_read(uint8_t addr) {
uint16_t ret = 0x5555;
switch (addr) {
case APP_SYS_REG_OFFSET_CFG:
ret = app_sys_utils_read_reg_cfg();
break;
case APP_SYS_REG_OFFSET_AUX:
ret = app_sys_utils_read_reg_aux();
break;
case APP_SYS_REG_OFFSET_VER:
ret = app_sys_utils_read_reg_ver();
break;
case APP_SYS_REG_OFFSET_ID:
ret = app_sys_utils_read_reg_id();
break;
default:
break;
}
return ret;
}
void app_sys_utils_module_reg_write(uint8_t addr, uint16_t data) {
switch (addr) {
case APP_SYS_REG_OFFSET_CFG:
app_sys_utils_write_reg_cfg(data);
break;
case APP_SYS_REG_OFFSET_AUX:
app_sys_utils_write_reg_aux(data);
break;
default:
break;
}
}
static inline uint16_t app_sys_utils_read_reg_cfg(void) {
return 0x0000U;
}
static inline uint16_t app_sys_utils_read_reg_aux(void) {
uint16_t ret = 0x0000U;
if (app_led_status(APP_LED_RED)) {
ret |= APP_SYS_AUX_LED_R_Msk;
}
if (app_led_status(APP_LED_GREEN)) {
ret |= APP_SYS_AUX_LED_G_Msk;
}
if (app_led_status(APP_LED_BLUE)) {
ret |= APP_SYS_AUX_LED_B_Msk;
}
return ret;
}
static inline uint16_t app_sys_utils_read_reg_ver(void) {
return APP_SYS_CONST_VER;
}
static inline uint16_t app_sys_utils_read_reg_id(void) {
return APP_SYS_CONST_ID;
}
static inline void app_sys_utils_write_reg_cfg(uint16_t data) {
if (data & APP_SYS_CFG_RST_Msk) {
NVIC_SystemReset();
}
}
static inline void app_sys_utils_write_reg_aux(uint16_t data) {
if (data & APP_SYS_AUX_LED_R_Msk) {
app_led_on(APP_LED_RED);
} else {
app_led_off(APP_LED_RED);
}
if (data & APP_SYS_AUX_LED_G_Msk) {
app_led_on(APP_LED_GREEN);
} else {
app_led_off(APP_LED_GREEN);
}
if (data & APP_LED_BLUE) {
app_led_on(APP_LED_BLUE);
} else {
app_led_off(APP_LED_BLUE);
}
}