minitouch.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package main
  2. import (
  3. "bufio"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net"
  9. "github.com/qiniu/log"
  10. )
  11. type toucher struct {
  12. width, height int
  13. rotation int
  14. }
  15. type TouchRequest struct {
  16. Operation string `json:"operation"` // d, m, u
  17. Index int `json:"index"`
  18. PercentX float64 `json:"xP"`
  19. PercentY float64 `json:"yP"`
  20. Milliseconds int `json:"milliseconds"`
  21. Pressure float64 `json:"pressure"`
  22. }
  23. // coord(0, 0) is always left-top conner, no matter the rotation changes
  24. func drainTouchRequests(conn net.Conn, reqC chan TouchRequest) error {
  25. var maxX, maxY int
  26. var flag string
  27. var ver int
  28. var maxContacts, maxPressure int
  29. var pid int
  30. lineRd := lineFormatReader{bufrd: bufio.NewReader(conn)}
  31. lineRd.Scanf("%s %d", &flag, &ver)
  32. lineRd.Scanf("%s %d %d %d %d", &flag, &maxContacts, &maxX, &maxY, &maxPressure)
  33. if err := lineRd.Scanf("%s %d", &flag, &pid); err != nil {
  34. return err
  35. }
  36. log.Debugf("handle touch requests maxX:%d maxY:%d maxPressure:%d maxContacts:%d", maxX, maxY, maxPressure, maxContacts)
  37. go io.Copy(ioutil.Discard, conn) // ignore the rest output
  38. var posX, posY int
  39. for req := range reqC {
  40. var err error
  41. switch req.Operation {
  42. case "r": // reset
  43. _, err = conn.Write([]byte("r\n"))
  44. case "d":
  45. fallthrough
  46. case "m":
  47. posX = int(req.PercentX * float64(maxX))
  48. posY = int(req.PercentY * float64(maxY))
  49. pressure := int(req.Pressure * float64(maxPressure))
  50. if pressure == 0 {
  51. pressure = maxPressure - 1
  52. }
  53. line := fmt.Sprintf("%s %d %d %d %d\n", req.Operation, req.Index, posX, posY, pressure)
  54. log.Debugf("write to @minitouch %v", line)
  55. _, err = conn.Write([]byte(line))
  56. case "u":
  57. _, err = conn.Write([]byte(fmt.Sprintf("u %d\n", req.Index)))
  58. case "c":
  59. _, err = conn.Write([]byte("c\n"))
  60. case "w":
  61. _, err = conn.Write([]byte(fmt.Sprintf("w %d\n", req.Milliseconds)))
  62. default:
  63. err = errors.New("unsupported operation: " + req.Operation)
  64. }
  65. if err != nil {
  66. return err
  67. }
  68. }
  69. return nil
  70. }
  71. type lineFormatReader struct {
  72. bufrd *bufio.Reader
  73. err error
  74. }
  75. func (r *lineFormatReader) Scanf(format string, args ...interface{}) error {
  76. if r.err != nil {
  77. return r.err
  78. }
  79. var line []byte
  80. line, _, r.err = r.bufrd.ReadLine()
  81. if r.err != nil {
  82. return r.err
  83. }
  84. _, r.err = fmt.Sscanf(string(line), format, args...)
  85. return r.err
  86. }