diff --git a/src/display.go b/src/display.go index d9be449..ce7d78f 100644 --- a/src/display.go +++ b/src/display.go @@ -6,6 +6,7 @@ import ( "net" "time" + "git.openpdu.org/OpenPDU/openpdu/i2c" "git.openpdu.org/OpenPDU/openpdu/syslog" "github.com/spf13/viper" "golang.org/x/image/font" @@ -35,7 +36,7 @@ func displayLoop() { continue } - if i2cbus == nil { + if i2c.I2Cbus == nil { syslog.Warning("ssd1306 i2cbus not found") time.Sleep(1 * time.Second) continue @@ -50,7 +51,7 @@ func displayLoop() { } // Open a handle to a ssd1306 connected on the I²C bus: - dev, err := ssd1306.NewI2C(i2cbus, &opts) + dev, err := ssd1306.NewI2C(i2c.I2Cbus, &opts) if err != nil { syslog.Err(err.Error()) } diff --git a/src/i2c.go b/src/i2c.go deleted file mode 100644 index ac08aa5..0000000 --- a/src/i2c.go +++ /dev/null @@ -1,125 +0,0 @@ -package main - -import ( - "errors" - "fmt" - - "git.openpdu.org/OpenPDU/openpdu/syslog" - "periph.io/x/periph/conn/i2c" - "periph.io/x/periph/conn/i2c/i2creg" - "periph.io/x/periph/host" -) - -// I2CBoard bla -type I2CBoard struct { - i2cdev i2c.Dev - channels uint - data []byte - inverted bool -} - -// MyBoard bla -var MyBoard = I2CBoard{ - channels: 8, - inverted: true, -} - -var i2cbus i2c.Bus - -func (b I2CBoard) channelStatus(ch uint) (bool, error) { - return false, nil - if b.channels <= 0 { - return false, errors.New("Board without channels") - } - if ch >= b.channels { - return false, errors.New("Invalid channel") - } - write := []byte{0x0A} - err := b.i2cdev.Tx(write, b.data) - if err != nil { - return false, err - } - byteToConsider := ch / b.channels - value := (b.data[byteToConsider] >> (ch % 8) & 1) == 1 - if b.inverted { - value = !value - } - return value, nil -} - -func (b I2CBoard) channelToggle(ch uint) error { - var mask byte - - if b.channels <= 0 { - return errors.New("Board without channels") - } - if ch >= b.channels { - return errors.New("Invalid channel") - } - - // if b.data == nil { - _, _ = b.channelStatus(ch) - // } - - byteToConsider := ch / b.channels - mask = 1 << (ch % 8) - v := b.data[byteToConsider] - v ^= mask - b.data[byteToConsider] = v - - write := append([]byte{0x09}, b.data...) - _, err := b.i2cdev.Write(write) - if err != nil { - return err - } - - return nil -} - -func init() { - var err error - - syslog.Info("i2c setup") - - // Make sure periph is initialized. - if _, err = host.Init(); err != nil { - syslog.Err(err.Error()) - } - - // Use i2creg I²C bus registry to find the first available I²C bus. - // i2cbus, err = i2creg.Open("/dev/i2c-1") - i2cbus, err = i2creg.Open("") - if err != nil { - syslog.Err(err.Error()) - } - - syslog.Info("i2c setup completed") -} - -func initI2C() { - - mydevice := &i2c.Dev{Addr: 0x27, Bus: i2cbus} - - // Send a command 0x10 and expect a 5 bytes reply. - // write := []byte{0x10} - write := []byte{0x0, 0x0} - // read := make([]byte, 5) - // if err := d.Tx(write, read); err != nil { - if _, err := mydevice.Write(write); err != nil { - syslog.Err(err.Error()) - } - - MyBoard.i2cdev = *mydevice - MyBoard.data = make([]byte, (MyBoard.channels-1)/8+1) - - go func() { - var i uint - for i = 0; i < 8; i++ { - v, err := MyBoard.channelStatus(i) - if err != nil { - syslog.Err(err.Error()) - } - syslog.Info(fmt.Sprintf("Channel %d status: %v", i, v)) - } - }() -} diff --git a/src/i2c/i2c.go b/src/i2c/i2c.go new file mode 100644 index 0000000..03aabe2 --- /dev/null +++ b/src/i2c/i2c.go @@ -0,0 +1,30 @@ +package i2c + +import ( + "git.openpdu.org/OpenPDU/openpdu/syslog" + I2C "periph.io/x/periph/conn/i2c" + I2CREG "periph.io/x/periph/conn/i2c/i2creg" + "periph.io/x/periph/host" +) + +var I2Cbus I2C.Bus + +func init() { + var err error + + syslog.Info("i2c setup") + + // Make sure periph is initialized. + if _, err = host.Init(); err != nil { + syslog.Err(err.Error()) + } + + // Use i2creg I²C bus registry to find the first available I²C bus. + // i2cbus, err = i2creg.Open("/dev/i2c-1") + I2Cbus, err = I2CREG.Open("") + if err != nil { + syslog.Err(err.Error()) + } + + syslog.Info("i2c setup completed") +}