input_linux.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  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 "golang.org/x/sys/unix"
  9. import "fmt"
  10. import "path/filepath"
  11. import "time"
  12. import "sync"
  13. import "runtime"
  14. import "syscall"
  15. // Device models an input device
  16. type Device struct {
  17. FileName string
  18. *os.File
  19. syscall.RawConn
  20. // Cached device information
  21. Info struct {
  22. Events []SupportedEvent
  23. Keys []SupportedKey
  24. Axes []AbsoluteAxis
  25. Rolls []RelativeAxis
  26. Name string
  27. ID string
  28. }
  29. }
  30. const Directory = "/dev/input"
  31. var DoLogDebug = false
  32. func LogDebug(format string, args...interface{}) {
  33. if !DoLogDebug {
  34. return
  35. }
  36. LogDebug(format, args...)
  37. }
  38. func (d * Device) KeepAlive() {
  39. runtime.KeepAlive(d.File)
  40. }
  41. func (d * Device) String() string {
  42. return fmt.Sprintf("%s: %s (%s):%v,%v,%v,%v",
  43. d.FileName, d.Info.Name, d.Info.ID,
  44. d.Info.Events, d.Info.Axes, d.Info.Keys,
  45. d.Info.Rolls)
  46. }
  47. func Open(name string) (*Device, error) {
  48. f, err := os.OpenFile(filepath.Join(Directory, name),
  49. unix.O_ASYNC|unix.O_NONBLOCK|os.O_RDWR, 0666)
  50. if err != nil {
  51. return nil, err
  52. }
  53. if err = unix.SetNonblock(int(f.Fd()), true); err != nil {
  54. return nil, err
  55. }
  56. flags, err := unix.FcntlInt(f.Fd(), unix.F_GETFL, 0);
  57. if flags, err = unix.FcntlInt(f.Fd(), unix.F_SETFL, flags | unix.O_NONBLOCK); err != nil {
  58. return nil, err
  59. }
  60. rawConn, err := f.SyscallConn()
  61. if err != nil {
  62. return nil, err
  63. }
  64. return &Device{FileName: name, File: f, RawConn: rawConn}, nil
  65. }
  66. func (d *Device) GatherInfo() error {
  67. var err error
  68. if d.Info.Events, err = d.SupportedEvents(); err != nil {
  69. return err
  70. }
  71. if d.Info.Keys, err = d.SupportedKeys(); err != nil {
  72. return err
  73. }
  74. if d.Info.Axes, err = d.SupportedAxes(); err != nil {
  75. return err
  76. }
  77. if d.Info.Rolls, err = d.SupportedRelatives(); err != nil {
  78. return err
  79. }
  80. if id, err := d.Id(); err != nil {
  81. return err
  82. } else {
  83. d.Info.ID = fmt.Sprintf("%v", id)
  84. }
  85. if d.Info.Name, err = d.Name(); err != nil {
  86. return err
  87. }
  88. return nil
  89. }
  90. func OpenAndGatherInfo(name string) (*Device, error) {
  91. dev, err := Open(name)
  92. if err != nil {
  93. return dev, err
  94. }
  95. err = dev.GatherInfo()
  96. return dev, err
  97. }
  98. func List() ([]string, error) {
  99. dir, err := os.Open(Directory)
  100. if err != nil {
  101. return nil, err
  102. }
  103. names, err := dir.Readdirnames(-1)
  104. if err != nil {
  105. return names, err
  106. }
  107. results := names[:0]
  108. for _, name := range names {
  109. if strings.HasPrefix(name, "event") {
  110. results = append(results, name)
  111. }
  112. }
  113. return results, nil
  114. }
  115. // Icotl performs an ioctl on the given device
  116. func (d * Device) Ioctl(code uint32, pointer unsafe.Pointer) error {
  117. var errno syscall.Errno = 0
  118. ioctler := func (fd uintptr) {
  119. LogDebug("ioctl: %d %d %d\n", uintptr(fd), uintptr(code), uintptr(pointer))
  120. _, _, errno = unix.Syscall(
  121. unix.SYS_IOCTL,
  122. uintptr(fd),
  123. uintptr(code),
  124. uintptr(pointer))
  125. }
  126. err2 := d.Control(ioctler)
  127. if err2 != nil {
  128. return err2
  129. }
  130. if errno == 0 {
  131. return nil
  132. }
  133. return errno
  134. }
  135. // Read performs a read unix on the given device. The read is noblocking
  136. // and will retrn 0 if EAGEIN was raised.
  137. func (d * Device) Read(pointer unsafe.Pointer, size uintptr) (uintptr, error) {
  138. var errno syscall.Errno = 0
  139. var read uintptr = 0
  140. reader := func (fd uintptr) bool {
  141. LogDebug("read: %d %d %d\n", uintptr(fd), uintptr(pointer), uintptr(size))
  142. read, _, errno = unix.Syscall(
  143. unix.SYS_READ,
  144. uintptr(fd),
  145. uintptr(pointer),
  146. uintptr(size))
  147. return true
  148. }
  149. err2 := d.RawConn.Read(reader)
  150. if err2 != nil {
  151. return read, err2
  152. }
  153. if errno == 0 {
  154. return read, nil
  155. }
  156. if errno == syscall.EAGAIN {
  157. return 0, nil
  158. }
  159. return read, errno
  160. }
  161. // Read performs a read unix on the given device. The read is blocking.
  162. func (d * Device) ReadBlock(pointer unsafe.Pointer, size uintptr) (uintptr, error) {
  163. var errno syscall.Errno = 0
  164. var read uintptr = 0
  165. reader := func (fd uintptr) bool {
  166. LogDebug("read: %d %d %d\n", uintptr(fd), uintptr(pointer), uintptr(size))
  167. read, _, errno = unix.Syscall(
  168. unix.SYS_READ,
  169. uintptr(fd),
  170. uintptr(pointer),
  171. uintptr(size))
  172. return errno != syscall.EAGAIN
  173. }
  174. err2 := d.RawConn.Read(reader)
  175. if err2 != nil {
  176. return read, err2
  177. }
  178. if errno == 0 {
  179. return read, nil
  180. }
  181. return read, errno
  182. }
  183. // Write performs a write unix on the given device. The write is blocking.
  184. func (d * Device) Write(pointer unsafe.Pointer, size uintptr) (uintptr, error) {
  185. var errno syscall.Errno = 0
  186. var wrote uintptr = 0
  187. writer := func(fd uintptr) bool {
  188. LogDebug("write: %d %d %d\n", uintptr(d.Fd()), uintptr(pointer), uintptr(size))
  189. wrote, _, errno = unix.Syscall(
  190. unix.SYS_WRITE,
  191. uintptr(d.Fd()),
  192. uintptr(pointer),
  193. uintptr(size))
  194. return errno != syscall.EAGAIN
  195. }
  196. err2 := d.RawConn.Write(writer)
  197. if err2 != nil {
  198. return wrote, err2
  199. }
  200. if errno == 0 {
  201. return wrote, nil
  202. }
  203. return wrote, errno
  204. }
  205. func (d * Device) DriverVersion() (int32, error) {
  206. res := int32(0)
  207. data := unsafe.Pointer(&res)
  208. err := d.Ioctl(linux.EVIOCGVERSION, data)
  209. return res, err
  210. }
  211. const NAME_MAX = 256
  212. func (d * Device) Name() (string, error) {
  213. buffer := [NAME_MAX]byte{}
  214. err := d.Ioctl(linux.EVIOCGNAME(uintptr(len(buffer))), unsafe.Pointer(&buffer))
  215. return string(buffer[0:len(buffer)]), err
  216. }
  217. func (d * Device) Id() (linux.INPUT_id, error) {
  218. var result linux.INPUT_id
  219. err := d.Ioctl(linux.EVIOCGID, unsafe.Pointer(&result))
  220. return result, err
  221. }
  222. // The Linux developers thought it was a great idea a to use an array of
  223. // unsigned longs for the bit flags of input devices. Of course, the length
  224. // of an unsigned long is platform dependent which then entails all sorts of
  225. // gymnastics to extract the bits from the array.
  226. // To avoid this, we use a byte array instead, which might lessen performance,
  227. // but is much easier to use.
  228. // This is a unsafe.Sizeof trick, which I hope will keep working.
  229. const SIZEOF_LONG = uint(unsafe.Sizeof(*((*linux.UnsignedLong)(nil))))
  230. const BITS_PER_LONG = SIZEOF_LONG * 8
  231. func BitsToLong(bits uint) uint {
  232. return ((bits) + (8 * SIZEOF_LONG) - 1) / (8 * SIZEOF_LONG)
  233. }
  234. const TOPOLOGY_MAX = 256
  235. func (d * Device) Topology() (string, error) {
  236. buffer := [TOPOLOGY_MAX]byte{}
  237. err := d.Ioctl(linux.EVIOCGPHYS(uintptr(len(buffer))), unsafe.Pointer(&buffer))
  238. return string(buffer[0:len(buffer)]), err
  239. }
  240. func TestBit(array []uint8, bit uint) bool {
  241. elem := uint(array[ bit / 8 ])
  242. flag := uint(1) << uint(bit % 8)
  243. return (elem & flag ) != 0
  244. }
  245. type SupportedEvent uint
  246. func (se SupportedEvent) Name() string {
  247. return linux.EvToString(uint(se))
  248. }
  249. func (se SupportedEvent) String() string {
  250. return se.Name()
  251. }
  252. func (d * Device) SupportedEvents() ([]SupportedEvent, error) {
  253. var bits [linux.EV_MAX / 8 + 1]uint8
  254. size := unsafe.Sizeof(bits)
  255. err := d.Ioctl(linux.EVIOCGBIT(0, uintptr(size)), unsafe.Pointer(&bits));
  256. if err != nil {
  257. return nil, err
  258. }
  259. LogDebug("size %d, bits: %v\n", size, bits)
  260. result := []SupportedEvent{}
  261. for i := uint(0); i < uint(linux.EV_MAX); i++ {
  262. if (TestBit(bits[0:len(bits)],i)) {
  263. result = append(result, SupportedEvent(uint(i)))
  264. }
  265. }
  266. return result, nil
  267. }
  268. // More Go-like names for the low leve kernel api structs
  269. type InputAbsinfo linux.INPUT_absinfo
  270. type InputEvent linux.INPUT_event
  271. type AbsoluteAxis struct {
  272. Index uint
  273. InputAbsinfo
  274. }
  275. func (ax AbsoluteAxis) Name() string {
  276. return linux.AbsToString(ax.Index)
  277. }
  278. func (ax AbsoluteAxis) String() string {
  279. return fmt.Sprintf("%s %d (min:%d max:%d flat:%d fuzz:%d)",
  280. ax.Name(),
  281. ax.Value,
  282. ax.Minimum,
  283. ax.Maximum,
  284. ax.Flat,
  285. ax.Fuzz)
  286. }
  287. func (ev InputEvent) Time() time.Time {
  288. return time.Unix(ev.Timeval.Tv_sec, ev.Timeval.Tv_usec)
  289. }
  290. func (ev InputEvent) String() string {
  291. return fmt.Sprintf("Event: Time: %s Type: %s, Code: %d, Value:%d",
  292. ev.Time().Format("2006-01-02 15:04:05.000000"),
  293. linux.EvToString(uint(ev.Type)),
  294. ev.Code,
  295. ev.Value)
  296. }
  297. const READ_EVENTS_MAX = 64
  298. func (d * Device) ReadEvents() ([]InputEvent, error) {
  299. var events [READ_EVENTS_MAX]InputEvent
  300. size := unsafe.Sizeof(events)
  301. read, err := d.Read(unsafe.Pointer(&events), size)
  302. if err != nil {
  303. return nil, err
  304. }
  305. len := read / unsafe.Sizeof(events[0])
  306. return events[0:len], nil
  307. }
  308. func (d * Device) ReadEventsBlock() ([]InputEvent, error) {
  309. var events [READ_EVENTS_MAX]InputEvent
  310. size := unsafe.Sizeof(events)
  311. read, err := d.ReadBlock(unsafe.Pointer(&events), size)
  312. if err != nil {
  313. return nil, err
  314. }
  315. len := read / unsafe.Sizeof(events[0])
  316. return events[0:len], nil
  317. }
  318. const WRITE_EVENTS_MAX = 64
  319. func (d * Device) WriteEvents(events []InputEvent) (uint, error) {
  320. size := unsafe.Sizeof(events[0]) * uintptr(len(events))
  321. wrote, err := d.Write(unsafe.Pointer(&events[0]), size)
  322. len := uint(wrote / size)
  323. return len, err
  324. }
  325. func (d * Device) SupportedAxes() ([]AbsoluteAxis, error) {
  326. var abs_feat InputAbsinfo;
  327. var abs_b [linux.ABS_MAX/8 + 1]uint8;
  328. size := unsafe.Sizeof(abs_b)
  329. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_ABS, size), unsafe.Pointer(&abs_b))
  330. if err != nil {
  331. return nil, err
  332. }
  333. result := []AbsoluteAxis{}
  334. LogDebug("Supported Absolute axes:\n");
  335. for yalv := uint(0); yalv < linux.ABS_MAX; yalv++ {
  336. if TestBit(abs_b[0:len(abs_b)], uint(yalv)) {
  337. LogDebug(" Absolute axis 0x%02x %s", yalv, linux.AbsToString(yalv))
  338. err = d.Ioctl(linux.EVIOCGABS(uint32(yalv)), unsafe.Pointer(&abs_feat))
  339. if err != nil {
  340. return result, err
  341. }
  342. axis := AbsoluteAxis{Index: yalv, InputAbsinfo: abs_feat}
  343. result = append(result, axis)
  344. }
  345. }
  346. return result, nil
  347. }
  348. type SupportedKey uint
  349. func (se SupportedKey) Name() string {
  350. return linux.KeyString(uint(se))
  351. }
  352. func (se SupportedKey) String() string {
  353. return se.Name()
  354. }
  355. func (d * Device) SupportedKeys() ([]SupportedKey, error) {
  356. var bits [linux.KEY_MAX / 8 + 1]uint8
  357. size := unsafe.Sizeof(bits)
  358. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_KEY, uintptr(size)), unsafe.Pointer(&bits));
  359. if err != nil {
  360. return nil, err
  361. }
  362. LogDebug("size %d, bits: %v\n", size, bits)
  363. result := []SupportedKey{}
  364. for i := uint(0); i < uint(linux.KEY_MAX); i++ {
  365. if (TestBit(bits[0:len(bits)],i)) {
  366. result = append(result, SupportedKey(uint(i)))
  367. }
  368. }
  369. return result, nil
  370. }
  371. type RelativeAxis uint
  372. func (se RelativeAxis) Name() string {
  373. return linux.RelString(uint(se))
  374. }
  375. func (se RelativeAxis) String() string {
  376. return se.Name()
  377. }
  378. func (d * Device) SupportedRelatives() ([]RelativeAxis, error) {
  379. var bits [linux.REL_MAX / 8 + 1]uint8
  380. size := unsafe.Sizeof(bits)
  381. err := d.Ioctl(linux.EVIOCGBIT(linux.EV_REL, uintptr(size)), unsafe.Pointer(&bits));
  382. if err != nil {
  383. return nil, err
  384. }
  385. LogDebug("size %d, bits: %v\n", size, bits)
  386. result := []RelativeAxis{}
  387. for i := uint(0); i < uint(linux.REL_MAX); i++ {
  388. if (TestBit(bits[0:len(bits)],i)) {
  389. result = append(result, RelativeAxis(uint(i)))
  390. }
  391. }
  392. return result, nil
  393. }
  394. // MANAGER_DEVICE_SCAN_DELAY is the delay between device scans for the device driver.
  395. const MANAGER_DEVICE_SCAN_DELAY = 3 * time.Second
  396. type Driver struct {
  397. sync.Mutex
  398. Connect chan(*Device)
  399. Disconnect chan(*Device)
  400. Errors chan(error)
  401. Events chan(InputEvent)
  402. Done bool
  403. Devices []*Device
  404. DevicesByName map[string] *Device
  405. DevicesByFd map[int] *Device
  406. Verbose bool
  407. fds []unix.PollFd
  408. }
  409. func NewDriver() * Driver {
  410. eveChan := make(chan InputEvent)
  411. conChan := make(chan *Device)
  412. disChan := make(chan *Device)
  413. errChan := make(chan error)
  414. driver := &Driver{Connect: conChan, Disconnect: disChan, Errors: errChan,
  415. Events: eveChan,
  416. Done: false}
  417. driver.Devices = []*Device{}
  418. driver.DevicesByName = make(map[string] *Device)
  419. driver.DevicesByFd = make(map[int] *Device)
  420. driver.fds = []unix.PollFd{}
  421. return driver
  422. }
  423. func (driver *Driver) connectDevice(device * Device) {
  424. driver.Lock()
  425. defer driver.Unlock()
  426. driver.DevicesByName[device.FileName] = device
  427. driver.DevicesByFd[int(device.Fd())] = device
  428. driver.Devices = append(driver.Devices, device)
  429. pollfd := unix.PollFd{Fd: int32(device.Fd()), Events : unix.POLLIN}
  430. driver.fds = append(driver.fds, pollfd)
  431. driver.Connect <- device
  432. }
  433. func (driver *Driver) disconnectDevice(device * Device) {
  434. driver.Lock()
  435. defer driver.Unlock()
  436. delete(driver.DevicesByName, device.FileName)
  437. delete(driver.DevicesByFd, int(device.Fd()))
  438. found := false
  439. var i int
  440. var pollfd unix.PollFd
  441. for i, pollfd = range driver.fds {
  442. if pollfd.Fd == int32(device.Fd()) {
  443. found = true
  444. break
  445. }
  446. }
  447. if found {
  448. driver.fds = append(driver.fds[:i], driver.fds[(i+1):]...)
  449. driver.Devices = append(driver.Devices[:i], driver.Devices[(i+1):]...)
  450. driver.Disconnect <- device
  451. }
  452. }
  453. func (driver * Driver) ManageNewDevicesOnce() {
  454. fmt.Println("ManageNewDevicesOnce")
  455. names, err := List()
  456. if err != nil {
  457. driver.Errors <- err
  458. } else {
  459. for _, name := range names {
  460. if _, found := driver.DevicesByName[name] ; !found {
  461. device, err := OpenAndGatherInfo(name)
  462. if err == nil {
  463. driver.connectDevice(device)
  464. } else if driver.Verbose {
  465. driver.Errors <- err
  466. }
  467. }
  468. }
  469. }
  470. }
  471. func (driver *Driver) ReadEventsOnce(device * Device) {
  472. events, err := device.ReadEvents()
  473. if err != nil {
  474. driver.Errors <- err
  475. driver.disconnectDevice(device)
  476. } else {
  477. for _, event := range events {
  478. driver.Events <- event
  479. }
  480. }
  481. }
  482. func (driver *Driver) ManageInputOnce() {
  483. res, err := unix.Poll(driver.fds, 0)
  484. if err != nil {
  485. driver.Errors <- err
  486. }
  487. if res > 0 {
  488. for _, fd := range driver.fds {
  489. if (fd.Revents & unix.POLLIN) != 0 {
  490. device, ok := driver.DevicesByFd[int(fd.Fd)]
  491. if ok && device != nil {
  492. driver.ReadEventsOnce(device)
  493. }
  494. }
  495. if (fd.Revents & unix.POLLHUP) != 0 {
  496. device, ok := driver.DevicesByFd[int(fd.Fd)]
  497. if ok && device != nil {
  498. driver.disconnectDevice(device)
  499. }
  500. }
  501. }
  502. }
  503. }
  504. func (driver *Driver) ManageDevices() {
  505. for !driver.Done {
  506. driver.ManageNewDevicesOnce()
  507. time.Sleep(MANAGER_DEVICE_SCAN_DELAY)
  508. }
  509. }
  510. func (driver *Driver) ManageInput() {
  511. for !driver.Done {
  512. driver.ManageInputOnce()
  513. }
  514. }
  515. func (driver *Driver) Start() {
  516. go driver.ManageDevices()
  517. go driver.ManageInput()
  518. }
  519. func (driver *Driver) Stop() {
  520. driver.Lock() ; defer driver.Unlock()
  521. driver.Done = true
  522. }
  523. /*
  524. printf("Supported events:\n");
  525. for (i = 0; i < EV_MAX; i++)
  526. if (TestBit(i, bit[0])) {
  527. }
  528. printf("Testing ... (interrupt to exit)\n");
  529. while (1) {
  530. rd = read(fd, ev, sizeof(struct input_event) * 64);
  531. if (rd < (int) sizeof(struct input_event)) {
  532. printf("yyy\n");
  533. perror("\nevtest: error reading");
  534. return 1;
  535. }
  536. for (i = 0; i < rd / sizeof(struct input_event); i++)
  537. if (ev[i].type == EV_SYN) {
  538. printf("Event: time %ld.%06ld, -------------- %s ------------\n",
  539. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].code ? "Config Sync" : "Report Sync" );
  540. } else if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN)) {
  541. printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %02x\n",
  542. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
  543. events[ev[i].type] ? events[ev[i].type] : "?",
  544. ev[i].code,
  545. names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
  546. ev[i].value);
  547. } else {
  548. printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",
  549. ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
  550. events[ev[i].type] ? events[ev[i].type] : "?",
  551. ev[i].code,
  552. names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
  553. ev[i].value);
  554. }
  555. }
  556. }
  557. */