input_linux.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. /* package input is a thing Go wrapper around the Linux kernel input event
  2. * system. */
  3. package input
  4. import "gitlab.com/beoran/galago/os/linux"
  5. import "strings"
  6. import "os"
  7. import "unsafe"
  8. import syscall "golang.org/x/sys/unix"
  9. import "fmt"
  10. import "path/filepath"
  11. import "time"
  12. import "sync"
  13. import "runtime"
  14. // Device models an input device
  15. type Device struct {
  16. FileName string
  17. *os.File
  18. }
  19. const Directory = "/dev/input"
  20. func (d * Device) KeepAlive() {
  21. runtime.KeepAlive(d.File)
  22. }
  23. func Open(name string) (*Device, error) {
  24. f, err := os.OpenFile(filepath.Join(Directory, name),
  25. syscall.O_ASYNC|syscall.O_NONBLOCK|os.O_RDWR, 0666)
  26. if err != nil {
  27. return nil, err
  28. }
  29. if err = syscall.SetNonblock(int(f.Fd()), true); err != nil {
  30. return nil, err
  31. }
  32. flags, err := syscall.FcntlInt(f.Fd(), syscall.F_GETFL, 0);
  33. if flags, err = syscall.FcntlInt(f.Fd(), syscall.F_SETFL, flags | syscall.O_NONBLOCK); err != nil {
  34. return nil, err
  35. }
  36. return &Device{FileName: name, File: f}, nil
  37. }
  38. func List() ([]string, error) {
  39. dir, err := os.Open(Directory)
  40. if err != nil {
  41. return nil, err
  42. }
  43. names, err := dir.Readdirnames(-1)
  44. if err != nil {
  45. return names, err
  46. }
  47. results := names[:0]
  48. for _, name := range names {
  49. if strings.HasPrefix(name, "event") {
  50. results = append(results, name)
  51. }
  52. }
  53. return results, nil
  54. }
  55. // Icotl performs an ioctl on the given device
  56. func (d * Device) Ioctl(code uint32, pointer unsafe.Pointer) error {
  57. fmt.Printf("ioctl: %d %d %d\n", uintptr(d.Fd()), uintptr(code), uintptr(pointer))
  58. _, _, errno := syscall.Syscall(
  59. syscall.SYS_IOCTL,
  60. uintptr(d.Fd()),
  61. uintptr(code),
  62. uintptr(pointer))
  63. if (errno != 0) {
  64. return errno
  65. }
  66. d.KeepAlive()
  67. return nil
  68. }
  69. func (d * Device) DriverVersion() (int32, error) {
  70. res := int32(0)
  71. data := unsafe.Pointer(&res)
  72. err := d.Ioctl(linux.EVIOCGVERSION, data)
  73. return res, err
  74. }
  75. const NAME_MAX = 256
  76. func (d * Device) Name() (string, error) {
  77. buffer := [NAME_MAX]byte{}
  78. err := d.Ioctl(linux.EVIOCGNAME(uintptr(len(buffer))), unsafe.Pointer(&buffer))
  79. return string(buffer[0:len(buffer)]), err
  80. }
  81. func (d * Device) Id() (linux.INPUT_id, error) {
  82. var result linux.INPUT_id
  83. err := d.Ioctl(linux.EVIOCGID, unsafe.Pointer(&result))
  84. return result, err
  85. }
  86. // The Linux developers thought it was a great idea a to use an array of
  87. // unsigned longs for the bit flags of input devices. Of course, the length
  88. // of an unsigned long is platform dependent which then entails all sorts of
  89. // gymnastics to extract the bits from the array.
  90. // To avoid this, we use a byte array instead, which might lessen performance,
  91. // but is much easier to use.
  92. const SIZEOF_LONG = uint(unsafe.Sizeof(*((*linux.UnsignedLong)(nil))))
  93. const BITS_PER_LONG = SIZEOF_LONG * 8
  94. func BitsToLong(bits uint) uint {
  95. return ((bits) + (8 * SIZEOF_LONG) - 1) / (8 * SIZEOF_LONG)
  96. }
  97. const TOPOLOGY_MAX = 256
  98. func (d * Device) Topology() (string, error) {
  99. buffer := [TOPOLOGY_MAX]byte{}
  100. err := d.Ioctl(linux.EVIOCGPHYS(uintptr(len(buffer))), unsafe.Pointer(&buffer))
  101. return string(buffer[0:len(buffer)]), err
  102. }
  103. func TestBit(array []uint8, bit uint) bool {
  104. elem := uint(array[ bit / 8 ])
  105. flag := uint(1) << uint(bit % 8)
  106. return (elem & flag ) != 0
  107. }
  108. type SupportedEvent uint
  109. func (se SupportedEvent) Name() string {
  110. return linux.EvToString(uint(se))
  111. }
  112. func (se SupportedEvent) String() string {
  113. return se.Name()
  114. }
  115. func (d * Device) SupportedEvents() ([]SupportedEvent, error) {
  116. var bits [linux.EV_MAX / 8 + 1]uint8
  117. size := unsafe.Sizeof(bits)
  118. err := d.Ioctl(linux.EVIOCGBIT(0, uintptr(size)), unsafe.Pointer(&bits));
  119. if err != nil {
  120. return nil, err
  121. }
  122. fmt.Printf("size %d, bits: %v\n", size, bits)
  123. result := []SupportedEvent{}
  124. for i := uint(0); i < uint(linux.EV_MAX); i++ {
  125. if (TestBit(bits[0:len(bits)],i)) {
  126. result = append(result, SupportedEvent(uint(i)))
  127. }
  128. }
  129. return result, nil
  130. }
  131. // More Go-like names for the low leve kernel api structs
  132. type InputAbsinfo linux.INPUT_absinfo
  133. type InputEvent linux.INPUT_event
  134. type AbsoluteAxis struct {
  135. Index uint
  136. InputAbsinfo
  137. }
  138. func (ax AbsoluteAxis) Name() string {
  139. return linux.AbsToString(ax.Index)
  140. }
  141. func (ax AbsoluteAxis) String() string {
  142. return fmt.Sprintf("%s %d (min:%d max:%d flat:%d fuzz:%d)",
  143. ax.Name(),
  144. ax.Value,
  145. ax.Minimum,
  146. ax.Maximum,
  147. ax.Flat,
  148. ax.Fuzz)
  149. }
  150. func (ev InputEvent) Time() time.Time {
  151. return time.Unix(ev.Timeval.Tv_sec, ev.Timeval.Tv_usec)
  152. }
  153. func (ev InputEvent) String() string {
  154. return fmt.Sprintf("Event: Time: %s Type: %s, Code: %d, Value:%d",
  155. ev.Time().Format("2006-01-02 15:04:05.000000"),
  156. linux.EvToString(uint(ev.Type)),
  157. ev.Code,
  158. ev.Value)
  159. }
  160. // Read performs a read syscall on the given device
  161. func (d * Device) Read(pointer unsafe.Pointer, size uintptr) (uintptr, error) {
  162. fmt.Printf("read: %d %d %d\n", uintptr(d.Fd()), uintptr(pointer), uintptr(size))
  163. read, _, errno := syscall.Syscall(
  164. syscall.SYS_READ,
  165. uintptr(d.Fd()),
  166. uintptr(pointer),
  167. uintptr(size))
  168. d.KeepAlive()
  169. if (errno != 0) {
  170. return read, errno
  171. }
  172. return read, nil
  173. }
  174. // Write performs a write syscall on the given device
  175. func (d * Device) Write(pointer unsafe.Pointer, size uintptr) (uintptr, error) {
  176. fmt.Printf("write: %d %d %d\n", uintptr(d.Fd()), uintptr(pointer), uintptr(size))
  177. wrote, _, errno := syscall.Syscall(
  178. syscall.SYS_WRITE,
  179. uintptr(d.Fd()),
  180. uintptr(pointer),
  181. uintptr(size))
  182. d.KeepAlive()
  183. if (errno != 0) {
  184. return wrote, errno
  185. }
  186. return wrote, nil
  187. }
  188. const READ_EVENTS_MAX = 64
  189. func (d * Device) ReadEvents() ([]InputEvent, error) {
  190. var events [READ_EVENTS_MAX]InputEvent
  191. size := unsafe.Sizeof(events)
  192. read, err := d.Read(unsafe.Pointer(&events), size)
  193. if err != nil {
  194. return nil, err
  195. }
  196. len := read / unsafe.Sizeof(events[0])
  197. return events[0:len], nil
  198. }
  199. const WRITE_EVENTS_MAX = 64
  200. func (d * Device) WriteEvents(events []InputEvent) (uint, error) {
  201. size := unsafe.Sizeof(events[0]) * uintptr(len(events))
  202. wrote, err := d.Write(unsafe.Pointer(&events[0]), size)
  203. len := uint(wrote / size)
  204. return len, err
  205. }
  206. func (d * Device) SupportedAxes() ([]AbsoluteAxis, error) {
  207. var abs_feat InputAbsinfo;
  208. var abs_b [linux.ABS_MAX/8 + 1]uint8;
  209. size := unsafe.Sizeof(abs_b)
  210. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_ABS, size), unsafe.Pointer(&abs_b))
  211. if err != nil {
  212. return nil, err
  213. }
  214. result := []AbsoluteAxis{}
  215. fmt.Printf("Supported Absolute axes:\n");
  216. for yalv := uint(0); yalv < linux.ABS_MAX; yalv++ {
  217. if TestBit(abs_b[0:len(abs_b)], uint(yalv)) {
  218. fmt.Printf(" Absolute axis 0x%02x %s", yalv, linux.AbsToString(yalv))
  219. err = d.Ioctl(linux.EVIOCGABS(uint32(yalv)), unsafe.Pointer(&abs_feat))
  220. if err != nil {
  221. return result, err
  222. }
  223. axis := AbsoluteAxis{Index: yalv, InputAbsinfo: abs_feat}
  224. result = append(result, axis)
  225. }
  226. }
  227. return result, nil
  228. }
  229. type SupportedKey uint
  230. func (se SupportedKey) Name() string {
  231. return linux.KeyString(uint(se))
  232. }
  233. func (se SupportedKey) String() string {
  234. return se.Name()
  235. }
  236. func (d * Device) SupportedKeys() ([]SupportedKey, error) {
  237. var bits [linux.KEY_MAX / 8 + 1]uint8
  238. size := unsafe.Sizeof(bits)
  239. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_KEY, uintptr(size)), unsafe.Pointer(&bits));
  240. if err != nil {
  241. return nil, err
  242. }
  243. fmt.Printf("size %d, bits: %v\n", size, bits)
  244. result := []SupportedKey{}
  245. for i := uint(0); i < uint(linux.KEY_MAX); i++ {
  246. if (TestBit(bits[0:len(bits)],i)) {
  247. result = append(result, SupportedKey(uint(i)))
  248. }
  249. }
  250. return result, nil
  251. }
  252. type RelativeAxis uint
  253. func (se RelativeAxis) Name() string {
  254. return linux.RelString(uint(se))
  255. }
  256. func (se RelativeAxis) String() string {
  257. return se.Name()
  258. }
  259. func (d * Device) RelativeAxes() ([]RelativeAxis, error) {
  260. var bits [linux.REL_MAX / 8 + 1]uint8
  261. size := unsafe.Sizeof(bits)
  262. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_REL, uintptr(size)), unsafe.Pointer(&bits));
  263. if err != nil {
  264. return nil, err
  265. }
  266. fmt.Printf("size %d, bits: %v\n", size, bits)
  267. result := []RelativeAxis{}
  268. for i := uint(0); i < uint(linux.REL_MAX); i++ {
  269. if (TestBit(bits[0:len(bits)],i)) {
  270. result = append(result, RelativeAxis(uint(i)))
  271. }
  272. }
  273. return result, nil
  274. }
  275. // MANAGER_DEVICE_SCAN_DELAY is the delay between device scans for the device manager.
  276. const MANAGER_DEVICE_SCAN_DELAY = 3 * time.Second
  277. type Manager struct {
  278. sync.Mutex
  279. Connect chan(*Device)
  280. Disconnect chan(*Device)
  281. Errors chan(error)
  282. Events chan(InputEvent)
  283. Done bool
  284. Devices []*Device
  285. DevicesByName map[string] *Device
  286. DevicesByFd map[int] *Device
  287. Verbose bool
  288. fds []syscall.PollFd
  289. }
  290. func NewManager(connect chan(*Device), disconnect chan(*Device), event chan(InputEvent), errors chan(error), done chan (struct{})) * Manager {
  291. manager := &Manager{Connect: connect, Disconnect: disconnect, Errors: errors, Done: false}
  292. manager.Events = event
  293. manager.Devices = []*Device{}
  294. manager.DevicesByName = make(map[string] *Device)
  295. manager.DevicesByFd = make(map[int] *Device)
  296. manager.fds = []syscall.PollFd{}
  297. return manager
  298. }
  299. func (manager *Manager) connectDevice(device * Device) {
  300. manager.Lock()
  301. defer manager.Unlock()
  302. manager.DevicesByName[device.FileName] = device
  303. manager.DevicesByFd[int(device.Fd())] = device
  304. manager.Devices = append(manager.Devices, device)
  305. pollfd := syscall.PollFd{Fd: int32(device.Fd()), Events : syscall.POLLIN}
  306. manager.fds = append(manager.fds, pollfd)
  307. manager.Connect <- device
  308. }
  309. func (manager *Manager) disconnectDevice(device * Device) {
  310. manager.Lock()
  311. defer manager.Unlock()
  312. delete(manager.DevicesByName, device.FileName)
  313. delete(manager.DevicesByFd, int(device.Fd()))
  314. found := false
  315. var i int
  316. var pollfd syscall.PollFd
  317. for i, pollfd = range manager.fds {
  318. if pollfd.Fd == int32(device.Fd()) {
  319. found = true
  320. break
  321. }
  322. }
  323. if found {
  324. manager.fds = append(manager.fds[:i], manager.fds[(i+1):]...)
  325. manager.Devices = append(manager.Devices[:i], manager.Devices[(i+1):]...)
  326. manager.Disconnect <- device
  327. }
  328. }
  329. func (manager * Manager) ManageNewDevicesOnce() {
  330. fmt.Println("ManageNewDevicesOnce")
  331. names, err := List()
  332. if err != nil {
  333. manager.Errors <- err
  334. } else {
  335. for _, name := range names {
  336. if _, found := manager.DevicesByName[name] ; !found {
  337. device, err := Open(name)
  338. if err == nil {
  339. manager.connectDevice(device)
  340. } else if manager.Verbose {
  341. manager.Errors <- err
  342. }
  343. }
  344. }
  345. }
  346. }
  347. func (manager *Manager) ReadEventsOnce(device * Device) {
  348. events, err := device.ReadEvents()
  349. if err != nil {
  350. manager.Errors <- err
  351. manager.disconnectDevice(device)
  352. } else {
  353. for _, event := range events {
  354. manager.Events <- event
  355. }
  356. }
  357. }
  358. func (manager *Manager) ManageInputOnce() {
  359. res, err := syscall.Poll(manager.fds, 0)
  360. if err != nil {
  361. manager.Errors <- err
  362. }
  363. if res > 0 {
  364. for _, fd := range manager.fds {
  365. if (fd.Revents & syscall.POLLIN) != 0 {
  366. device, ok := manager.DevicesByFd[int(fd.Fd)]
  367. if ok && device != nil {
  368. manager.ReadEventsOnce(device)
  369. }
  370. }
  371. if (fd.Revents & syscall.POLLHUP) != 0 {
  372. device, ok := manager.DevicesByFd[int(fd.Fd)]
  373. if ok && device != nil {
  374. manager.disconnectDevice(device)
  375. }
  376. }
  377. }
  378. }
  379. }
  380. func (manager *Manager) ManageDevices() {
  381. for !manager.Done {
  382. manager.ManageNewDevicesOnce()
  383. time.Sleep(MANAGER_DEVICE_SCAN_DELAY)
  384. }
  385. }
  386. func (manager *Manager) ManageInput() {
  387. for !manager.Done {
  388. manager.ManageInputOnce()
  389. }
  390. }
  391. func (manager *Manager) Start() {
  392. go manager.ManageDevices()
  393. go manager.ManageInput()
  394. }
  395. func (manager *Manager) Stop() {
  396. manager.Lock() ; defer manager.Unlock()
  397. manager.Done = true
  398. }
  399. /*
  400. printf("Supported events:\n");
  401. for (i = 0; i < EV_MAX; i++)
  402. if (TestBit(i, bit[0])) {
  403. }
  404. printf("Testing ... (interrupt to exit)\n");
  405. while (1) {
  406. rd = read(fd, ev, sizeof(struct input_event) * 64);
  407. if (rd < (int) sizeof(struct input_event)) {
  408. printf("yyy\n");
  409. perror("\nevtest: error reading");
  410. return 1;
  411. }
  412. for (i = 0; i < rd / sizeof(struct input_event); i++)
  413. if (ev[i].type == EV_SYN) {
  414. printf("Event: time %ld.%06ld, -------------- %s ------------\n",
  415. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].code ? "Config Sync" : "Report Sync" );
  416. } else if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN)) {
  417. printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %02x\n",
  418. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
  419. events[ev[i].type] ? events[ev[i].type] : "?",
  420. ev[i].code,
  421. names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
  422. ev[i].value);
  423. } else {
  424. printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",
  425. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
  426. events[ev[i].type] ? events[ev[i].type] : "?",
  427. ev[i].code,
  428. names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
  429. ev[i].value);
  430. }
  431. }
  432. }
  433. */