You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

62 lines
1.5 KiB

  1. package mqtt_client
  2. import (
  3. "log"
  4. "time"
  5. "github.com/AFASystems/presence/internal/pkg/model"
  6. "github.com/AFASystems/presence/internal/pkg/persistence"
  7. "github.com/boltdb/bolt"
  8. "github.com/yosssi/gmq/mqtt/client"
  9. )
  10. func IncomingMQTTProcessor(updateInterval time.Duration, cl *client.Client, db *bolt.DB, ctx *model.AppContext) chan<- model.Incoming_json {
  11. ch := make(chan model.Incoming_json, 2000)
  12. persistence.CreateBucketIfNotExists(db)
  13. ticker := time.NewTicker(updateInterval)
  14. go runProcessor(ticker, cl, ch, ctx)
  15. return ch
  16. }
  17. func runProcessor(ticker *time.Ticker, cl *client.Client, ch <-chan model.Incoming_json, ctx *model.AppContext) {
  18. for {
  19. select {
  20. case <-ticker.C:
  21. getLikelyLocations(&ctx.Settings, ctx, cl)
  22. case incoming := <-ch:
  23. processIncoming(incoming, cl, ctx)
  24. }
  25. }
  26. }
  27. func processIncoming(incoming model.Incoming_json, cl *client.Client, ctx *model.AppContext) {
  28. defer func() {
  29. if err := recover(); err != nil {
  30. log.Println("work failed:", err)
  31. }
  32. }()
  33. incoming = incomingBeaconFilter(incoming) // DONE
  34. id := getBeaconID(incoming) // DONE
  35. now := time.Now().Unix()
  36. beacons := &ctx.Beacons
  37. beacons.Lock.Lock()
  38. defer beacons.Lock.Unlock()
  39. latestList := &ctx.LatestList
  40. settings := &ctx.Settings
  41. beacon, ok := beacons.Beacons[id]
  42. if !ok {
  43. updateLatestList(incoming, now, latestList) // DONE
  44. return
  45. }
  46. updateBeaconData(&beacon, incoming, now, cl, settings)
  47. beacons.Beacons[beacon.Beacon_id] = beacon
  48. }