initial commit
This commit is contained in:
commit
c7d71753d5
3 changed files with 170 additions and 0 deletions
20
test.c
Normal file
20
test.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
#include <stdio.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
unsigned long bit[EV_CNT / (sizeof(long) * 8) + 1];
|
||||
unsigned long absbit[ABS_MAX / (sizeof(long) * 8) + 1];
|
||||
|
||||
printf("EV_CNT / (sizeof(long) * 8) + 1: %d\n", EV_CNT / (sizeof(long) * 8) + 1);
|
||||
printf("ABS_MAX / (sizeof(long) * 8) + 1: %d\n", ABS_MAX / (sizeof(long) * 8) + 1);
|
||||
printf("EVIOCGVERSION: %d\n", EVIOCGVERSION);
|
||||
printf("EV_VERSION: %d\n", EV_VERSION);
|
||||
printf("EVIOCGBIT(0, sizeof(bit)): %d\n", EVIOCGBIT(0, sizeof(bit)));
|
||||
printf("EVIOCGBIT(EV_ABS, sizeof(absbit): %d\n", EVIOCGBIT(EV_ABS, sizeof(absbit)));
|
||||
printf("EV_ABS: %d\n", EV_ABS);
|
||||
printf("ABS_X: %d\n", ABS_X);
|
||||
printf("ABS_Y: %d\n", ABS_Y);
|
||||
printf("ABS_PRESSURE: %d\n", ABS_PRESSURE);
|
||||
}
|
12
tslib.c
Normal file
12
tslib.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <tslib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
struct tsdev *ts;
|
||||
ts = ts_open("/dev/input/event2", 0)
|
||||
if (!ts) {
|
||||
fprintf(stderr, "cannot open event2");
|
||||
return 1;
|
||||
}
|
||||
}
|
138
tslib.py
Normal file
138
tslib.py
Normal file
|
@ -0,0 +1,138 @@
|
|||
from ctypes import *
|
||||
|
||||
tslib = cdll.LoadLibrary("libts-0.0.so.0")
|
||||
|
||||
class tsdev(Structure):
|
||||
pass
|
||||
|
||||
class timeval(Structure):
|
||||
_fields_ = [("tv_sec", c_long),
|
||||
("tv_usec", c_long)]
|
||||
|
||||
class ts_sample(Structure):
|
||||
_fields_ = [("x", c_int),
|
||||
("y", c_int),
|
||||
("pressure", c_uint),
|
||||
("tv", timeval)]
|
||||
|
||||
ts_read_raw = tslib.ts_read_raw
|
||||
ts_read_raw.restype = c_int
|
||||
ts_read_raw.argtypes = [POINTER(tsdev), POINTER(ts_sample), c_int]
|
||||
|
||||
ts_open = tslib.ts_open
|
||||
ts_open.restype = POINTER(tsdev)
|
||||
ts_open.argtypes = [c_char_p, c_int]
|
||||
|
||||
ts_close = tslib.ts_close
|
||||
ts_close.restype = c_int
|
||||
ts_close.argtypes = [POINTER(tsdev)]
|
||||
|
||||
ts_config = tslib.ts_config
|
||||
ts_config.restype = c_int
|
||||
ts_config.argtype = [POINTER(tsdev)]
|
||||
|
||||
|
||||
ts = ts_open("/dev/input/event2", 0)
|
||||
if ts == 0:
|
||||
exit("ts_open failed")
|
||||
|
||||
if ts_config(ts):
|
||||
exit("ts_config failed")
|
||||
|
||||
def get_xy(ts):
|
||||
samples_x = list()
|
||||
samples_y = list()
|
||||
|
||||
s = ts_sample()
|
||||
|
||||
# read until pressed
|
||||
while True:
|
||||
if ts_read_raw(ts, byref(s), 1) < 0:
|
||||
exit("ts_read_raw failed")
|
||||
if s.pressure != 0:
|
||||
break
|
||||
|
||||
# read until 128 values are gathered or no longer pressed
|
||||
for i in range(128):
|
||||
if ts_read_raw(ts, byref(s), 1) < 0:
|
||||
exit("ts_read_raw failed")
|
||||
if s.pressure == 0:
|
||||
break
|
||||
else:
|
||||
samples_x.append(s.x)
|
||||
samples_y.append(s.y)
|
||||
|
||||
samples_x.sort()
|
||||
samples_y.sort()
|
||||
|
||||
middle = i/2
|
||||
|
||||
# return the median
|
||||
if i%2 == 0:
|
||||
return ((samples_x[middle-1]+samples_x[middle])/2,
|
||||
(samples_y[middle-1]+samples_y[middle])/2)
|
||||
else:
|
||||
return (samples_x[middle], samples_y[middle])
|
||||
|
||||
cal = {(50, 50): get_xy(ts),
|
||||
(480-50, 50): get_xy(ts),
|
||||
(480-50, 640-50): get_xy(ts),
|
||||
(50, 640-50): get_xy(ts),
|
||||
(480/2, 640/2): get_xy(ts)}
|
||||
|
||||
scaling = 65536.0
|
||||
|
||||
#print cal
|
||||
|
||||
# get sums for matrix
|
||||
n = 5.0
|
||||
x = sum([_x_ for _x_, _y_ in cal.values()])
|
||||
y = sum([_y_ for _x_, _y_ in cal.values()])
|
||||
x2 = sum([_x_*_x_ for _x_, _y_ in cal.values()])
|
||||
y2 = sum([_y_*_y_ for _x_, _y_ in cal.values()])
|
||||
xy = sum([_x_*_y_ for _x_, _y_ in cal.values()])
|
||||
|
||||
#print n, x, y, x2, y2, xy
|
||||
|
||||
# get determinant
|
||||
det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2)
|
||||
|
||||
#print det
|
||||
|
||||
# check determinant
|
||||
if ((det < 0.1) and (det > -0.1)):
|
||||
exit("determinant is too small")
|
||||
|
||||
# calculate inverse matrix
|
||||
a = (x2*y2 - xy*xy)/det
|
||||
b = (xy*y - x*y2)/det
|
||||
c = (x*xy - y*x2)/det
|
||||
e = (n*y2 - y*y)/det
|
||||
f = (x*y - n*xy)/det
|
||||
i = (n*x2 - x*x)/det
|
||||
|
||||
#print a, b, c, e, f, i
|
||||
|
||||
# get sums for x calibration
|
||||
z = sum([xfb for xfb, yfb in cal.keys()])
|
||||
zx = sum([xfb*x for (xfb, yfb), (x, y) in cal.items()])
|
||||
zy = sum([xfb*y for (xfb, yfb), (x, y) in cal.items()])
|
||||
|
||||
#print z, zx, zy
|
||||
|
||||
print int((b*z + e*zx + f*zy)*scaling), int((c*z + f*zx + i*zy)*scaling), int((a*z + b*zx + c*zy)*scaling)
|
||||
|
||||
# get sums for y calibration
|
||||
z = sum([yfb for xfb, yfb in cal.keys()])
|
||||
zx = sum([yfb*x for (xfb, yfb), (x, y) in cal.items()])
|
||||
zy = sum([yfb*y for (xfb, yfb), (x, y) in cal.items()])
|
||||
|
||||
#print z, zx, zy
|
||||
|
||||
print int((b*z + e*zx + f*zy)*scaling), int((c*z + f*zx + i*zy)*scaling), int((a*z + b*zx + c*zy)*scaling)
|
||||
|
||||
print int(scaling)
|
||||
|
||||
ts_close(ts)
|
||||
|
||||
|
Loading…
Reference in a new issue