This repository has been archived by the owner on Apr 14, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.go
76 lines (67 loc) · 1.7 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
import (
"github.com/aprosvetova/ninebot-mqtt/mqtt"
"github.com/aprosvetova/ninebot-mqtt/scooter"
"github.com/currantlabs/ble"
"github.com/currantlabs/ble/linux"
"log"
)
var mqttC *mqtt.Client
var connected = make(map[string]struct{})
var config *Config
func main() {
var err error
config, err = getConfig()
if err != nil {
log.Printf("can't load config file, DEFAULT VALUES will be used: %s\n", err)
}
d, err := linux.NewDevice()
if err != nil {
log.Fatalf("can't create BLE device: %s\n", err)
}
ble.SetDefaultDevice(d)
mqttC, err = mqtt.Connect(mqtt.Options{
Address: config.Address,
Username: config.Username,
Password: config.Password,
BatteryTopic: config.BatteryTopic,
AvailabilityTopic: config.AvailabilityTopic,
PayloadAvailable: config.PayloadAvailable,
PayloadNotAvailable: config.PayloadNotAvailable,
})
if err != nil {
log.Fatalf("can't connect to MQTT: %s\n", err)
}
log.Println("connected to MQTT")
log.Println("started listening")
for {
scooters, err := scooter.FindScooters()
if err.Error() == "context canceled" {
log.Fatalln("quitting...")
}
for _, mac := range scooters {
if !containsKey(connected, mac) && !containsKey(config.ignoredScootersMap, mac) {
go connect(mac)
}
}
}
}
func connect(mac string) {
connected[mac] = struct{}{}
name := scooter.Listen(mac, handleBattery)
if config.ScooterNaming == "mac" {
name = mac
}
mqttC.SendOffline(name)
delete(connected, mac)
}
func handleBattery(name string, mac string, percent int) {
if config.ScooterNaming == "mac" {
name = mac
}
mqttC.SendBatteryStatus(name, percent)
}
func containsKey(m map[string]struct{}, v string) bool {
_, contains := m[v]
return contains
}