2024年6月5日发(作者:)

XFS SPI框架设计说明

杜晶2010年6月3日星期四

一、总体设计框图:

应用程序

XFS API

XFS Manager

XFS SPI

Service Provider

PostEventWnd函数

SPI入口函数

WFP_xxx实现参

数传入

消息处理线程

命令参数

激发事件

Events to a Window

SPI Message

线程消息

消息队列

注册事件

有效窗体

事件窗口队列

SPI处理函数

OnSP_xxx具体

功能实现,并用

消息或事件通知

窗口

CServiceBasic设

备服务类

二、模块说明:

每个设备的SP驱动程序对应一个vc++实现的dll模块。

注意在dll第一次被装载时要通过注册表信息装载XFS标准dll中的所有标准函数,目

前一共34个,通过

RegGetManagerPath和LoadManagerFunction函数实现。

1、SPI入口函数WFP_xxx:

为了和XFS标准中实现的XFS Manager交互必须引入和实现标准的SPI函数入口定义,

目前已经实现了必须的11个。上层应用程序通过XFS Manager间接调用这些SPI入口函数,

XFS标准中规定所有SPI函数必须是异步的,因此在这里采用Windows的线程消息机制建

立消息队列来实现这种异步方式。SPI入口函数的实现中最主要需要做的是分配必要的内

存,将输入参数以标准中规定的形式,通过消息方式传递给处理线程后就直接返回,如果中

途出现任何错误或异常,则给予相应的返回值。

2、消息处理线程:

分类处理各种SPI调用,消息处理线程会从消息队列中检查和分类处理对应的SPI请求,通

过调用对应的SPI处理函数OnSP_xxx实现具体的功能。每个设备的SP提供给应用程序的

服务可以是多个,但DLL的所有实例被实现成只会同时存在一个消息处理线程,这是为了

实现独立设备锁定的必须机制。

3、SPI处理函数OnSP_xxx:

各个SPI函数的具体功能实现,用WFSRESULT结构传递返回值,并用消息或事件通知对

应窗口。SPI处理函数的实现中主要关注设备的具体功能实现、标准中关于设备SPI出口参

数的定义和注意事项、分配必要内存、发出必要的事件通知、最后将WFSRESULT结构以

消息形式通知XFS Manager的后台处理窗口,返回相应的返回值。

4、事件发送机制:

WFPRegister和WFPDeregister是XFS标准中用来实现事件注册的SPI函数,具体的实现方

法是,当应用程序通过API调用通知XFS Manager后,XFS Manager会调用相应SP的SPI

函数,SPI中将收到的事件注册信息(主要是窗口句柄)放入事件窗口队列中;如果设备发生

了相应的事件,对应的SPI处理函数就应该使用PostEventWnd函数发送这个事件通知已注

册的应用程序。PostEventWnd函数会找到关注这一事件的应用程序事先用WFPRegister注

册到事件窗口队列中的相应窗口句柄,并将事件以Windows消息的形式发送过去。OpenXFS

开源库中对事件机制的管理使用了Map图类型数据结构,只是在查找性能上会比我们的实

现好一些。经测试使用队列实现事件机制,同时为5-10个应用程序提供事件服务可以满足

实时性要求。以后如果发现性能不足,也可以尝试使用二叉查找树或图结构来优化。

三、标准框架开发SP的步骤:

1、读懂XFS 标准文档Part1,主要描述了SP的基本原理和编程规则;

2、读懂XFS标准文档Part2,主要描述了设备服务的分类定义和一些规则;

3、根据设备的具体类型阅读标准中该类型的对应部分的文档,比如打印机对应Part3、扫描

枪对应Part17等。在工程中包含该类型文档中定义好的C++ .h头文件。

4、WFP_xxx函数中注意修改,其中主要需要分配必要的内存空间并传递入口参数。主要修

WFPExecute和WFPGetInfo函数。

5、OnSP_xxx函数中注意修改,按设备支持的所有命令分类处理,分配内存必要的空间,

注意出口参数的数据结构。OnSP_xxx函数是实现设备服务具体功能的地方,采用

CServiceBase类实例实现具体设备功能函数(封装具体指令集)。根据具体设备可自行增加

对应功能操作的封装。框架已实现了XFS 3.10标准规范中的大部分,因此在使用框架的过

程中不要随意删除已有的基础部分,另外使用的时候多实验多观察,摸清规则后再修改。主

要修改

OnSPExecute

OnSPGetInfo函数。

6、CSerialPort是一个同步方式的串口通讯类,[实验代码SerialPinDirect]文件夹中的

CSerialPort类实现了串口状态脚的异步读取。

四、交接说明:

[DocCEN-XFSCWA15748]文件夹里是XFS 3.10标准文档PDF电子版。

[实验代码]文件夹里包含了主要源代码:

实验代码api_QuantumT_bcr扫描枪应用测试程序;

实验代码 spi_QuantumT_bcr扫描枪SP驱动程序;

实验代码spi_nantian_pr2e南天打印机SP驱动框架程序;

实验代码SerialTest串行口指令测试程序;

实验代码SerialPinDirect直接读串口状态位的样例程序。

[OpenXFS_V0.0.0.5]文件夹里是实现XFS 3.10标准的MFC构架的开源库,其中主要可以参

考:

SamplesWosaXFSTest20100106为应用测试程序;

SPISPIEpson20090106为打印机SP样例驱动程序;

为有中文注释的库说明文档。