minitouch.go 2.3 KB

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