| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package main contains a program that displays the IPv4 address |
| // of the machine on an a Grove-LCD RGB backlight. |
| package main |
| |
| import ( |
| "fmt" |
| "net" |
| |
| "golang.org/x/exp/io/i2c" |
| ) |
| |
| const ( |
| DISPLAY_RGB_ADDR = 0x62 |
| DISPLAY_TEXT_ADDR = 0x3e |
| ) |
| |
| func main() { |
| d, err := i2c.Open(&i2c.Devfs{Dev: "/dev/i2c-1"}, DISPLAY_RGB_ADDR) |
| if err != nil { |
| panic(err) |
| } |
| |
| td, err := i2c.Open(&i2c.Devfs{Dev: "/dev/i2c-1"}, DISPLAY_TEXT_ADDR) |
| if err != nil { |
| panic(err) |
| } |
| |
| // Set the backlight color to 100,100,100. |
| write(d, []byte{0, 0}) |
| write(d, []byte{1, 0}) |
| write(d, []byte{0x08, 0xaa}) |
| write(d, []byte{4, 100}) // R value |
| write(d, []byte{3, 100}) // G value |
| write(d, []byte{2, 100}) // B value |
| |
| ip, err := resolveIP() |
| if err != nil { |
| panic(err) |
| } |
| |
| fmt.Printf("host machine IP is %v\n", ip) |
| |
| write(td, []byte{0x80, 0x02}) // return home |
| write(td, []byte{0x80, 0x01}) // clean the display |
| write(td, []byte{0x80, 0x08 | 0x04}) // no cursor |
| write(td, []byte{0x80, 0x28}) // two lines |
| |
| for _, s := range ip { |
| write(td, []byte{0x40, byte(s)}) |
| } |
| } |
| |
| func write(d *i2c.Device, buf []byte) { |
| err := d.Write(buf) |
| if err != nil { |
| panic(err) |
| } |
| } |
| |
| func resolveIP() (string, error) { |
| var ip net.IP |
| ifaces, err := net.Interfaces() |
| if err != nil { |
| panic(err) |
| } |
| for _, i := range ifaces { |
| addrs, err := i.Addrs() |
| if err != nil { |
| panic(err) |
| } |
| for _, addr := range addrs { |
| switch v := addr.(type) { |
| case *net.IPNet: |
| ip = v.IP |
| case *net.IPAddr: |
| ip = v.IP |
| } |
| ip = ip.To4() |
| if ip != nil && ip.String() != "127.0.0.1" { |
| return ip.String(), nil |
| } |
| } |
| } |
| return "", fmt.Errorf("cannot resolve the IP") |
| } |