package I2C import ( "time" "fmt" ) func NewMonitor(b int) *I2CMonitor{ m := new(I2CMonitor) m.Devices = make(map[int]I2Cdev) m.Bus = b m.Update() //ensure that devices get updated before it gets locked by connected return m } func (m *I2CMonitor) Update() { /* gets newly connected sensors and updates any currently dead sensors */ m.mu.Lock() defer m.mu.Unlock() // locking right away should be fine fmt.Printf("Getting devices on bus %v\n",m.Bus) connected := I2Cconnected(m.Bus) // m.mu.Lock() // defer m.mu.Unlock() now := time.Now() for k,v := range connected { if _, ok := m.Devices[k]; ok { // if address existed entry := m.Devices[k] entry.Active = v // update the value if v { entry.LastSeen = now // if its active, update last seen time } m.Devices[k] = entry } else if v { // else theres a chance its new fmt.Printf("adding device %v\n",k) m.Devices[k] = I2Cdev{Active:true, LastSeen:now} // add new sensors } } } func (m *I2CMonitor) Remove(addr int) { m.mu.Lock() defer m.mu.Unlock() delete(m.Devices, addr) } func (m *I2CMonitor) Connected() []int { // returns list of addresses of connected devices m.mu.Lock() defer m.mu.Unlock() connected := []int{} for a,_ := range m.Devices { connected = append(connected, a) } return connected