package nanoleaf import "encoding/binary" type EffectInfo struct { EffectsList []string `json:"effectsList"` Select string `json:"select"` } type PanelLayout struct { GlobalOrientation GlobalOrientation `json:"globalOrientation"` Data PanelLayoutData `json:"layout"` } type GlobalOrientation struct { Value int `json:"value"` Max int `json:"max"` Min int `json:"min"` } type PanelLayoutData struct { NumPanels int `json:"numPanels"` SideLength int `json:"sideLength"` PositionData []PositionData `json:"positionData"` } type PositionData struct { PanelID uint16 `json:"panelId"` X int `json:"x"` Y int `json:"y"` O int `json:"o"` ShapeType int `json:"shapeType"` } type StateBool struct { Value bool `json:"value"` } type StateInt struct { Value int `json:"value"` Max int `json:"max"` Min int `json:"min"` } type State struct { Brightness StateInt `json:"brightness"` ColorMode string `json:"colorMode"` Ct StateInt `json:"ct"` Hue StateInt `json:"hue"` On StateBool `json:"on"` Sat StateInt `json:"sat"` } type Overview struct { Name string `json:"name"` SerialNumber string `json:"serialNo"` Manufacturer string `json:"manufacturer"` FirmwareVersion string `json:"firmwareVersion"` HardwareVersion string `json:"hardwareVersion"` Model string `json:"model"` Effects EffectInfo `json:"effects"` PanelLayout PanelLayout `json:"panelLayout"` State State `json:"state"` } type DeviceInfo struct { SerialNumber string `json:"serialNumber"` HardwareVersion string `json:"hardwareVersion"` FirmwareVersion string `json:"firmwareVersion"` BootloaderVersion string `json:"bootloaderVersion"` ModelNumber string `json:"modelNumber"` } type TokenResponse struct { Token string `json:"auth_token"` } type PanelUpdate []byte func (u *PanelUpdate) Add(message [8]byte) { if len(*u) < 2 { *u = make([]byte, 2, 10) } binary.BigEndian.PutUint16(*u, binary.BigEndian.Uint16(*u)+1) *u = append(*u, message[:]...) } func (u *PanelUpdate) Len() int { if len(*u) < 2 { return 0 } return int(binary.BigEndian.Uint16(*u)) } type PanelEventMessage []byte func (remote PanelEventMessage) Count() int { return int(binary.BigEndian.Uint16(remote[0:])) } func (remote PanelEventMessage) ValidateLength() bool { return len(remote) >= (2 + remote.Count()*5) } func (remote PanelEventMessage) PanelID(idx int) uint16 { return binary.BigEndian.Uint16(remote[2+(idx*5):]) } func (remote PanelEventMessage) TouchType(idx int) int { value := int(remote[2+(idx*5)]) return (value & 0b11100000) >> 5 } func (remote PanelEventMessage) TouchStrength(idx int) int { value := int(remote[2+(idx*5)]) return (value & 0b00011110) >> 1 } func (remote PanelEventMessage) SwipedFromPanelID(idx int) uint16 { return binary.BigEndian.Uint16(remote[2+(idx*5)+3:]) } var shapeTypeMap = map[int]string{ 0: "Triangle", 1: "Rhythm", 2: "Square", 3: "Control Square Master", 4: "Control Square Passive", 7: "Hexagon (Shapes)", 8: "Triangle (Shapes)", 9: "Mini Triangle (Shapes)", 12: "Shapes Controller", } var shapeIconMap = map[int]string{ 0: "triangle", 1: "rhythm", 2: "Square", 3: "square", 4: "square", 7: "hexagon", 8: "triangle", 9: "triangle-small", 12: "hexagon", } var shapeWidthMap = map[int]int{ 0: 150, 1: -1, 2: 100, 3: 100, 4: 100, 7: 67, 8: 134, 9: 67, 12: -1, } var httpMessage = []byte(`{ "write": { "command": "display", "animType": "extControl", "extControlVersion": "v2" }}`)