这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32H7S78-DK】TouchGFX之时间设置

共8条 1/1 1 跳转至

【STM32H7S78-DK】TouchGFX之时间设置

助工
2024-09-15 22:44:48     打赏

【前言】

【STM32H7S78-DK】制做一个超级时钟-电子产品世界论坛 (eepw.com.cn)

在这篇帖子中,我分享了如何制作一个时钟,但是没有设置时间的功能,本篇是基于上一篇的补充。

本篇将使用滚轮来设置时分秒。

【涉及知识】

1、scrollWheel的使用,在论坛中,我也分享了scrollWheel如何使用:【STM32H7S78-DK】TouchGFX滚轮应用-电子产品世界论坛 (eepw.com.cn)

2、TouchGFX的Model->Presenter->View模型驱动。这个知识在官方的文档有详细的介绍:Model-View-Presenter设计模式 | TouchGFX Documentation 4.18

3、RTC时间更新

【UI设计】

1、新建一个屏幕,命名为ScreenTimeSet,在屏幕中添加两个自定义容器,在我的scrollWheel的文章中有详细介绍,这里不多做介绍。

2、在屏幕中添加用于设置时、分、秒的三个scrollWheel。依次添加自定义容器到界面。

3、添加一个用于更新的的按键,以及一个返回主界面的按键,设置好后如下图所示。

image.png

4、给return按键添加返回主界面的自定义功能:

image.png

5、给upsetting按键添加自定义函数:

image.png

6、同时在主界面添加一个按键用于进入设置界面的按键,同样设置跳传到设置的功能。

image.png

【代码实现】

1、添加三个scrollWheel的滚动界面更新函数,以及松开后的回调函数,ScreenTimeSetView.hpp代码如下

SCREEN1VIEW_HPP
SCREEN1VIEW_HPP
: :
    ;
    ;
    ;
    ;
    ;
:
    ;
    ;
    ;
:
;

2、ScreenTimeSetView.cpp代码如下,有详细注释:

#include <gui/screentimeset_screen/ScreenTimeSetView.hpp>

ScreenTimeSetView::ScreenTimeSetView():
        scrollWheelHourAnimateToCallback(this, &ScreenTimeSetView::scrollWheelHourAnimateToHandler),
        scrollWheelSecondAnimateToCallback(this, &ScreenTimeSetView::scrollWheelSecondAnimateToHandler),
        scrollWheelMinuteAnimateToCallback(this, &ScreenTimeSetView::scrollWheelMinuteAnimateToHandler)
{

}

/c++
/// 设置屏幕时间视图的配置函数
///
/// 该函数主要用于初始化和更新屏幕时间视图的显示内容,包括小时、分钟和秒的设置。
/// 它首先调用基类的屏幕设置函数进行基本配置,然后将三个滚动轮(小时、分钟、秒)
/// 的动画回调函数进行设置,以确保滚动轮在动画过程中能正确执行回调。
/// 接着从presenter(演示者)对象中获取当前的小时、分钟和秒,
/// 并使对应的滚动轮动画移动到正确的数值,从而在界面上显示出来。
///
/// 该函数不接受参数,也无返回值。
void ScreenTimeSetView::setupScreen()
{
    // 调用基类的屏幕设置函数进行基本配置
    ScreenTimeSetViewBase::setupScreen();

    // 设置小时滚动轮的动画回调函数
    scrollWheelHour.setAnimateToCallback(scrollWheelHourAnimateToCallback);
    // 设置秒滚动轮的动画回调函数
    scrollWheelSecond.setAnimateToCallback(scrollWheelSecondAnimateToCallback);
    // 设置分钟滚动轮的动画回调函数
    scrollWheelMinute.setAnimateToCallback(scrollWheelMinuteAnimateToCallback);

    // 从presenter(演示者)对象中获取当前的小时
    hour = presenter->getHour();
    // 从presenter(演示者)对象中获取当前的分钟
    minute = presenter->getMinute();
    // 从presenter(演示者)对象中获取当前的秒
    second = presenter->getSecond();

    // 使小时滚动轮动画移动到当前小时的位置
    scrollWheelHour.animateToItem(hour);
    // 使秒滚动轮动画移动到当前秒的位置
    scrollWheelSecond.animateToItem(second);
    // 使分钟滚动轮动画移动到当前分钟的位置
    scrollWheelMinute.animateToItem(minute);
}


void ScreenTimeSetView::tearDownScreen()
{
    ScreenTimeSetViewBase::tearDownScreen();
}


void ScreenTimeSetView::scrollWheelHourUpdateItem(textContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}
void ScreenTimeSetView::scrollWheelHourUpdateCenterItem(textCenterContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}


/**
 * 使用滚动条更新分钟选择项的文本。
 *
 * 本函数是ScreenTimeSetView类中用于更新UI显示的一部分,特指的是更新分钟选择项的文本。
 * 它通过调用textContainer对象的updateText方法来实现文本内容的刷新,刷新的内容依据是itemIndex参数。
 *
 * @param item textContainer对象,用于存储和管理文本内容。
 * @param itemIndex 要更新的选择项的索引,决定了具体更新哪一项文本内容。
 */
void ScreenTimeSetView::scrollWheelMinuteUpdateItem(textContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}

void ScreenTimeSetView::scrollWheelMinuteUpdateCenterItem(textCenterContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}

void ScreenTimeSetView::scrollWheelSecondUpdateItem(textContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}
void ScreenTimeSetView::scrollWheelSecondUpdateCenterItem(textCenterContainer& item, int16_t itemIndex)
{
    item.updateText(itemIndex);
}
/* 该函数将itemSelected参数值赋给hour变量。功能如下:
接收一个整数参数itemSelected。
将此参数值赋给成员变量hour。 */

void ScreenTimeSetView::scrollWheelHourAnimateToHandler(int16_t itemSelected)
{
    hour = itemSelected;
}

void ScreenTimeSetView::scrollWheelSecondAnimateToHandler(int16_t itemSelected)
{
    second = itemSelected;
}

void ScreenTimeSetView::scrollWheelMinuteAnimateToHandler(int16_t itemSelected)
{
    minute = itemSelected;
}

3、ScreenTimeSetPresenter.hpp添加向model传递时间设定值的函数:

void updateTimeSetting(int16_t hour, int16_t minute, int16_t second){
    model->updateTimeSetting(hour, minute, second);
}

4、在Model.cpp中添加更新时间的函数:

void Model::updateTimeSetting(int16_t hour, int16_t minute, int16_t second)
{
    gSystemTime.Hours = hour;
    gSystemTime.Minutes = minute;
    gSystemTime.Seconds = second;

    HAL_RTC_SetTime(&hrtc, &gSystemTime, RTC_FORMAT_BIN);
}

同时需要在Model.hpp中添中virtual声明。

virtual void updateTimeSetting(int16_t hour, int16_t minute, int16_t second);

【实现效果】

通过scrollWheel可以方便的设置当时间,完成超级时钟的完善。

stm32h7s78rtcsetting.gif




关键词: STM32H7S78-DK     TouchGFX     时间    

高工
2024-09-16 00:26:41     打赏
2楼

感谢分享


专家
2024-09-16 00:59:35     打赏
3楼

感谢楼主分享


专家
2024-09-16 09:09:35     打赏
4楼

厉害啊


专家
2024-09-16 12:24:37     打赏
5楼

感谢楼主分享


专家
2024-09-16 12:26:07     打赏
6楼

感谢楼主分享


高工
2024-09-16 12:27:33     打赏
7楼

感谢楼主分享


专家
2024-09-16 12:57:37     打赏
8楼

谢谢分享!!


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]