package com.limelight.input; import java.nio.ByteBuffer; import java.nio.ByteOrder; /** * Class that handles absolute input ranges from evdev device * @author Iwan Timmer */ public class EvdevAbsolute { public final static int UP = 1, DOWN = -1, NONE = 0; private final static int ABS_OFFSET = 0x40; private int min, max; private int avg; private int range, diff; private int flat; private boolean reverse; public EvdevAbsolute(String filename, int axis, boolean reverse) { ByteBuffer buffer = ByteBuffer.allocate(6*4); buffer.order(ByteOrder.nativeOrder()); byte[] data = buffer.array(); int request = IO.getRequest(IO.READ_ONLY, EvdevConstants.EVDEV_TYPE, ABS_OFFSET+axis, 6*4); IO.ioctl(filename, data, request); buffer.getInt(); //Skip current value min = buffer.getInt(); max = buffer.getInt(); buffer.getInt(); //Skip fuzz flat = buffer.getInt(); avg = (min+max)/2; range = max-avg; diff = max-min; this.reverse = reverse; } /** * Convert input value to short range * @param value received input * @return input value as short */ public short getShort(int value) { if (Math.abs(value-avg)max) return reverse?Short.MIN_VALUE:Short.MAX_VALUE; else if (valuemax) return reverse?0:(byte) 0xFF; else if (value(avg+range/4)) return (reverse?DOWN:UP); else if (value<(avg-range/4)) return (reverse?UP:DOWN); else return NONE; } }