TouchGFX之后端通信

在大多数应用中,UI需以某种方式连接到系统的其余部分,并发送和接收数据。 它可能会与硬件外设(传感器数据、模数转换和串行通信等)或其他软件模块进行交互通讯。

Model类​

所有TouchGFX应用都有Model类,Model类除了存储UI状态信息,还可用作面向周围系统的接口。 这里周围系统我们指的是在你整个系统中用到的硬件外设以及需要进行通讯的其他任务。 通常来讲,在各自的View类中直接访问其他软件模块或者硬件外设并不是个好的设计。

Model类非常适合放置任何此类接口代码,原因在于:

  1. Model类有 tick() 函数,会在每一帧自动调用,并且可实现用于查找来自其他子模块的事件或对事件作出反应。
  2. Model类有一个指向当前活动Presenter的指针,它能够将传入事件通知给UI。

以下示例为:通过button控件,触发数据发送给系统其他任务;该任务再将数据发回touchgfx任务。

首先程序需要touchgfx以外的一个任务,和两个用来收发数据的队列

然后创建一个button控件,并设置交互为调用虚函数

编写向周围系统发送数据的程序

screenView.hpp#ifndef SCREENVIEW_HPP
#define SCREENVIEW_HPP#include <gui_generated/screen_screen/screenViewBase.hpp>
#include <gui/screen_screen/screenPresenter.hpp>class screenView : public screenViewBase
{
public:screenView();virtual ~screenView() {}virtual void setupScreen();virtual void tearDownScreen();virtual void function1();
protected:
};#endif // SCREENVIEW_HPP
screenView.cpp#include <gui/screen_screen/screenView.hpp>screenView::screenView()
{}void screenView::setupScreen()
{screenViewBase::setupScreen();
}void screenView::tearDownScreen()
{screenViewBase::tearDownScreen();
}void screenView::function1()
{presenter->bc();
}
screenPresenter.hpp#ifndef SCREENPRESENTER_HPP
#define SCREENPRESENTER_HPP#include <gui/model/ModelListener.hpp>
#include <mvp/Presenter.hpp>using namespace touchgfx;class screenView;class screenPresenter : public touchgfx::Presenter, public ModelListener
{
public:screenPresenter(screenView& v);/*** The activate function is called automatically when this screen is "switched in"* (ie. made active). Initialization logic can be placed here.*/virtual void activate();/*** The deactivate function is called automatically when this screen is "switched out"* (ie. made inactive). Teardown functionality can be placed here.*/virtual void deactivate();virtual ~screenPresenter() {}void bc();private:screenPresenter();screenView& view;
};#endif // SCREENPRESENTER_HPP
screenPresenter.cpp#include <gui/screen_screen/screenView.hpp>
#include <gui/screen_screen/screenPresenter.hpp>screenPresenter::screenPresenter(screenView& v): view(v)
{}void screenPresenter::activate()
{}void screenPresenter::deactivate()
{}void screenPresenter::bc()
{model->toggleState();
}
Model.hpp#ifndef MODEL_HPP
#define MODEL_HPPclass ModelListener;class Model
{
public:Model();void bind(ModelListener* listener){modelListener = listener;}void tick();void toggleState();protected:ModelListener* modelListener;bool state;
};#endif // MODEL_HPP
Model.cpp#include <gui/model/Model.hpp>
#include <gui/model/ModelListener.hpp>
#include "../../../../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h"#ifndef SIMULATOR//*******************************************************
//   Define Queue handles
//*******************************************************
extern "C" {extern osMessageQueueId_t myQueue01Handle;extern osMessageQueueId_t myQueue02Handle;
}
#else
#include <stdio.h>
#endifModel::Model() : modelListener(0), state(0)
{}void Model::tick()
{}void Model::toggleState()
{state = !state;#ifndef SIMULATORuint16_t msg = state;if (myQueue01Handle){osMessageQueuePut(myQueue01Handle, &msg, 0, 0);}
#endif
}
freertos.cvoid StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask */uint16_t msg = 0;/* Infinite loop */for(;;){if (osMessageQueueGet(myQueue01Handle, &msg, 0U, 1000) == osOK){}}/* USER CODE END StartDefaultTask */
}

编写向UI发送数据的程序

freertos.cvoid StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask */uint16_t msg = 0;uint16_t color;/* Infinite loop */for(;;){if (osMessageQueueGet(myQueue01Handle, &msg, 0U, 1000) == osOK){if(msg)color = 0x0000;elsecolor = 0xFFFF;osMessageQueuePut(myQueue02Handle, &color, 0U, 0);}}/* USER CODE END StartDefaultTask */
}
Model.hpp#ifndef MODEL_HPP
#define MODEL_HPPclass ModelListener;class Model
{
public:Model();void bind(ModelListener* listener){modelListener = listener;}void tick();void toggleState();void setboxColor(unsigned short color);
protected:ModelListener* modelListener;bool state;
};#endif // MODEL_HPP
Model.cpp#include <gui/model/Model.hpp>
#include <gui/model/ModelListener.hpp>
#include "../../../../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h"#ifndef SIMULATOR//*******************************************************
//   Define Queue handles
//*******************************************************
extern "C" {extern osMessageQueueId_t myQueue01Handle;extern osMessageQueueId_t myQueue02Handle;
}
#else
#include <stdio.h>
#endifModel::Model() : modelListener(0), state(0)
{}void Model::tick()
{
#ifndef SIMULATOR//*******************************************************////  HANDLE MESSAGES////  Check for messages from backend, with zero timeout to//  avoid blocking the UI.////*******************************************************//uint16_t msg = 0;if (osMessageQueueGet(myQueue02Handle, &msg, 0U, 0) == osOK){setboxColor(msg);}#endif
}void Model::toggleState()
{state = !state;#ifndef SIMULATORuint16_t msg = state;if (myQueue01Handle){osMessageQueuePut(myQueue01Handle, &msg, 0, 0);}
#endif
}void Model::setboxColor(unsigned short color)
{modelListener->setboxColor(color);
}
#ifndef MODELLISTENER_HPP
#define MODELLISTENER_HPP#include <gui/model/Model.hpp>class ModelListener
{
public:ModelListener() : model(0) {}virtual ~ModelListener() {}void bind(Model* m){model = m;}virtual void setboxColor(unsigned short color) {}
protected:Model* model;
};#endif // MODELLISTENER_HPP
#ifndef SCREENPRESENTER_HPP
#define SCREENPRESENTER_HPP#include <gui/model/ModelListener.hpp>
#include <mvp/Presenter.hpp>using namespace touchgfx;class screenView;class screenPresenter : public touchgfx::Presenter, public ModelListener
{
public:screenPresenter(screenView& v);/*** The activate function is called automatically when this screen is "switched in"* (ie. made active). Initialization logic can be placed here.*/virtual void activate();/*** The deactivate function is called automatically when this screen is "switched out"* (ie. made inactive). Teardown functionality can be placed here.*/virtual void deactivate();virtual ~screenPresenter() {}void bc();virtual void setboxColor(unsigned short color);
private:screenPresenter();screenView& view;
};#endif // SCREENPRESENTER_HPP
#include <gui/screen_screen/screenView.hpp>
#include <gui/screen_screen/screenPresenter.hpp>screenPresenter::screenPresenter(screenView& v): view(v)
{}void screenPresenter::activate()
{}void screenPresenter::deactivate()
{}void screenPresenter::bc()
{model->toggleState();
}void screenPresenter::setboxColor(unsigned short color)
{view.setbox1Color(color);
}
#ifndef SCREENVIEW_HPP
#define SCREENVIEW_HPP#include <gui_generated/screen_screen/screenViewBase.hpp>
#include <gui/screen_screen/screenPresenter.hpp>class screenView : public screenViewBase
{
public:screenView();virtual ~screenView() {}virtual void setupScreen();virtual void tearDownScreen();virtual void function1();void setbox1Color(unsigned short color);
protected:
};#endif // SCREENVIEW_HPP
#include <gui/screen_screen/screenView.hpp>screenView::screenView()
{}void screenView::setupScreen()
{screenViewBase::setupScreen();
}void screenView::tearDownScreen()
{screenViewBase::tearDownScreen();
}void screenView::function1()
{presenter->bc();
}void screenView::setbox1Color(unsigned short color)
{box1.setColor(color);box1.invalidate();
}

烧录进开发板,现象(点击按钮,box颜色在黑白之间切换)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/94263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。 CPU的工作流程&#xff1f; CPU 的工作流程分为以下 5 个阶段&#xff1a;取指令…

苹果ios系统ipa文件企业签名是什么?优势是什么?什么场合需要应用到?

企业签名是苹果开发者计划中的一种签名类型&#xff0c;允许企业开发者签署和分发企业内部使用的应用程序&#xff0c;而无需通过App Store进行公开发布。通过企业签名&#xff0c;企业可以在内部部署自己的应用程序&#xff0c;以满足特定的业务需求。 企业签名能够做到以下…

【JVM】 类加载机制、类加载器、双亲委派模型详解

文章目录 前言一、类加载机制二、类加载器三、双亲委派模型总结 前言 &#x1f4d5;各位读者好, 我是小陈, 这是我的个人主页 &#x1f4d7;小陈还在持续努力学习编程, 努力通过博客输出所学知识 &#x1f4d8;如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 &#x1f4d…

【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

嵌入式Linux应用开发-驱动大全-同步与互斥①

嵌入式Linux应用开发-驱动大全-同步与互斥① 第一章 同步与互斥①1.1 内联汇编1.1.1 C语言实现加法1.1.2 使用汇编函数实现加法1.1.3 内联汇编语法1.1.4 编写内联汇编实现加法1.1.5 earlyclobber的例子 1.2 同步与互斥的失败例子1.2.1 失败例子11.2.2 失败例子21.2.3 失败例子3…

互联网Java工程师面试题·MyBatis 篇·第二弹

目录 16、Xml 映射文件中&#xff0c;除了常见的 select|insert|updae|delete标签之外&#xff0c;还有哪些标签&#xff1f; 17、Mybatis 的 Xml 映射文件中&#xff0c;不同的 Xml 映射文件&#xff0c;id 是否可以重复&#xff1f; 18、为什么说 Mybatis 是半自动 ORM 映射…

2023年中国体育赛事行业现状及趋势分析:体育与科技逐步融合,推动产业高质量发展[图]

体育赛事运营是指组织体育赛事或获取赛事版权&#xff0c;并进行赛事推广营销、运营管理等一系列商业运作的运营活动。体育赛事运营相关业务主要包括赛事运营与营销、赛事版权运营两个部分。 体育赛事运营行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#x…

5.外部中断

中断初始化配置步骤&#xff1a; IO口初始化配置 开启中断总允许EA 打开某个IO口的中断允许 打开IO口的某一位的中断允许 配置该位的中断触发方式 中断函数&#xff1a; #pragma vector PxINT_VECTOR __interrupt void 函数名(void){}#pragma vector PxINT_VECTOR __int…

开源白板工具 Excalidraw 架构解读

本文讲解开源白板工具 Excalidraw 的架构设计。 版本 0.16.1 技术栈 Vite React TypeScript Yarn Husky。 脚手架原来是用的是 Create React App&#xff0c;但这个脚手架已经不维护了&#xff0c;一年多没发布新版本了。 目前市面上比较流行的 React 脚手架是 Vite&…

RabbitMQ的基本介绍

什么是MQ 本质是一个队列&#xff0c;只不过队列中存放的信息是message罢了&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递信息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后&#xff0c;信息发送…

嵌入式Linux应用开发-驱动大全-同步与互斥④

嵌入式Linux应用开发-驱动大全-同步与互斥④ 第一章 同步与互斥④1.5 自旋锁spinlock的实现1.5.1 自旋锁的内核结构体1.5.2 spinlock在UP系统中的实现1.5.3 spinlock在SMP系统中的实现 1.6 信号量semaphore的实现1.6.1 semaphore的内核结构体1.6.2 down函数的实现1.6.3 up函数的…

用于工业物联网和自动化的 Apache Kafka、KSQL 和 Apache PLC4

由于单一系统和专有协议&#xff0c;数据集成和处理是工业物联网&#xff08;IIoT&#xff0c;又名工业 4.0 或自动化工业&#xff09;中的巨大挑战。Apache Kafka、其生态系统&#xff08;Kafka Connect、KSQL&#xff09;和 Apache PLC4X 是以可扩展、可靠和灵活的方式实现端…

【文献阅读】Pocket2Mol : 基于3D蛋白质口袋的高效分子采样 + CrossDocked数据集说明

Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets code&#xff1a; GitHub - pengxingang/Pocket2Mol: Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets 所用数据集 与“A 3D Generative Model for Structure-Based Drug Desi…

MySQL进阶 —— 超详细操作演示!!!(下)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;下&#xff09; 五、锁5.1 概述5.2 全局锁5.3 表级锁5.4 行级锁 六、InnoDB 引擎6.1 逻辑存储结构6.2 架构6.3 事务原理6.4 MVCC 七、MySQL 管理7.1 系统数据库7.2 常用工具 MySQL— 基础语法大…

使用代理IP进行安全高效的竞争情报收集,为企业赢得竞争优势

在激烈的市场竞争中&#xff0c;知己知彼方能百战百胜。竞争对手的信息对于企业来说至关重要&#xff0c;它提供了洞察竞争环境和市场的窗口。在这个信息时代&#xff0c;代理IP是一种实用的工具&#xff0c;可以帮助企业收集竞争对手的产品信息和营销活动数据&#xff0c;为企…

python二次开发CATIA:根据已知数据点创建曲线

已知数据点存于Coords.txt文件如下&#xff1a; 8.67155477658819,20.4471021292557,0 41.2016126836927,20.4471021292557,0 15.9568941320569,-2.93388599177698,0 42.2181532110364,-6.15301746150354,0 43.0652906622083,-26.4843096139083,0 -31.6617679595947,-131.1513…

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…

C++项目:【高并发内存池】

文章目录 一、项目介绍 二、什么是内存池 1.池化技术 2.内存池 3.内存池主要解决的问题 4.malloc 三、定长的内存池 四、高并发内存池整体框架设计 1.高并发内存池--thread cache 1.1申请内存&#xff1a; 1.2释放内存&#xff1a; 1.3用TLS实现thread cache无锁访…

rabbitMQ死信队列快速编写记录

文章目录 1.介绍1.1 什么是死信队列1.2 死信队列有什么用 2. 如何编码2.1 架构分析2.2 maven坐标2.3 工具类编写2.4 consumer1编写2.5 consumer2编写2.6 producer编写 3.整合springboot3.1 架构图3.2 maven坐标3.3 构建配置类&#xff0c;创建exchange&#xff0c;queue&#x…

想要精通算法和SQL的成长之路 - 二叉树的判断问题(子树判断 | 对称性 | 一致性判断)

想要精通算法和SQL的成长之路 - 二叉树的判断问题 前言一. 相同的树二. 对称二叉树三. 判断子树 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 相同的树 原题链接 这题目典型的递归题&#xff1a; 如果两个节点都是null&#xff0c;我们返回true。如果两个节点一个nul…