Example #1
0
File: device.go Project: pdf/golifx
func (d *Device) SetPower(state bool) error {
	p := &payloadPower{}
	if state {
		p.Level = math.MaxUint16
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(SetPower)
	if err := pkt.SetPayload(p); err != nil {
		return err
	}

	common.Log.Debugf("Setting power state on %d: %v", d.id, state)
	req, err := d.Send(pkt, d.reliable, false)
	if err != nil {
		return err
	}
	if d.reliable {
		// Wait for ack
		<-req
		common.Log.Debugf("Setting power state on %d acknowledged", d.id)
	}

	d.Lock()
	d.power = p.Level
	d.Unlock()
	return d.publish(common.EventUpdatePower{Power: p.Level > 0})
}
Example #2
0
func (l *Light) SetColor(color common.Color, duration time.Duration) error {
	if l.color == color {
		return nil
	}

	if duration < shared.RateLimit {
		duration = shared.RateLimit
	}
	p := &payloadColor{
		Color:    color,
		Duration: uint32(duration / time.Millisecond),
	}

	pkt := packet.New(l.address, l.requestSocket)
	pkt.SetType(SetColor)
	if err := pkt.SetPayload(p); err != nil {
		return err
	}
	req, err := l.Send(pkt, l.reliable, false)
	if err != nil {
		return err
	}
	if l.reliable {
		// Wait for ack
		<-req
		common.Log.Debugf("Setting color on %v acknowledged\n", l.id)
	}

	l.color = color
	if err := l.publish(common.EventUpdateColor{Color: l.color}); err != nil {
		return err
	}

	return nil
}
Example #3
0
File: light.go Project: pdf/golifx
func (l *Light) SetPowerDuration(state bool, duration time.Duration) error {
	p := new(payloadPowerDuration)
	if state {
		p.Level = math.MaxUint16
	}
	p.Duration = uint32(duration / time.Millisecond)

	pkt := packet.New(l.address, l.requestSocket)
	pkt.SetType(LightSetPower)
	if err := pkt.SetPayload(p); err != nil {
		return err
	}

	common.Log.Debugf("Setting power state on %d: %v", l.id, state)
	req, err := l.Send(pkt, l.reliable, false)
	if err != nil {
		return err
	}
	if l.reliable {
		// Wait for ack
		<-req
		common.Log.Debugf("Setting power state on %d acknowledged", l.id)
	}

	l.Lock()
	l.power = p.Level
	l.Unlock()
	return l.publish(common.EventUpdatePower{Power: l.power > 0})
}
Example #4
0
File: device.go Project: pdf/golifx
func (d *Device) GetHardwareVersion() (uint32, error) {
	if d.CachedHardwareProduct() != 0 {
		return d.CachedHardwareVersion(), nil
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetVersion)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return 0, err
	}

	common.Log.Debugf("Waiting for hardware version (%d)", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return 0, err
	}

	v := stateVersion{}
	if err = pktResponse.Result.DecodePayload(&v); err != nil {
		return 0, err
	}
	common.Log.Debugf("Got hardware version (%d): %+v", d.id, v)

	d.Lock()
	d.hardwareVersion = v
	d.Unlock()

	return d.CachedHardwareVersion(), nil
}
Example #5
0
File: device.go Project: pdf/golifx
func (d *Device) SetLabel(label string) error {
	if d.CachedLabel() == label {
		return nil
	}

	p := &payloadLabel{}
	copy(p.Label[:], label)

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(SetLabel)
	if err := pkt.SetPayload(p); err != nil {
		return err
	}

	common.Log.Debugf("Setting label on %d: %s", d.id, label)
	req, err := d.Send(pkt, d.reliable, false)
	if err != nil {
		return err
	}
	if d.reliable {
		// Wait for ack
		<-req
		common.Log.Debugf("Setting label on %d acknowledged", d.id)
	}

	d.Lock()
	d.label = label
	d.Unlock()
	return d.publish(common.EventUpdateLabel{Label: label})
}
Example #6
0
File: device.go Project: pdf/golifx
func (d *Device) GetLabel() (string, error) {
	label := d.CachedLabel()
	if len(label) != 0 {
		return label, nil
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetLabel)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return ``, err
	}

	common.Log.Debugf("Waiting for label (%d)", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return ``, err
	}

	err = d.SetStateLabel(pktResponse.Result)
	if err != nil {
		return ``, err
	}

	return d.CachedLabel(), nil
}
Example #7
0
func (d *Device) GetHardwareVersion() (uint32, error) {
	if d.hardwareVersion.Product != 0 {
		return d.hardwareVersion.Version, nil
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetVersion)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return 0, err
	}

	common.Log.Debugf("Waiting for hardware version (%v)\n", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return 0, err
	}

	if err = pktResponse.Result.DecodePayload(&d.hardwareVersion); err != nil {
		return 0, err
	}
	common.Log.Debugf("Got hardware version (%v): %+v\n", d.id, d.hardwareVersion)

	return d.hardwareVersion.Version, nil
}
Example #8
0
func (d *Device) GetGroup() (ret string, err error) {
	if d.groupID != ret {
		return d.groupID, nil
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetGroup)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return ret, err
	}

	common.Log.Debugf("Waiting for group (%v)\n", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return ret, err
	}

	err = d.SetStateGroup(&pktResponse.Result)
	if err != nil {
		return ret, err
	}

	return d.groupID, nil
}
Example #9
0
func (d *Device) SetPower(state bool) error {
	if state && d.power > 0 {
		return nil
	}

	p := new(payloadPower)
	if state {
		p.Level = math.MaxUint16
	}

	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(SetPower)
	if err := pkt.SetPayload(p); err != nil {
		return err
	}

	common.Log.Debugf("Setting power state on %v: %v\n", d.id, state)
	req, err := d.Send(pkt, d.reliable, false)
	if err != nil {
		return err
	}
	if d.reliable {
		// Wait for ack
		<-req
		common.Log.Debugf("Setting power state on %v acknowledged\n", d.id)
	}

	d.power = p.Level
	if err := d.publish(common.EventUpdatePower{Power: d.power > 0}); err != nil {
		return err
	}
	return nil
}
Example #10
0
func (d *Device) Discover() error {
	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetService)
	_, err := d.Send(pkt, false, false)
	if err != nil {
		return err
	}

	return nil
}
Example #11
0
File: light.go Project: pdf/golifx
func (l *Light) Get() error {
	pkt := packet.New(l.address, l.requestSocket)
	pkt.SetType(Get)
	req, err := l.Send(pkt, l.reliable, true)
	if err != nil {
		return err
	}

	common.Log.Debugf("Waiting for light state (%d)", l.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return pktResponse.Error
	}

	return l.SetState(pktResponse.Result)
}
Example #12
0
File: device.go Project: pdf/golifx
func (d *Device) GetFirmwareVersion() (ret string, err error) {
	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetHostFirmware)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return ret, err
	}

	common.Log.Debugf("Waiting for firmware data (%d)", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return ret, err
	}

	err = d.SetStateHostFirmware(pktResponse.Result)
	if err != nil {
		return ret, err
	}

	return d.CachedFirmwareVersion(), nil
}
Example #13
0
File: device.go Project: pdf/golifx
func (d *Device) GetPower() (bool, error) {
	pkt := packet.New(d.address, d.requestSocket)
	pkt.SetType(GetPower)
	req, err := d.Send(pkt, d.reliable, true)
	if err != nil {
		return false, err
	}

	common.Log.Debugf("Waiting for power (%d)", d.id)
	pktResponse := <-req
	if pktResponse.Error != nil {
		return false, err
	}

	err = d.SetStatePower(pktResponse.Result)
	if err != nil {
		return false, err
	}

	return d.CachedPower(), nil
}