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 }