/FlowerPowerDriver.go

https://gitlab.com/brucealdridge/driver-go-sensortag · Go · 139 lines · 109 code · 29 blank · 1 comment · 22 complexity · 28eea6e4a4f5f8058bbbe5fc185d9850 MD5 · raw file

  1. package main
  2. import (
  3. "fmt"
  4. "os/exec"
  5. "regexp"
  6. "strings"
  7. "github.com/davecgh/go-spew/spew"
  8. "github.com/ninjasphere/gatt"
  9. "github.com/ninjasphere/go-ninja/api"
  10. "github.com/ninjasphere/go-ninja/model"
  11. )
  12. var activeFlowerPowers = make(map[string]bool)
  13. var announcedFlowerPowers = make(map[string]bool)
  14. var info = ninja.LoadModuleInfo("./package.json")
  15. type FlowerPowerDriver struct {
  16. config *FlowerPowerDriverConfig
  17. conn *ninja.Connection
  18. sendEvent func(event string, payload interface{}) error
  19. gattClient *gatt.Client
  20. }
  21. type FlowerPowerDriverConfig struct {
  22. NumberOfDevices int
  23. }
  24. func defaultConfig() *FlowerPowerDriverConfig {
  25. return &FlowerPowerDriverConfig{
  26. NumberOfDevices: 0,
  27. }
  28. }
  29. func NewFlowerPowerDriver() (*FlowerPowerDriver, error) {
  30. conn, err := ninja.Connect("FlowerPower")
  31. if err != nil {
  32. log.Fatalf("Failed to create Flower Power driver: %s", err)
  33. }
  34. driver := &FlowerPowerDriver{
  35. conn: conn,
  36. }
  37. err = conn.ExportDriver(driver)
  38. if err != nil {
  39. log.Fatalf("Failed to export FlowerPower driver: %s", err)
  40. }
  41. return driver, nil
  42. }
  43. func (d *FlowerPowerDriver) foundDevice(device *gatt.DiscoveredDevice) {
  44. // log.Infof("found device %s", device.Address)
  45. for uuid, _ := range device.Advertisement.ServiceUuids {
  46. if uuid == flowerPowerServiceUuid {
  47. if announcedFlowerPowers[device.Address] {
  48. return
  49. }
  50. log.Infof("Making flower power %s", device.Address)
  51. fp := NewFlowerPower(d, d.gattClient, device)
  52. err := d.conn.ExportDevice(fp)
  53. if err != nil {
  54. log.Fatalf("Failed to export flowerpower %+v %s", fp, err)
  55. }
  56. err = d.conn.ExportChannel(fp, fp.temperatureChannel, "temperature")
  57. if err != nil {
  58. log.Fatalf("Failed to export flowerpower temperature channel %s, dumping device info", err)
  59. spew.Dump(fp)
  60. }
  61. err = d.conn.ExportChannel(fp, fp.moistureChannel, "moisture")
  62. if err != nil {
  63. log.Fatalf("Failed to export flowerpower moisture channel %s, dumping device info", fp, err)
  64. spew.Dump(fp)
  65. }
  66. err = d.conn.ExportChannel(fp, fp.illuminanceChannel, "illuminance")
  67. if err != nil {
  68. log.Fatalf("Failed to export flowerpower illuminance channel %s, dumping device info", err)
  69. spew.Dump(fp)
  70. }
  71. announcedFlowerPowers[device.Address] = true
  72. }
  73. }
  74. }
  75. func (d *FlowerPowerDriver) Start(config *FlowerPowerDriverConfig) error {
  76. log.Infof("Flower Power Driver Starting with config %v", config)
  77. out, err := exec.Command("hciconfig").Output()
  78. if err != nil {
  79. log.Errorf(fmt.Sprintf("Error: %s", err))
  80. }
  81. re := regexp.MustCompile("([0-9A-F]{2}\\:{0,1}){6}")
  82. mac := strings.Replace(re.FindString(string(out)), ":", "", -1)
  83. log.Infof("The local mac is %s\n", mac)
  84. client := &gatt.Client{
  85. StateChange: func(newState string) {
  86. log.Infof("Client state change: %s", newState)
  87. },
  88. }
  89. d.gattClient = client
  90. client.Advertisement = d.foundDevice
  91. err = client.Start()
  92. if err != nil {
  93. log.FatalError(err, "Failed to start client")
  94. }
  95. err = client.StartScanning(true)
  96. if err != nil {
  97. log.FatalError(err, "Failed to start scanning")
  98. }
  99. return nil
  100. }
  101. func (d *FlowerPowerDriver) Stop() error {
  102. log.Infof("Flower Power Driver stopping")
  103. return nil
  104. }
  105. func (d *FlowerPowerDriver) GetModuleInfo() *model.Module {
  106. return info
  107. }
  108. func (d *FlowerPowerDriver) SetEventHandler(sendEvent func(event string, payload interface{}) error) {
  109. d.sendEvent = sendEvent
  110. }