|
@@ -81,24 +81,21 @@ func BitsToLong(bits uint) uint {
|
|
|
return ((bits) + (8 * SIZEOF_LONG) - 1) / (8 * SIZEOF_LONG)
|
|
|
}
|
|
|
|
|
|
-func TestBit(bit uint, array []linux.UnsignedLong) bool {
|
|
|
- elem := array[ bit / ( 8 * SIZEOF_LONG)]
|
|
|
- flag := linux.UnsignedLong(1) << linux.UnsignedLong(bit % (8 * SIZEOF_LONG))
|
|
|
- return (elem & flag ) != 0
|
|
|
-}
|
|
|
-
|
|
|
func (d * Device) Topology() (string, error) {
|
|
|
buffer := [256]byte{}
|
|
|
err := d.Ioctl(linux.EVIOCGPHYS(uintptr(len(buffer))), unsafe.Pointer(&buffer))
|
|
|
return string(buffer[0:len(buffer)]), err
|
|
|
}
|
|
|
|
|
|
+func TestBit(array []uint8, bit uint) bool {
|
|
|
+ elem := uint(array[ bit / 8 ])
|
|
|
+ flag := uint(1) << uint(bit % 8)
|
|
|
+ return (elem & flag ) != 0
|
|
|
+}
|
|
|
+
|
|
|
func (d * Device) SupportedEvents() ([]uint, error) {
|
|
|
- size := BitsToLong(linux.EV_MAX)
|
|
|
- bits := make([]linux.UnsignedLong, size)
|
|
|
- for i := uint(0); i < size; i ++ {
|
|
|
- bits[i] = 0
|
|
|
- }
|
|
|
+ var bits [linux.EV_MAX / 8 + 1]uint8
|
|
|
+ size := unsafe.Sizeof(bits)
|
|
|
err := d.Ioctl(linux.EVIOCGBIT(0, uintptr(size)), unsafe.Pointer(&bits));
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
@@ -106,13 +103,54 @@ func (d * Device) SupportedEvents() ([]uint, error) {
|
|
|
fmt.Printf("size %d, bits: %v\n", size, bits)
|
|
|
result := []uint{}
|
|
|
for i := uint(0); i < uint(linux.EV_MAX); i++ {
|
|
|
- if (TestBit(i, bits)) {
|
|
|
+ if (TestBit(bits[0:len(bits)],i)) {
|
|
|
result = append(result, uint(i))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return result, nil
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+type InputAbsinfo struct {
|
|
|
+ Value int32
|
|
|
+ Minimum int32
|
|
|
+ Maximum int32
|
|
|
+ Fuzz int32
|
|
|
+ Flat int32
|
|
|
+}
|
|
|
+
|
|
|
+type AbsoluteAxis struct {
|
|
|
+ Index uint
|
|
|
+ InputAbsinfo
|
|
|
+}
|
|
|
+
|
|
|
+func (d * Device) SupportedAxes() (error) {
|
|
|
+ var abs_feat InputAbsinfo;
|
|
|
+ var abs_b [linux.ABS_MAX/8 + 1]uint8;
|
|
|
+ size := unsafe.Sizeof(abs_b)
|
|
|
+ err := d.Ioctl(linux.EVIOCGBIT(linux.EV_ABS, size), unsafe.Pointer(&abs_b))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ fmt.Printf("Supported Absolute axes:\n");
|
|
|
+ for yalv := uint(0); yalv < linux.ABS_MAX; yalv++ {
|
|
|
+ if TestBit(abs_b[0:len(abs_b)], uint(yalv)) {
|
|
|
+ fmt.Printf(" Absolute axis 0x%02x %s", yalv, linux.AbsToString(yalv))
|
|
|
+ err = d.Ioctl(linux.EVIOCGABS(uint32(yalv)), unsafe.Pointer(&abs_feat))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ fmt.Printf("%d (min:%d max:%d flat:%d fuzz:%d)\n",
|
|
|
+ abs_feat.Value,
|
|
|
+ abs_feat.Minimum,
|
|
|
+ abs_feat.Maximum,
|
|
|
+ abs_feat.Flat,
|
|
|
+ abs_feat.Fuzz);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
printf("Supported events:\n");
|