94 lines
2.3 KiB
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
|
|
}
|