miflorad/common/gatt/impl.go

86 lines
2.8 KiB
Go

package gatt
import (
"miflorad/common"
"github.com/currantlabs/gatt"
"github.com/pkg/errors"
)
var MifloraCharVersionBatteryUUID = gatt.MustParseUUID("00001a02-0000-1000-8000-00805f9b34fb")
func FindServiceByUUID(services []*gatt.Service, u gatt.UUID) *gatt.Service {
for _, service := range services {
if service.UUID().Equal(u) {
return service
}
}
return nil
}
func FindCharacteristicByUUID(characteristics []*gatt.Characteristic, u gatt.UUID) *gatt.Characteristic {
for _, characteristic := range characteristics {
if characteristic.UUID().Equal(u) {
return characteristic
}
}
return nil
}
func MifloraRequestVersionBattery(p gatt.Peripheral) (common.VersionBatteryResponse, error) {
mifloraService := FindServiceByUUID(p.Services(), gatt.MustParseUUID(common.MifloraServiceUUID))
if mifloraService == nil {
return common.VersionBatteryResponse{}, errors.New("Failed to get the miflora service")
}
mifloraVersionBatteryChar := FindCharacteristicByUUID(mifloraService.Characteristics(), MifloraCharVersionBatteryUUID)
if mifloraVersionBatteryChar == nil {
return common.VersionBatteryResponse{}, errors.New("Failed to get the version battery characteristic")
}
bytes, err := p.ReadCharacteristic(mifloraVersionBatteryChar)
if err != nil {
return common.VersionBatteryResponse{}, errors.Wrap(err, "can't read version battery")
}
return common.ParseVersionBattery(bytes), nil
}
func MifloraRequestModeChange(p gatt.Peripheral) error {
mifloraService := FindServiceByUUID(p.Services(), gatt.MustParseUUID(common.MifloraServiceUUID))
if mifloraService == nil {
return errors.New("Failed to get the miflora service")
}
mifloraModeChangeChar := FindCharacteristicByUUID(mifloraService.Characteristics(), gatt.MustParseUUID(common.MifloraCharModeChangeUUID))
if mifloraModeChangeChar == nil {
return errors.New("Failed to discover the mode change characteristic")
}
err := p.WriteCharacteristic(mifloraModeChangeChar, common.MifloraGetModeChangeData(), false)
if err != nil {
return errors.Wrap(err, "can't change mode")
}
return nil
}
func MifloraRequstSensorData(p gatt.Peripheral) (common.SensorDataResponse, error) {
mifloraService := FindServiceByUUID(p.Services(), gatt.MustParseUUID(common.MifloraServiceUUID))
if mifloraService == nil {
return common.SensorDataResponse{}, errors.New("Failed to get the miflora service")
}
mifloraSensorDataChar := FindCharacteristicByUUID(mifloraService.Characteristics(), gatt.MustParseUUID(common.MifloraCharReadSensorDataUUID))
if mifloraSensorDataChar == nil {
return common.SensorDataResponse{}, errors.New("Failed to discover the sensor data characteristic")
}
bytes, err := p.ReadCharacteristic(mifloraSensorDataChar)
if err != nil {
return common.SensorDataResponse{}, errors.Wrap(err, "can't read sensor data")
}
return common.ParseSensorData(bytes), nil
}