本文介绍的正是笔者在制作实际的嵌入式Linux数控机床人机接口过程中,提出的一套基于嵌入式Linux和MiniGUI的通用触摸屏校准程序设计方案。

笔者基于的ARM9内核,使用,640×480的触摸屏,嵌入式Linux内核 2.4.20和MiniGUI1.3.0,Lite版本,设计了一套简单可行的方案,可以方便地实现触摸屏的校准。在开始校正触摸屏的坐标前,首先要修改 MiniGUI.cfg文件使其适应触摸屏驱动,该文件一般保存在开发板的/usr/local目录下。所做修改如表所示。

另外,在开发板的/dev/的目录下建立连接ln-s /dev/touchscreen/Oraw ts 。

配置文件修改的主要目的是把IAL(Input Abstract Layer,输入抽象层)改为SMDK2410,输入设备改为/dev/ts,鼠标类型IMPS2取消掉,使其适应触摸屏驱动。

通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(620, 460)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量、缩放因子都与LCD坐标不 同,所以,可以在IAL的某个函数(比如wait_event函数)中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。图是 LCD坐标和触摸屏的物理坐标的比较。

在IAL的某个函数(比如wait_event函数)中加入调试信息,开发板上运行Calibrate程序,那么触摸屏上任何一点的坐标就可以在主 机监视屏上回显出来。于是,就采集到了4个角的物理坐标,假设是屏,640X480分辨率,则它们的像素坐标分别是(20,20)、(20,460)、 (620,460)和(620,20)。这样,使用待定系数法就可以算出坐标系之间的平移关系。比如:

Vx = xFactor*Px + xOffset

Vy = yFactor*Py + yOffset

在笔者使用的开发板上,系数xFactor、yFactor、xOffset、yOffset的值分别为0.211、-16.27、-19/116、625.23。那么,在IAL的特定函数中就可以按照这个变换关系把物理坐标转换为像素坐标赋给POS结构了。

因此,应用程序中首先弹出一个有若干点的界面,然后让用户去点,参照了Qt-embedded的对标程序,一般采用了触摸屏四个角的四个点。根据像素坐标和物理坐标计算参数,并保存到一个文件中。那么以后只要这个文件的内容有效则不必再经历屏幕校准的过程。

另外需要提醒的是,还要参照一下触摸屏驱动的读方法,确定从触摸屏读出的数据的组织格式。比如笔者使用的的驱动的读方法就是返回8个字节表示一点的坐标,所以在IAL的特定函数中首先要拼接才能得到点的物理坐标。

通过直接给屏幕划两个短线交叉的方法来实现。下面的代码表示,在(20,20)点画一个十字光标。

DrawLine (15, 20, 26, 20, 0xf800);

DrawLine (20, 15, 20, 26, 0xf800);

do {

// Calibrate Point 1 (20,20)

DrawLine (15, 20, 26, 20, 0xf800);

DrawLine (20, 15, 20, 26, 0xf800);

do

GetTouchvalue (tfd, &point[0].x, &point[0].y);

while (!(point[0].x > X1_SCOPE_MIN && point0].x < X1_SCOPE_MAX && point[0].y > Y1_SCOPE_MIN && point[0].y

...

//上面是第一个定位点处理的方法,因为有四个点,其他的也和此一样。只不过定位点和判断范围不同罢了。

} while(CheckCalibratePont());

typedef struct

{

}PEN_CONFIG, *P_PEN_CONFIG;

在程序中通过计算获得此结构体,这些数据是非常重要的,它提供给IAL使用。以下是保存这个结构体的部分源码:

rt.left=(point[0].x + point[1].x)/2;

rt.top=(point[0].y + point[3].y)/2;

rt.right=(point[2].x + point[3].x)/2;

rt.bottom=(point[2].y + point[1].y)/2;

st.top=20;

st.left=20;

st.right=620;

st.bottom=460;

_PenCalibratePoint(&st,&rt);

// Open the file for writing config file

wfd = open("/var/pencfg", O_WRONLY);

if (wfd < 0) {

printf("Error: cannot open pencfg file./n");

exit(1);}

printf("The pencfg file was opened successfully./n");

if(write(wfd, &_gPenConfig, sizeof(_gPenConfig)) == sizeof(_gPenConfig)){

printf("Write Victor /n");}

close(wfd);

void GetTouchValue(int fp, int *x, int *y)

{ ts_event_t ts;

while (1) {

if(read(fp, &ts, sizeof(ts_event_t)) == sizeof(ts_event_t)){

if (ts.pressure == 0 ) break;

*x = ts.x;

*y = ABSY-ts.y;

}

}

printf (" x= %d, y= %d /n", *x, *y);//在屏幕上输出触摸屏坐标

printf ("_gPenConfig.xFactor = %x _gPenConfig.yFactor = %x /n",_gPenConfig.xFactor, _gPenConfig.yFactor);

printf ("_gPenConfig.xOffset = %x _gPenConfig.yOffset = %x /n",_gPenConfig.xOffset, _gPenConfig.yOffset);

printf ("_gPenConfig.scale = %x/n",_gPenConfig.scale);

其原理很简单,上面的程序已经把PEN_CONFIG保存到/var/pencfg文件中,只需在IAL中写上打开该文件的代码,并且从中读取数据就可以了,其源码如下,在Init2410Input函数中。

int rcfg;

rcfg = open ("/var/pencfg", O_RDONLY);

if (rcfg < 0) {

printf ("Open < /var/pencfg> File Error/n");

}

if(read(rcfg, &_gPenConfig, sizeof(_gPenConfig)) == sizeof(_gPenConfig)){

printf("Read Victor /n");

}

close(rcfg);

#define X1_SCOPE_MIN 45 //MIN和MAX的差值就是校准的精度

#define X1_SCOPE_MAX 75

#define X2_SCOPE_MIN 45

#define X2_SCOPE_MAX 75

#define X3_SCOPE_MIN 940

#define X3_SCOPE_MAX 970

启动应用程序前先运行“触摸屏校准程序”,再运行MiniGUI程序。这样使得运行应用程序前,IAL可以预先提取到“触摸屏校准程序”中的数据。

嵌入式linux触摸屏校正命令,基于嵌入式Linux和MiniGUI的通用触摸屏校准程序相关推荐

  1. linux环境下ps命令行,Linux下ps命令详解 Linux下ps命令的详细使用方法

    Linux下ps命令详解 Linux上进程有5种状态:1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运 ...

  2. python 嵌入式 linux 产品 发布_基于嵌入式Linux进行Python应用开发

    ByToradex秦海 1).简介 Python 编程语言因其极强的可读性.可移植.易于维护,以及丰富的第三方扩展组件,如数据库.数学计算.图形,甚至机器视觉.人工智能.深度学习框架都提供Python ...

  3. linux 文件系统字体小,基于嵌入式Linux平台的最小文件系统的制作

    工作平台:FL2440 交叉编译环境:arm-linux-gcc 3.4.1 busybox版本:1.9.1 1) 制作文件系统总目录: mkdir my_rootfs 2) 编译&安装bus ...

  4. 嵌入式linux仪器,一种基于嵌入式Linux设备双系统的启动方法

    一种基于嵌入式Linux设备双系统的启动方法 [技术领域] [0001]本发明涉及一种基于嵌入式Linux设备双系统的启动方法. [背景技术] [0002]Linux操作系统特别是其嵌入式系统由于其源 ...

  5. linux自动电梯设计,基于嵌入式Linux电梯控制系统

    摘要: 目前,我国电梯需求量已经超过了全球的一半,我国也成为世界上最大的电梯市场,并且伴随着我国经济的飞速发展,城市化进程的加快,住房需求持续增长,高层建筑不断涌现,电梯的需求量仍然在增加.与此同时, ...

  6. linux开组态软件,基于嵌入式Linux的组态软件实时数据库的设计

    1 引言 实时数据库(real-TIme database, RTDB)作为组态软件设计与实现的核心内容解决了其所 应对的现代工业生产现场环境中生产数据与控制数据类型复杂多样,数据处理与事件调度时 间 ...

  7. 嵌入式linux 无线网卡,一种基于嵌入式Linux的无线网卡的制作方法

    本实用新型涉及无线网卡技术领域,具体为一种基于嵌入式Linux的无线网卡. 背景技术: 随着移动通信和便携通信的发展,无线局域网WLAN应用而生,日渐普及,嵌入式系统的无线局域网接入可以实现对嵌入式系 ...

  8. 嵌入式Linux搭建物联网网关,基于嵌入式Linux的物联网网关研究与实现

    摘要: 随着物联网发展速度日益加快,作为连接感知网络和传统通信网络的物联网网关正在其中扮演着重要角色.然而,目前针对物联网网关的统一标准尚未制定,物联网网关的设备类型千差万别.人们往往针对某一具体应用 ...

  9. 嵌入式linux sip电话开发,基于嵌入式Linux和MiniGUI的SIP电话设计

    0 引言 随着VoIP的迅猛发展,越来越多的个人用户正在使用软件电话.IP电话通过VoIP系统拨打国内和国际长途,IP电话的需求量越来越大,同时,人们对IP电话的要求也越来越高,例如要求IP电话体积小 ...

  10. 基于嵌入式系统linux无线传感器网络软件平台,基于嵌入式网络的无线传感器网络平台硬件和软件实现...

    简要介绍资料的基于嵌入式网络的无线传感器网络平台硬件和软件实现主要内容,以获得更多的关注 随着技术的发展,基于分布式.无线传感器网络的应用也越来越多.本文提出了一个基于嵌入式系统的无线传感器网络实验平 ...

最新文章

  1. [K/3Cloud]关于数据库sa密码更改,管理中心登录不上的问题。
  2. Windows下安装Z3的Python3版
  3. 为什要使用预编译SQL?(转)
  4. 查看dll 的是32位还是64位
  5. [1025]Noip 2009 Problem 2
  6. windows系统登陆就注销如何解决,系统登陆就注销的解决办法
  7. C# 互通操作 (二)基础知识1
  8. asp IIS部署An error occurred on the server when processing the URL错误提示解决
  9. 【Linux】在Deepin v20或UOS20下运行MC我的世界
  10. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(10) - MXCSR状态控制指令
  11. 漫画 | 为什么 MySQL 数据库要用 B+ 树存储索引?
  12. 使用authentication进行身份验证,与Forms表单登陆
  13. windows环境下kafka源代码开发环境搭建
  14. VSCode编译Python环境搭建及发布Python应用
  15. css环形进度条clip,clip实现圆环进度条
  16. 极光im php,利用php+curl调用极光IM第三方REST API方法经验
  17. 软件测试用例朋友圈发表功能,微信发朋友圈测试用例
  18. kNN_hand_writing(机器学习)
  19. 自定义maven插件的实现
  20. 三阶魔方大中小魔公式_三阶魔方还原图文教程-番茄魔方

热门文章

  1. Python小白的数学建模课-20.网络流优化案例
  2. Stanford CoreNLP依存关系分析、词性标注及句子主语分析(使用Python) 超详细截图手把手教学,新手友好
  3. Python爬虫学习简单入门(第四含scrapy安装)
  4. Material Design(二)--色彩样式
  5. 解决win10新建文本文档内容可以打开但显示图标不对的问题
  6. html5视频自动轮播,HTML5教程 可自动轮播的旋转木马插件
  7. 现代软件工程学期总结
  8. win10 1903 专业版 CreateProcessAsUser
  9. Linux系统启动流程
  10. Easyui--官网