mirror of
https://github.com/No-Chicken/Power-Pico.git
synced 2026-04-03 13:02:36 +08:00
加入电压电流数据传输的消息队列,取消直接访问变量
This commit is contained in:
@@ -8,7 +8,12 @@
|
|||||||
|
|
||||||
#include "./ui_helpers.h"
|
#include "./ui_helpers.h"
|
||||||
|
|
||||||
///////////////////// ui help funtions ////////////////////
|
///////////////////// ui variables ////////////////////
|
||||||
|
|
||||||
|
float ui_current_voltage = 0.0f; // 当前电压,单位 V
|
||||||
|
float ui_current_current = 0.0f; // 当前电流,单位 uA
|
||||||
|
|
||||||
|
///////////////////// ui help functions ////////////////////
|
||||||
|
|
||||||
void ui_full_screen_refresh(lv_obj_t * screen) {
|
void ui_full_screen_refresh(lv_obj_t * screen) {
|
||||||
// 标记整个屏幕为脏区域
|
// 标记整个屏幕为脏区域
|
||||||
@@ -60,7 +65,12 @@ uint16_t ui_get_display_rotation(void) {
|
|||||||
|
|
||||||
// 获取当前电压, 单位 V; 当前电流, 单位 uA
|
// 获取当前电压, 单位 V; 当前电流, 单位 uA
|
||||||
void ui_get_vol_cur(float *voltage, float *current) {
|
void ui_get_vol_cur(float *voltage, float *current) {
|
||||||
Data_Monitor_Get_Values(voltage, current);
|
if (voltage != NULL) {
|
||||||
|
*voltage = ui_current_voltage;
|
||||||
|
}
|
||||||
|
if (current != NULL) {
|
||||||
|
*current = ui_current_current;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////// set functions ///////////////
|
//////////////// set functions ///////////////
|
||||||
@@ -85,8 +95,15 @@ void ui_set_display_rotation(uint16_t rotation) {
|
|||||||
Sys_Set_Rotation(rotation);
|
Sys_Set_Rotation(rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置 UI 层的电压电流变量, 供 UI 层显示使用, 单位分别为 V 和 uA
|
||||||
|
void ui_update_vol_cur_varables(float voltage, float current) {
|
||||||
|
ui_current_voltage = voltage;
|
||||||
|
ui_current_current = current;
|
||||||
|
}
|
||||||
|
|
||||||
void ui_clear_data_monitor(void) {
|
void ui_clear_data_monitor(void) {
|
||||||
Data_Monitor_Clear();
|
// 不能直接访问其他层的数据,to be write
|
||||||
|
// Data_Monitor_Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////// sys save functions ///////////////
|
//////////////// sys save functions ///////////////
|
||||||
|
|||||||
@@ -11,7 +11,12 @@ extern "C" {
|
|||||||
#include "lvgl.h"
|
#include "lvgl.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
|
|
||||||
///////////////////// help funtions ////////////////////
|
///////////////////// ui variables ////////////////////
|
||||||
|
|
||||||
|
extern float ui_current_voltage;
|
||||||
|
extern float ui_current_current;
|
||||||
|
|
||||||
|
///////////////////// help functions ////////////////////
|
||||||
|
|
||||||
void ui_full_screen_refresh(lv_obj_t * screen);
|
void ui_full_screen_refresh(lv_obj_t * screen);
|
||||||
|
|
||||||
@@ -34,6 +39,7 @@ void ui_set_back_light_level(uint8_t level);
|
|||||||
void ui_set_key_sound_enable(bool enable);
|
void ui_set_key_sound_enable(bool enable);
|
||||||
void ui_set_language_select(uint8_t lang);
|
void ui_set_language_select(uint8_t lang);
|
||||||
void ui_set_display_rotation(uint16_t rotation);
|
void ui_set_display_rotation(uint16_t rotation);
|
||||||
|
void ui_update_vol_cur_varables(float voltage, float current);
|
||||||
void ui_clear_data_monitor(void);
|
void ui_clear_data_monitor(void);
|
||||||
|
|
||||||
// sys save function
|
// sys save function
|
||||||
|
|||||||
@@ -8,18 +8,26 @@ extern "C" {
|
|||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
|
||||||
// 定义一个标志位,表示 ADC 数据已经准备好,可以发送了
|
// 用于数据传输的结构体,包含电压和电流
|
||||||
|
// 流向为 MessageSendTask -> LVGLtask
|
||||||
|
typedef struct {
|
||||||
|
float voltage; // 电压 (V)
|
||||||
|
float current; // 电流 (uA)
|
||||||
|
} PowerData_t;
|
||||||
|
|
||||||
|
// 定义一个标志位,表示 ADC 数据已经准备好,在ADC DMA中断中被置位
|
||||||
|
// 在 MessageSendTask 中等待这个标志位,表示可以发送 ADC 数据了
|
||||||
#define FLAG_ADC_HALF_READY 0x0001U // 0000 0001
|
#define FLAG_ADC_HALF_READY 0x0001U // 0000 0001
|
||||||
#define FLAG_ADC_FULL_READY 0x0002U // 0000 0010
|
#define FLAG_ADC_FULL_READY 0x0002U // 0000 0010
|
||||||
|
|
||||||
extern osThreadId_t MessageSendTaskHandle; // 用于发送 ADC 数据的任务句柄
|
extern osThreadId_t MessageSendTaskHandle;
|
||||||
|
|
||||||
extern osMessageQueueId_t Key_MessageQueue;
|
extern osMessageQueueId_t Key_MessageQueue;
|
||||||
extern osMessageQueueId_t PD_cmd_MessageQueue;
|
extern osMessageQueueId_t PD_cmd_MessageQueue;
|
||||||
extern osMessageQueueId_t PD_handle_event_MsgQueue;
|
extern osMessageQueueId_t PD_handle_event_MsgQueue;
|
||||||
|
extern osMessageQueueId_t PowerDataQueue;
|
||||||
|
|
||||||
void User_Tasks_Init(void);
|
void User_Tasks_Init(void);
|
||||||
void TaskTickHook(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
//gui
|
//gui
|
||||||
#include "lvgl.h"
|
#include "lvgl.h"
|
||||||
#include "lv_lib_pm.h"
|
#include "lv_lib_pm.h"
|
||||||
|
#include "ui.h"
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
|
||||||
@@ -41,11 +42,18 @@ void TaskTickHook(void)
|
|||||||
void LvHandlerTask(void *argument)
|
void LvHandlerTask(void *argument)
|
||||||
{
|
{
|
||||||
key_event_t key_event;
|
key_event_t key_event;
|
||||||
|
PowerData_t power_data;
|
||||||
uint32_t _time = 1; // default delay time
|
uint32_t _time = 1; // default delay time
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(osMessageQueueGet(Key_MessageQueue, &key_event, NULL, 1)==osOK) {
|
// 按键事件处理
|
||||||
|
if(osMessageQueueGet(Key_MessageQueue, &key_event, NULL, 0)==osOK) {
|
||||||
lv_lib_pm_handle_key_event(&key_event);
|
lv_lib_pm_handle_key_event(&key_event);
|
||||||
|
}
|
||||||
|
// 数据更新处理
|
||||||
|
if(osMessageQueueGet(PowerDataQueue, &power_data, NULL, 0)==osOK) {
|
||||||
|
// 刷新UI层的电压电流数据变量
|
||||||
|
ui_update_vol_cur_varables(power_data.voltage, power_data.current);
|
||||||
}
|
}
|
||||||
_time = lv_timer_handler();
|
_time = lv_timer_handler();
|
||||||
osDelay(_time);
|
osDelay(_time);
|
||||||
|
|||||||
@@ -71,5 +71,20 @@ void MessageSendTask(void *argument)
|
|||||||
{
|
{
|
||||||
Process_ADC_Chunk(&adc_raw_buffer[ADC_TIMES][0], 1);
|
Process_ADC_Chunk(&adc_raw_buffer[ADC_TIMES][0], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 发送数据给UI层进行显示
|
||||||
|
PowerData_t newData;
|
||||||
|
Data_Monitor_Get_Values(&newData.voltage, &newData.current);
|
||||||
|
|
||||||
|
// 尝试发送,如果不等待直接返回错误,说明队列可能满了
|
||||||
|
osStatus_t status = osMessageQueuePut(PowerDataQueue, &newData, 0, 0);
|
||||||
|
|
||||||
|
if (status == osErrorResource) {
|
||||||
|
PowerData_t dummy;
|
||||||
|
// 1. 强行从队列头部取出一个旧数据(丢弃)
|
||||||
|
osMessageQueueGet(PowerDataQueue, &dummy, NULL, 0);
|
||||||
|
// 2. 再次存入新数据
|
||||||
|
osMessageQueuePut(PowerDataQueue, &newData, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,13 +83,23 @@ const osThreadAttr_t LvHandlerTask_attributes = {
|
|||||||
|
|
||||||
|
|
||||||
/* Message queues ------------------------------------------------------------*/
|
/* Message queues ------------------------------------------------------------*/
|
||||||
|
|
||||||
// Key task 中发送出的按键信息的消息队列
|
// Key task 中发送出的按键信息的消息队列
|
||||||
|
// 流向为 KeyTask -> LVGLtask
|
||||||
osMessageQueueId_t Key_MessageQueue;
|
osMessageQueueId_t Key_MessageQueue;
|
||||||
|
|
||||||
// UI layer发送给PDUFPTask任务的命令消息队列
|
// UI layer发送给PDUFPTask任务的命令消息队列
|
||||||
|
// 流向为 LVGLtask -> PDUFPTask
|
||||||
osMessageQueueId_t PD_cmd_MessageQueue;
|
osMessageQueueId_t PD_cmd_MessageQueue;
|
||||||
|
|
||||||
// PDUFPTask任务发送给UI层的通知处理情况的消息队列
|
// PDUFPTask任务发送给UI层的通知处理情况的消息队列
|
||||||
|
// 流向为 PDUFPTask -> LVGLtask
|
||||||
osMessageQueueId_t PD_handle_event_MsgQueue;
|
osMessageQueueId_t PD_handle_event_MsgQueue;
|
||||||
|
|
||||||
|
// 数据处理Task任务发送给UI层的电压电流数据的消息队列
|
||||||
|
// 流向为 MessageSendTask -> LVGLtask
|
||||||
|
osMessageQueueId_t PowerDataQueue;
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
void LvHandlerTask(void *argument);
|
void LvHandlerTask(void *argument);
|
||||||
|
|
||||||
@@ -110,6 +120,7 @@ void User_Tasks_Init(void)
|
|||||||
Key_MessageQueue = osMessageQueueNew(4, sizeof(key_event_t), NULL);
|
Key_MessageQueue = osMessageQueueNew(4, sizeof(key_event_t), NULL);
|
||||||
PD_cmd_MessageQueue = osMessageQueueNew(4, sizeof(PD_command_msg_t), NULL);
|
PD_cmd_MessageQueue = osMessageQueueNew(4, sizeof(PD_command_msg_t), NULL);
|
||||||
PD_handle_event_MsgQueue = osMessageQueueNew(4, 1, NULL); // uint8_t message
|
PD_handle_event_MsgQueue = osMessageQueueNew(4, 1, NULL); // uint8_t message
|
||||||
|
PowerDataQueue = osMessageQueueNew(8, sizeof(PowerData_t), NULL);
|
||||||
|
|
||||||
/* add threads, ... */
|
/* add threads, ... */
|
||||||
HardwareInitTaskHandle = osThreadNew(HardwareInitTask, NULL, &HardwareInitTask_attributes);
|
HardwareInitTaskHandle = osThreadNew(HardwareInitTask, NULL, &HardwareInitTask_attributes);
|
||||||
|
|||||||
Reference in New Issue
Block a user