input_linux.go 18 KB

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