直接上补丁喽
diff --git a/plugins/linear.c b/plugins/linear.c
index a24916a..90fc985 100644
--- a/plugins/linear.c
+++ b/plugins/linear.c
@@ -16,12 +16,15 @@
#include
#include
#include
+#include
#include
#include "tslib.h"
#include "tslib-filter.h"
+#define TSLIB_LINEAR_TIMEOUT 5
+
struct tslib_linear {
struct tslib_module_info module;
int swap_xy;
@@ -33,14 +36,74 @@ struct tslib_linear {
// Linear scaling and offset parameters for x,y (can include rotation)
int a[7];
+
+// Timespec
+ struct timespec last;
};
+static void
+linear_read_pointercal(struct tslib_linear *lin)
+{
+ struct stat sbuf;
+ int pcal_fd;
+ char pcalbuf[200];
+ int index;
+ char *tokptr;
+ char *calfile=NULL;
+ char *defaultcalfile = "/etc/pointercal";
+
+// Use default values that leave ts numbers unchanged after transform
+ lin->a[0] = 1;
+ lin->a[1] = 0;
+ lin->a[2] = 0;
+ lin->a[3] = 0;
+ lin->a[4] = 1;
+ lin->a[5] = 0;
+ lin->a[6] = 1;
+ lin->p_offset = 0;
+ lin->p_mult = 1;
+ lin->p_div = 1;
+ lin->swap_xy = 0;
+
+ /*
+ * Check calibration file
+ */
+ if( (calfile = getenv("TSLIB_CALIBFILE")) == NULL) calfile = defaultcalfile;
+ if(stat(calfile,&sbuf)==0) {
+ pcal_fd = open(calfile,O_RDONLY);
+ read(pcal_fd,pcalbuf,200);
+ lin->a[0] = atoi(strtok(pcalbuf," "));
+ index=1;
+ while(index<7) {
+ tokptr = strtok(NULL," ");
+ if(*tokptr!='\0') {
+ lin->a[index] = atoi(tokptr);
+ index++;
+ }
+ }
+#ifdef DEBUG
+ printf("Linear calibration constants: ");
+ for(index=0;index<7;index++) printf("%d ",lin->a[index]);
+ printf("\n");
+#endif /*DEBUG*/
+ close(pcal_fd);
+ }
+}
+
static int
linear_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
{
struct tslib_linear *lin = (struct tslib_linear *)info;
int ret;
int xtemp,ytemp;
+ struct timespec now;
+
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ if(TSLIB_LINEAR_TIMEOUT < (now.tv_sec-lin->last.tv_sec))
+ {
+ linear_read_pointercal(lin);
+ memmove(&(lin->last), &now, sizeof(struct timespec));
+ }
ret = info->next->ops->read(info->next, samp, nr);
if (ret >= 0) {
@@ -102,13 +165,6 @@ TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
{
struct tslib_linear *lin;
- struct stat sbuf;
- int pcal_fd;
- char pcalbuf[200];
- int index;
- char *tokptr;
- char *calfile=NULL;
- char *defaultcalfile = "/etc/pointercal";
lin = malloc(sizeof(struct tslib_linear));
if (lin == NULL)
@@ -116,45 +172,10 @@ TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
lin->module.ops = &linear_ops;
-// Use default values that leave ts numbers unchanged after transform
- lin->a[0] = 1;
- lin->a[1] = 0;
- lin->a[2] = 0;
- lin->a[3] = 0;
- lin->a[4] = 1;
- lin->a[5] = 0;
- lin->a[6] = 1;
- lin->p_offset = 0;
- lin->p_mult = 1;
- lin->p_div = 1;
- lin->swap_xy = 0;
+ clock_gettime(CLOCK_MONOTONIC, &(lin->last));
+ linear_read_pointercal(lin);
/*
- * Check calibration file
- */
- if( (calfile = getenv("TSLIB_CALIBFILE")) == NULL) calfile = defaultcalfile;
- if(stat(calfile,&sbuf)==0) {
- pcal_fd = open(calfile,O_RDONLY);
- read(pcal_fd,pcalbuf,200);
- lin->a[0] = atoi(strtok(pcalbuf," "));
- index=1;
- while(index<7) {
- tokptr = strtok(NULL," ");
- if(*tokptr!='\0') {
- lin->a[index] = atoi(tokptr);
- index++;
- }
- }
-#ifdef DEBUG
- printf("Linear calibration constants: ");
- for(index=0;index<7;index++) printf("%d ",lin->a[index]);
- printf("\n");
-#endif /*DEBUG*/
- close(pcal_fd);
- }
-
-
- /*
* Parse the parameters.
*/
if (tslib_parse_vars(&lin->module, linear_vars, NR_VARS, params)) {
Over!