diff --git a/controller-client/main.lua b/controller-client/main.lua index b96eaf6..6aee7f1 100644 --- a/controller-client/main.lua +++ b/controller-client/main.lua @@ -1,5 +1,10 @@ local lastMessage = 0 +local botState = { + cpuBattery = nil, + servoBattery = nil, +} + function love.draw2() love.graphics.setBackgroundColor(0, 0, 0) @@ -7,14 +12,35 @@ function love.draw2() if lastMessage == 0 then time = "Never" else - time = love.timer.getTime() - time "s ago" + time = math.floor(love.timer.getTime() - lastMessage) .. "s ago" end love.graphics.print("Last message received: " .. time, 5, 5) + + love.graphics.print("CPU Batt: " .. formatSafe("%.02f V", botState.cpuBattery), 5, 30) + love.graphics.print("Servo Batt: " .. formatSafe("%.02f V", botState.servoBattery), 5, 45) +end + +function formatSafe(format, value) + if value == nil then + return "unknown" + end + return string.format(format, value) end function love.load() love.graphics.setFont(love.graphics.newFont(15)) love.window.setFullscreen(true) + love.mqtt.subscribe("telemetry/#") +end + +function love.mqtt.message(topic, payload) + if topic == "telemetry/cpu_battery" then + botState.cpuBattery = tonumber(payload) + lastMessage = love.timer.getTime() + elseif topic == "telemetry/servo_battery" then + botState.servoBattery = tonumber(payload) + lastMessage = love.timer.getTime() + end end function love.gamepadpressed(joystick, button) diff --git a/controller-host/main.lua b/controller-host/main.lua index 08ce584..2035cd9 100644 --- a/controller-host/main.lua +++ b/controller-host/main.lua @@ -129,7 +129,7 @@ function love.mqtt.subscribe(topic) end function love.load() - love.graphics.setFont(love.graphics.newFont(15)) + love.graphics.setFont(love.graphics.newFont(20)) local requirePaths = love.filesystem.getRequirePath() love.filesystem.setRequirePath(requirePaths .. ";client/?.lua;client/?/init.lua") local mqttThread = love.thread.newThread("mqttthread.lua") diff --git a/docker-compose.yml b/docker-compose.yml index 1981d5c..c8fba9a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,13 @@ services: environment: SPIDER_HOSTNAME: spider + spider-host: + build: spider-host + restart: unless-stopped + devices: + - /dev/i2c-0 + - /dev/i2c-1 + docker-socat: build: docker-socat restart: unless-stopped diff --git a/spider-host/.gitignore b/spider-host/.gitignore new file mode 100644 index 0000000..b0c45a9 --- /dev/null +++ b/spider-host/.gitignore @@ -0,0 +1 @@ +spider-host \ No newline at end of file diff --git a/spider-host/Dockerfile b/spider-host/Dockerfile new file mode 100644 index 0000000..709fde4 --- /dev/null +++ b/spider-host/Dockerfile @@ -0,0 +1,7 @@ +FROM golang:1.22.5 + +WORKDIR /app + +COPY spider-host /spider-host + +CMD ["/spider-host"] diff --git a/spider-host/ads7830.go b/spider-host/ads7830.go new file mode 100644 index 0000000..aa0c8aa --- /dev/null +++ b/spider-host/ads7830.go @@ -0,0 +1,71 @@ +package main + +import ( + "gobot.io/x/gobot" + "gobot.io/x/gobot/drivers/i2c" + "sync" +) + +type ADS7830 struct { + //*gobot.Driver + name string + connector i2c.Connector + connection i2c.Connection + i2c.Config + mutex sync.Mutex +} + +func NewADS7830(c i2c.Connector, options ...func(config i2c.Config)) *ADS7830 { + adc := &ADS7830{ + name: gobot.DefaultName("ADS7830"), + mutex: sync.Mutex{}, + connector: c, + Config: i2c.NewConfig(), + } + + for _, option := range options { + option(adc) + } + + return adc +} + +func (adc *ADS7830) AnalogRead(channel int) (int, error) { + adc.mutex.Lock() + defer adc.mutex.Unlock() + + register := 0x84 | (((channel<<2 | channel>>1) & 0x07) << 4) + value, err := adc.connection.ReadByteData(uint8(register)) + if err != nil { + return 0, err + } + return int(value), nil +} + +func (adc *ADS7830) Name() string { + return adc.name +} + +func (adc *ADS7830) SetName(name string) { + adc.name = name +} + +func (adc *ADS7830) Start() (err error) { + bus := adc.GetBusOrDefault(adc.connector.GetDefaultBus()) + address := adc.GetAddressOrDefault(0x48) + + adc.connection, err = adc.connector.GetConnection(address, bus) + if err != nil { + return err + } + + return nil +} + +func (adc *ADS7830) Halt() error { + return nil +} + +func (adc *ADS7830) Connection() gobot.Connection { + return adc.connector.(gobot.Connection) +} diff --git a/spider-host/battery.go b/spider-host/battery.go new file mode 100644 index 0000000..2f8c777 --- /dev/null +++ b/spider-host/battery.go @@ -0,0 +1,47 @@ +package main + +import ( + "gobot.io/x/gobot/drivers/i2c" + "gobot.io/x/gobot/platforms/raspi" + "log" +) + +var rpi *raspi.Adaptor +var ads *ADS7830 + +//var mpu *i2c.MPU6050Driver +//mpu = i2c.NewMPU6050Driver(rpi, i2c.WithBus(0), i2c.WithAddress(0x40)) + +func InitBattery() { + rpi = raspi.NewAdaptor() + rpi.Connect() + ads = NewADS7830(rpi, i2c.WithBus(1), i2c.WithAddress(0x48)) + ads.Start() +} + +func GetBatteryServo() (float32, error) { + value, err := getBattery(0) + if err != nil { + log.Print("Error reading battery: ", err) + } + log.Print("Servo Battery state: ", value) + return value, err +} + +func GetBatteryCPU() (float32, error) { + value, err := getBattery(4) + if err != nil { + log.Print("Error reading battery: ", err) + } + log.Print("CPU Battery state: ", value) + return value, err +} + +func getBattery(channel int) (float32, error) { + value, err := ads.AnalogRead(channel) + if err != nil { + return 0, err + } + converted := float32(value) / 255 * 5 * 3 + return converted, nil +} diff --git a/spider-host/build_and_upload.sh b/spider-host/build_and_upload.sh new file mode 100755 index 0000000..248144f --- /dev/null +++ b/spider-host/build_and_upload.sh @@ -0,0 +1,4 @@ +set -e +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-w" -o spider-host +cd .. +./docker.sh compose up spider-host -d --build diff --git a/spider-host/go.mod b/spider-host/go.mod new file mode 100644 index 0000000..79e11a9 --- /dev/null +++ b/spider-host/go.mod @@ -0,0 +1,21 @@ +module spider-host + +go 1.22 + +require ( + github.com/eclipse/paho.mqtt.golang v1.4.3 + gobot.io/x/gobot v1.16.0 +) + +require ( + github.com/gofrs/uuid v4.0.0+incompatible // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.0.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/sigurn/crc8 v0.0.0-20160107002456-e55481d6f45c // indirect + github.com/sigurn/utils v0.0.0-20190728110027-e1fefb11a144 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + periph.io/x/periph v3.6.2+incompatible // indirect +) diff --git a/spider-host/go.sum b/spider-host/go.sum new file mode 100644 index 0000000..846a65d --- /dev/null +++ b/spider-host/go.sum @@ -0,0 +1,115 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/JuulLabs-OSS/cbgo v0.0.2/go.mod h1:L4YtGP+gnyD84w7+jN66ncspFRfOYB5aj9QSXaFHmBA= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/goselect v0.1.1/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/donovanhide/eventsource v0.0.0-20171031113327-3ed64d21fb0b/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= +github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/go-ble/ble v0.0.0-20190521171521-147700f13610/go.mod h1:UMPB54/KFpdTdfH7Yovhk3J6kzgzE88e3QZi8cbayis= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hybridgroup/go-ardrone v0.0.0-20140402002621-b9750d8d7b78/go.mod h1:YllNbhGM1UEcySxCv1BWK5lre7QLmJJ+O0ADUOo2nbc= +github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab/go.mod h1:y1pL58r5z2VvAjeG1VLGc8zOQgSOzbKN7kMHPvFXJ+8= +github.com/muka/go-bluetooth v0.0.0-20200926181701-4ca7d8dd0ff5/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= +github.com/muka/go-bluetooth v0.0.0-20200928120822-44d49b402aee/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats-server/v2 v2.1.0/go.mod h1:r5y0WgCag0dTj/qiHkHrXAcKQ/f5GMOZaEGdoxxnJ4I= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/paypal/gatt v0.0.0-20151011220935-4ae819d591cf/go.mod h1:+AwQL2mK3Pd3S+TUwg0tYQjid0q1txyNUJuuSmz8Kdk= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/raff/goble v0.0.0-20190909174656-72afc67d6a99/go.mod h1:CxaUhijgLFX0AROtH5mluSY71VqpjQBw9JXE2UKZmc4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sigurn/crc8 v0.0.0-20160107002456-e55481d6f45c h1:hk0Jigjfq59yDMgd6bzi22Das5tyxU0CtOkh7a9io84= +github.com/sigurn/crc8 v0.0.0-20160107002456-e55481d6f45c/go.mod h1:cyrWuItcOVIGX6fBZ/G00z4ykprWM7hH58fSavNkjRg= +github.com/sigurn/utils v0.0.0-20190728110027-e1fefb11a144 h1:ccb8W1+mYuZvlpn/mJUMAbsFHTMCpcJBS78AsBQxNcY= +github.com/sigurn/utils v0.0.0-20190728110027-e1fefb11a144/go.mod h1:VRI4lXkrUH5Cygl6mbG1BRUfMMoT2o8BkrtBDUAm+GU= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/suapapa/go_eddystone v1.3.1/go.mod h1:bXC11TfJOS+3g3q/Uzd7FKd5g62STQEfeEIhcKe4Qy8= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/veandco/go-sdl2 v0.3.3/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.bug.st/serial v1.1.1/go.mod h1:VmYBeyJWp5BnJ0tw2NUJHZdJTGl2ecBGABHlzRK1knY= +gobot.io/x/gobot v1.16.0 h1:MQN0c5iPYBkChpPPY/zM6Au0rihJZ4QmK98kn1DKBKQ= +gobot.io/x/gobot v1.16.0/go.mod h1:CwlG5umITB/BP7qlwGdJ/LPtRu71jAXtv9hu3q+yhKo= +gocv.io/x/gocv v0.21.0/go.mod h1:Rar2PS6DV+T4FL+PM535EImD/h13hGVaHhnCu1xarBs= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +periph.io/x/periph v3.6.2+incompatible h1:B9vqhYVuhKtr6bXua8N9GeBEvD7yanczCvE0wU2LEqw= +periph.io/x/periph v3.6.2+incompatible/go.mod h1:EWr+FCIU2dBWz5/wSWeiIUJTriYv9v2j2ENBmgYyy7Y= +tinygo.org/x/bluetooth v0.2.0/go.mod h1:Rx8KLr5nmrJ4uUf4Fy14JIoV3pF9vvbQ0KCv/c+ELOo= +tinygo.org/x/drivers v0.13.0/go.mod h1:mShi1lpVtJFpApkZgwyrzDKHToeGfWIuB08utyHxZ7g= diff --git a/spider-host/main.go b/spider-host/main.go new file mode 100644 index 0000000..0e3d8fe --- /dev/null +++ b/spider-host/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "log" + "time" +) + +const broker = "tcp://mqtt.seeseepuff.be:1883" +const telemetryTopic = "spider/telemetry/" + +func publishServoBatteryTelemetry(client mqtt.Client) { + value, err := GetBatteryServo() + if err != nil { + return + } + token := client.Publish(telemetryTopic+"servo_battery", 0, false, fmt.Sprintf("%f", value)) + token.Wait() + if token.Error() != nil { + log.Printf("Error publishing servo battery state: %v\n", token.Error()) + } +} + +func publishCpuBatteryTelemetry(client mqtt.Client) { + value, err := GetBatteryCPU() + if err != nil { + return + } + token := client.Publish(telemetryTopic+"cpu_battery", 0, false, fmt.Sprintf("%f", value)) + token.Wait() + if token.Error() != nil { + log.Printf("Error publishing servo battery state: %v\n", token.Error()) + } +} + +func publishTelemetry(client mqtt.Client) { + go publishServoBatteryTelemetry(client) + go publishCpuBatteryTelemetry(client) +} + +func main() { + opts := mqtt.NewClientOptions() + opts.AddBroker(broker) + opts.SetClientID("spider-host-client") + client := mqtt.NewClient(opts) + + token := client.Connect() + token.Wait() + if token.Error() != nil { + log.Fatalf("Error connecting to MQTT broker: %v\n", token.Error()) + } + + InitBattery() + + ticker := time.NewTicker(3 * time.Second) + defer ticker.Stop() + + publishTelemetry(client) + for { + select { + case <-ticker.C: + publishTelemetry(client) + } + } +} diff --git a/spider-host/run.sh b/spider-host/run.sh new file mode 100755 index 0000000..d2174c7 --- /dev/null +++ b/spider-host/run.sh @@ -0,0 +1,4 @@ +set -e +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-w" -o spider-host +cd .. +./docker.sh compose up spider-host --build diff --git a/spider-net/Dockerfile b/spider-net/Dockerfile index 2830b11..12b4522 100644 --- a/spider-net/Dockerfile +++ b/spider-net/Dockerfile @@ -2,12 +2,6 @@ FROM golang:1.22.5 WORKDIR /app -#COPY go.mod go.sum ./ -#RUN go mod download - -#COPY *.go ./ -#RUN CGO_ENABLED=0 GOOS=linux go build -o /spider-net - COPY spider-net /spider-net CMD ["/spider-net"] \ No newline at end of file diff --git a/spider-net/build_and_upload.sh b/spider-net/build_and_upload.sh index 20ef8c4..eff58fc 100755 --- a/spider-net/build_and_upload.sh +++ b/spider-net/build_and_upload.sh @@ -1,3 +1,4 @@ -CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o spider-net +set -e +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-w" -o spider-net cd .. ./docker.sh compose up spider-net -d --build diff --git a/spider-net/spider-host b/spider-net/spider-host new file mode 100755 index 0000000..adb3bc4 Binary files /dev/null and b/spider-net/spider-host differ diff --git a/upload-controller.lua b/upload-controller.lua index 25dd694..39b84c8 100644 --- a/upload-controller.lua +++ b/upload-controller.lua @@ -33,7 +33,8 @@ local function onConnect(connack) assert(client:publish { topic = "spider/controller/payload", payload = contents, - qos = 0 + qos = 0, + retain = true }) print(" DONE!") end diff --git a/upload-controller.sh b/upload-controller.sh index d2626ff..51f7b73 100755 --- a/upload-controller.sh +++ b/upload-controller.sh @@ -4,4 +4,4 @@ cd controller-client rm -vf ../controller-client.zip zip -r ../controller-client.zip * cd .. -lua upload.lua controller-client.zip +lua upload-controller.lua controller-client.zip