input_linux.go 15 KB

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