serialmgr.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package main
  2. import (
  3. "sync"
  4. "time"
  5. "github.com/goburrow/serial"
  6. "lc/common/protocol"
  7. )
  8. var _once sync.Once
  9. var _single *SerialMgr
  10. type SerialMgr struct {
  11. mu sync.Mutex
  12. mapSerial map[uint8]*serialPort
  13. mapSerialPort map[uint8]*protocol.SerialPort
  14. }
  15. func GetSerialMgr() *SerialMgr {
  16. _once.Do(func() {
  17. _single = &SerialMgr{
  18. mapSerial: make(map[uint8]*serialPort),
  19. mapSerialPort: make(map[uint8]*protocol.SerialPort),
  20. }
  21. })
  22. return _single
  23. }
  24. func openSerialPort(sp *protocol.SerialPort) (*serialPort, error) {
  25. config := serial.Config{Address: sp.Address, BaudRate: sp.BaudRate, DataBits: int(sp.DataBits),
  26. StopBits: int(sp.StopBits), Parity: sp.Parity,
  27. Timeout: time.Duration(sp.Timeout) * time.Microsecond}
  28. var err error
  29. var port serialPort
  30. port.setSerialConfig(config)
  31. port.SetAutoReconnect(SerialDefaultAutoReconnect)
  32. err = port.connect()
  33. if err != nil {
  34. return nil, err
  35. }
  36. return &port, nil
  37. }
  38. func (o *SerialMgr) AddSerialPorts(mapSP map[uint8]*protocol.SerialPort) {
  39. if len(mapSP) == 0 {
  40. return
  41. }
  42. o.mu.Lock()
  43. defer o.mu.Unlock()
  44. //先全部关闭并删除
  45. for k, v := range o.mapSerial {
  46. _ = v.Close()
  47. delete(o.mapSerial, k)
  48. }
  49. //重新打开
  50. for _, sp := range mapSP {
  51. var s protocol.SerialPort
  52. s = *sp
  53. port, _ := openSerialPort(&s)
  54. if port != nil {
  55. o.mapSerial[sp.Code] = port
  56. }
  57. }
  58. o.mapSerialPort = mapSP
  59. }
  60. func (o *SerialMgr) UpdateSerialPort(sp *protocol.SerialPort) error {
  61. if sp == nil {
  62. return nil
  63. }
  64. o.mu.Lock()
  65. defer o.mu.Unlock()
  66. if s, ok := o.mapSerial[sp.Code]; ok { //存在则关闭,并重新打开
  67. _ = s.Close() //关闭
  68. delete(o.mapSerial, sp.Code)
  69. }
  70. port, err := openSerialPort(sp)
  71. if port != nil {
  72. o.mapSerial[sp.Code] = port
  73. }
  74. o.mapSerialPort[sp.Code] = sp
  75. return err
  76. }
  77. func (o *SerialMgr) RemoveSerialPort(sp *protocol.SerialPort) error {
  78. if sp == nil {
  79. return nil
  80. }
  81. var err error
  82. o.mu.Lock()
  83. defer o.mu.Unlock()
  84. if s, ok := o.mapSerial[sp.Code]; ok { //存在则关闭,并重新打开
  85. err = s.Close() //关闭
  86. delete(o.mapSerial, sp.Code)
  87. }
  88. delete(o.mapSerialPort, sp.Code)
  89. return err
  90. }
  91. func (o *SerialMgr) GetSerialPort(code uint8) *serialPort {
  92. o.mu.Lock()
  93. defer o.mu.Unlock()
  94. if s, ok := o.mapSerial[code]; ok {
  95. return s
  96. }
  97. if sp, ok := o.mapSerialPort[code]; ok {
  98. port, _ := openSerialPort(sp)
  99. if port != nil {
  100. o.mapSerial[code] = port
  101. return port
  102. }
  103. }
  104. return nil
  105. }