tslib 代码分析2

来源:互联网 发布:mac同步icloud照片 编辑:程序博客网 时间:2024/06/05 00:41
------------------------------------------------------------
author: hjjdebug
date: 2015年 10月 20日 星期二 09:06:45 CST
------------------------------------------------------------
分析ts_test.c
屏幕上随手划演示程序

主函数流程很简单:
打开ts 设备,读取ts 设置文件。这和ts_print.c 步骤一致.
打开framebuffer, 因为要用到图形显示。
为三个button 付初值,
设置调色版
刷新屏幕。
下面为主循环
画cross_cursor, 读ts_read 数据,关闭cross_cursor 处理
如果在按钮区,重设mode,
如果是画图模式,划线。
如果退出按钮按下,退出。

这里解释几个问题:
1. 打开framebuffer 是什么意思,需要怎样操作。
它涉及到控制台设备和framebuffer 设备, 打开和设置这两个设备.

控制台设备:平时屏幕为文本显示模式,现在要把屏幕设为图形模式。
a. 控制台设备对应着/dev/下一个设备文件,
但由于控制台可以有多个,所以首先先找到控制台号,然后把该控制台激活,
设置为图形模式。

b. framebuffer设备: 也对应/dev下一个文件,
首先打开该文件,然后拿到它的fix属性和vars属性
把fb_fd 映射到一块内存地址。fbuffer, 同时为方便使用,每一行的首地址用lineaddr[]保存, 以后屏幕的显示,就由fbuffer 的数据来控制了。

2. 设置调色板。
就是把一个顺序号与一个颜色值相关联。是通过对fb_fd进行ioctl 来改变的。
最多可设置255中颜色

3. 屏幕上画点。
找到内存地址,把索引号放就进去就可以了.(以8位索引为例)
void pixel (int x, int y, unsigned colidx)
{
    loc.p8 = line_addr [y] + x * bytes_per_pixel;
    *loc.p8 = colidx;
}

其它的划线,填充我就不详述了,有了点,就有了一切。

------------------------------------------------------------
分析ts_calibrate.c 程序
矫正程序。
------------------------------------------------------------
最重要的放最后,其实也是因为它最复杂。
主流程操作过的人很容易理解
打开ts设备,读取ts配置
打开framebuffer, 设置调色板
屏幕中央显示提示文字
然后依次出5个cross, 由用户点击。结束。

后面对应的程序都干了些什么?

读取矫正点是有clearbuf和getsample 构成
clearbuf,是等待用户把笔抬起。
getsample 是最大读取128次,然后取中间那个点(x,y)保存
最后执行矫正是什么意思?
int perform_calibration(calibration *cal)
现在已经积累了足够多数据了,5组屏幕点,5组ts点,怎样满足这5组点的对应呢?
PL(x, y) = M·PT(x, y)。
需要一个矩阵M,
二维几何中有三种变换,平移,旋转,缩放。
理论上有三个点就可以完成从一个坐标向另一个坐标的映射,但考虑的实际的情况
采用了5组以提高精确度,当然算法也会改变。
我对它的运算过程不感兴趣,最后,它算出了几个系数,保存到文件中去了。
这就是矫正过程。
没有矫正,将不能从ts坐标到屏幕坐标。
0 0