src.dualinventive.com/go/cp3000-interface/internal/device/device.go

94 lines
2.3 KiB
Go

package device
import (
"fmt"
"src.dualinventive.com/go/cp3000-interface/internal/storage"
"src.dualinventive.com/go/dinet"
"src.dualinventive.com/go/lib/cp3000"
)
// Device represents the needed interface for a device
type Device interface {
dinet.DeviceInfo
construct()
init()
RegisterCallbacks() error
}
type createDeviceFunc func(b *Base) Device
// Register registers a new CP3000 client at DI-Net
func Register(parent dinet.ParentDevice, repo storage.Repository, r cp3000.Router, imei string) (Device, error) {
dbdev, err := repo.GetDeviceByIMEI(imei)
if err != nil {
return nil, err
}
base, err := newBaseDevice(r, repo, dbdev.HWVersion, dbdev.ID)
if err != nil {
return nil, err
}
// Find the service...
service := parent
if cd, ok := parent.(*dinet.ChildDevice); ok {
service = cd.Parent()
}
if dev, err2 := service.Search(base.UID()); err2 == nil {
parent.Logger().WithField("imei", imei).Info("reconnect: close previous connection")
if errc := dev.Close(); errc != nil {
return nil, errc
}
}
var deviceNewFunc = map[int]createDeviceFunc{
0: newZkl3000, // ZKL 3000
19: newZkl3000, // ZKL 3000 UK
47: newZkl3000, // ZKL 3000 AUS
66: newZkl3000, // ZKL 3000 USA
2: newZkl3000Rc, // ZKL 3000 RC
27: newZkl3000Rc, // ZKL 3000 RC UK
33: newZkl3000Rc, // SWITCHBOX 3000
35: newZkl3000Rc, // RSS 3000
49: newZkl3000Rc, // ZKL 3000 RC AUS
61: newZkl3000Rc, // ZKL 3000 RC USA
71: newZkl3000Rc, // RCS 3000
25: newZkl3000Rcc, // ZKL 3000 RC-C
26: newZkl3000Rcc, // ZKL 3000 RC-C_UK
64: newZkl3000Rcc, // ZKL 3000 RC-C_USA
36: newCrtmGateway, // CRTM 3000 - Gateway
59: newGreenHub, // GreenHUB 3000
31: newCrtmSensor, // CRTM 3000 - Temperatuursensor
55: newCrtmSensor, // CRTM 3000 - Temperatuursensor+
60: newCrtmSensor, // CRS 3000
63: newCrtmSensor, // CRTM 3000
}
f, found := deviceNewFunc[dbdev.Type]
if !found {
return nil, fmt.Errorf("unknown device type: %v", dbdev.Type)
}
dev := f(base)
dinetDev := dinet.NewChildDevice(dev, parent)
base.dev = dinetDev
// Initialize the device with device specific settings
dev.construct()
if err = base.dev.Handshake(); err != nil {
return nil, err
}
// We run the init in the background since it communicates with the device
go dev.init()
r.AddDevice(dev.UID(), dev)
return dev, nil
}