《Windows CE嵌入式开发入门——基于Xscale架构》 第10章 案 例 分 析

10.1 TouchScreen驱动分析

10.1.1 介绍

触摸屏驱动是从触摸屏硬件上获取用户的输入信息,然后将触摸事件传递给GWES子系统。驱动会矫正坐标值,比如将歪斜的线条修正为直线。

在用户的笔或者手指触摸屏幕的时候,驱动必须随时返回坐标值,当笔或者手指离开屏幕后,必须产生事件来标记“抬笔”事件。

10.1.2 注册表设置

下面是触摸屏驱动的注册表设置。

[HKEY_LOCAL_MACHINE\ControlPanel]

InputConfig"=dword:3; 3 => 键盘和触摸屏

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]

"DriverName"="touch.dll"

"MaxCalError"=dword:10

10.1.3 数据结构

1TOUCH_PANEL_SAMPLE_FLAGS

本数据结构绘出返回到系统的坐标值的属性。

2TPDC_CALIBRATION_POINT

本数据结构由TouchDriverCalibrationPointGet.例程代码组成,并运行在系统启动时,用户可以看见屏幕上会有一个X,从中间再到四周指引用户矫正坐标值。TouchDriverCalibrationPointGet例程通常利用屏幕的高和宽来确定中心和四周的坐标值。

struct TPDC_CALIBRATION_POINT {

INT PointNumber;

INT cDisplayWidth;

INT cDisplayHeight;

INT CalibrationX;

INT CalibrationY;

};

3TPDC_SAMPLE_RATE

本数据结构由DdsiTouchPanelGetDeviceCaps例程代码组成。

struct TPDC_SAMPLE_RATE {

INT SamplesPerSecondLow;

INT SamplesPerSecondHigh;

INT CurrentSampleRateSetting;

};

数据结构中成员说明

SamplesPerSecondLow

低采样率值。

SamplesPerSecondHigh

高采样率值。

CurrentSampleRateSetting

当前采用的采样率值,1代表高采样率,0代表低采样率。

10.1.4 驱动例程

1TouchPanelEnable

本例程使触摸屏具有采样功能。可以被程序直接调用。

2DdsiTouchPanelAttach

本例程在MDDDLL中被加载,DLL入口获得DLL_PROCESS_ATTACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都从本例程获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnableDdsiTouchPanelDisable中进行。

本例程原型:

LONG DdsiTouchPanelAttach(void);

返回值一般为0

3DdsiTouchPanelDetach

本例程在MDDDLL被卸载,DLL入口获得DLL_PROCESS_DETACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnableDdsiTouchPanelDisable中进行。

本例程原型:

LONG DdsiTouchPanelDetach(void);

4DdsiTouchPanelDisable

本例程关闭触摸屏设备,删除任何没有被提交给GWES的坐标,关闭电源。

本例程原型:

VOID DdsiTouchPanelDisable(void);

无参数,无须返回值。

5DdsiTouchPanelEnable

本例程原型:

BOOL DdsiTouchPanelEnable(void);

返回值:

TRUE代表成功,FALSE代表失败。

本例程为触摸屏加载电源,并且进行初始化。调用AllocTouchPanelRegs为寄存器分配内存。这些虚拟内存分配时,参数中使用MEM_RESERVED标志,这样被分配的内存不与物理内存绑定,不能被malloc等函数访问,最后使用virtual_copy将虚拟地址和寄存器的物理地址绑定(不是物理内存)。

在为寄存器分配完空间后,建立中断,即“落笔”中断,但是建立后就关闭中断,直到InterruptEnable()被执行后再建立中断。

6DdsiTouchPanelGetDeviceCaps

本例程查询触摸屏设备的精度。

本例程原型:

BOOL DdsiTouchPanelGetDeviceCaps(

ULONG iIndex,

LPVOID lpOutput

);

其参数为:

iIndex,代表查询的项目。可以有以下类型:

TPDC_SAMPLE_RATE_ID 查询采样频率。

TPDC_CALIBRATION_POINT_ID 返回指定精度的坐标值,精度由lpOutput参数的PointNumber域指定。

TPDC_CALIBRATION_POINT_COUNT_ID 查询校准坐标所需要的坐标样本数。

lpOutput:指向存放返回信息的内存区域,类型和iIndex对应。

iIndexTPDC_SAMPLE_RATE_ID时,指向TPDC_SAMPLE_RATE结构。

iIndexTPDC_CALIBRATION_POINT_ID时,指向TPDC_CALIBRATION_POINT结构。

lpOutput不能为空指针。

返回值:

TRUE代表成功,FALSE代表失败。

7DdsiTouchPanelGetPoint

本例程返回最近的一次数据采样坐标值。在“落笔”之后,就会触发定时器的一系列中断。定时器每秒钟约产生150次中断,每次中断都要返回坐标值。

pxa255中,本例程分为三部分:

n 处理“落笔”中断

关闭“落笔”中断

n 处理定时器中断

递增定时器中断计数。

以上两个中断处理,都会调用SampleTouchScreen,从采集到的3个点中,选出最优化的点,返回给系统。

n 处理“抬笔”中断

最后,打开“落笔”中断,将UCB1400设置为可中断模式。

8DdsiTouchPanelPowerHandler

本例程通知驱动程序,系统正从暂停模式恢复到正常模式,或者进行相反的操作。本例程会被内核态程序调用,因此不要在其中使用系统调用。

10.2 显示驱动分析

基于微软公司的DirectDraw显示驱动,必须在DDI内实现DDHAL用于支持DirectDraw

10.2.1 Windows CE DirectDraw架构

DirectDraw提供了独立于设备的显示驱动功能。它将图形显示数据直接加载到硬件设备上,而不需要图形设备接口来对数据进行转换,从而使图形显示效果更加顺畅,避免了屏幕的闪烁。实现这样的接口,需要扩展能够直接访问硬件的驱动接口,这些能够直接访问硬件的驱动接口组成了DirectDraw硬件抽象层(DirectDraw Hardware Abstraction LayerDDHAL

Windows CE中的DirectDraw架构

10-1 DirectDrawGDI
显示驱动结合

10-1显示了DirectDrawGDI显示驱动是如何结合的:

Windows CE中的DirectDrawWindows桌面环境Direct-
Draw
的子集。DirectDraw的核心可执行代码常驻在系统进程gwes.exe中,而应用程序则和较小的客户端代理Ddraw.dll建立连接,这个代理负责维护系统和用户进程之间的远程DirectDraw COM接口连接。Windows CE在默认的情况下不提供进程外部的COM服务器。

Windows CE还提供了一个名为DirectDraw图形原始引擎(DirectDraw Graphics Primitive EngineDDGPE)的抽象层,GDIDirectDraw组件在系统进程中使用这个抽象层将GDI/DDIDDRAW/DDHAL的功能捆绑到一个由C++类和函数组成的框架上。DDGPE提供的C++类实现了GPE类的扩展。

10.2.2 如何创建DirectDraw显示驱动程序

可以复制Platform Builder提供的样例显示驱动程序作为新创建的驱动程序的基础。

1.修改二进制文件导出的接口,二进制文件应当导出HALInit接口。在Platform Builder提供的样例显示驱动程序有一个.def后缀名的文件,在这个文件中添加HALInitHALInitDdgpe.lib库的一部分,应当总是被链接到程序中。

2.在程序中包含路径drive:\wince400\public\directX\oak\inc,这应当是DDHFuncs.h所在路径。这是一个所有显示驱动程序公共的头文件,不应当被修改。

将下列文件从样例显示驱动程序中复制到自己的文件夹下:

n HalCaps.cpp

n HalDD.cpp

n HalSurf.cpp

n HalPalette.cpp

在选择样例显示驱动程序时,应当选择和自己设备最接近的驱动程序。最后,编译自己创建的驱动程序。

10.2.3 DDGPE基类

1DDGPE

DDGPE类是DirectDraw对象继承的基类。

10-1列出了DDGPE类中的成员函数:

10-1 DDGPE类中的成员函数

DDGPE::AllocSurface

为一个surface分配内存

DDGPE::AllocVideoSurface

在内存中创建DDGPESurf对象

DDGPE::BltExpanded

建立并且执行一个GPE blit

DDGPE::BltPrepare

GPE BltPrepare 函数的DDGPE版本

DDGPE::DetectMode

根据提供的参数确定显示模式

DDGPE::DetectPixelFormat

DDPIXELFORMAT转换成EGPEFormat或者EDDGPEPixelFormat.

DDGPE::GetDriverData

返回指向驱动数据的指针

DDGPE::GetDriverGUID

获取驱动的GUID

DDGPE::GetModeInfoEx

返回扩展模式信息

DDGPE::GetPhysicalModeId

获取当前实际的显示模式

DDGPE::InDisplay

判断给定的扫描线是否正在显示

DDGPE::PerformBlt

执行一次blit

DDGPE::SetDriverData

将驱动特定的数据存储到DDGPE对象中

DDGPE::SetDriverGUID

将驱动的GUID赋予特定的对象

DDGPE::SetMode

更改当前的显示模式

DDGPE::SetVisibleSurface

使指定的surface被推到前台,成为可视

DDGPE::WrapSurface

在既存的内存块之上创建一个DDGPESurf对象

2DDGPESurf

DDGPESurf类扩展了GPESurf类,并且代表了由GDI分配的一个surface,如表10-2描述。

10-2 DDGPSurf类中的成员函数

DDGPESurf::AlignedWidth

获取一个surface内存的宽度

DDGPESurf::Bpp

决定在当前surface中,每个象素占用的位数

DDGPESurf::ColorKey

获取当前surfacecolor key

DDGPESurf::ColorKeyMask

获取当前surfacecolor key掩码

DDGPESurf::DeleteSurface

已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页