> With a little more digging on this I think the issue is down to the > default calibration values. I have further confirmation that this is due to the calibration used when the dial is presented via the joystick interface. The values in the event interface are correct. See 'joydev_correct()' from 'driver/input/joydev.c' The problem is that the 'broken line' calibration can not properly represent/process a value with a small range - I guess this does not matter when there is a large input range. In my system I have a dial (RZ) with 4 positions (0..3): expect to see -32768, -10922, +10922, +32768 actually see -32768, 0, 32768, 65536 (limited to 32768) Anyone got suggestions? Simon -- More info: jscal -s 8, 1,0, 0,0,298261,298261, // Wheel = -1800..1800 1,0, 511,511,1050628,1050628, // Throttle = 0..1023 1,0, 511,511,1050628,1050628, // Brake = 0..1023 1,0, 5,5,107374182,107374182, // RX = 0..12 1,0, 5,5,107374182,107374182, // RY = 0..12 1,0, 1,1,536870912,536870912, // RZ = 0..3 1,0, 0,0,536870912,536870912, // Hat = -1..1 1,0, 0,0,536870912,536870912 // Hat = -1..1 /dev/input/js0 from driver/input/joydev.c -- case JS_CORR_BROKEN: value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 : ((corr->coef[3] * (value - corr->coef[1])) >> 14)) : ((corr->coef[2] * (value - corr->coef[0])) >> 14); break; -- case JS_CORR_BROKEN: if (value > corr->coef[0]) { if (value < corr->coef[1]) { value = 0 } else { value = ((corr->coef[3] * (value - corr->coef[1])) >> 14) } } else { value = ((corr->coef[2] * (value - corr->coef[0])) >> 14) } break; -- RZ = 0,1,2,3 : expect to see -32768, -10922, +10922, +32768 actually see -32768, 0, 32768, 65536 (limited to 32768)
#include <stdlib.h> #include <stdio.h> int coef[] = { 1,1,536870912,536870912}; int compute(int value) { #if 1 value = value > coef[0] ? (value < coef[1] ? 0 : ((coef[3] * (value - coef[1])) >> 14)) : ((coef[2] * (value - coef[0])) >> 14); #else if (value > coef[0]) { if (value < coef[1]) { value = 0; } else { value = ((coef[3] * (value - coef[1])) >> 14); } } else { value = ((coef[2] * (value - coef[0])) >> 14); } #endif return value; } main() { printf("value = %d\n", compute(0)); printf("value = %d\n", compute(1)); printf("value = %d\n", compute(2)); printf("value = %d\n", compute(3)); }