support InterfaceAdded signal
diff --git a/bin/Sensors.py b/bin/Sensors.py
new file mode 100755
index 0000000..e2b79ac
--- /dev/null
+++ b/bin/Sensors.py
@@ -0,0 +1,202 @@
+#!/usr/bin/python -u
+
+import sys
+#from gi.repository import GObject
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import os
+import Openbmc
+
+## Abstract class, must subclass
+class SensorValue(Openbmc.DbusProperties):
+ IFACE_NAME = 'org.openbmc.SensorValue'
+ def __init__(self,bus,name):
+ #Openbmc.DbusProperties.__init__(self)
+ self.Set(SensorValue.IFACE_NAME,'units',"")
+ self.Set(SensorValue.IFACE_NAME,'error',False)
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ self.Set(SensorValue.IFACE_NAME,'value',value)
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='', out_signature='v')
+ def getValue(self):
+ return self.Get(SensorValue.IFACE_NAME,'value')
+
+class SensorThresholds(Openbmc.DbusProperties):
+ IFACE_NAME = 'org.openbmc.SensorThresholds'
+ def __init__(self,bus,name):
+ self.Set(SensorThresholds.IFACE_NAME,'thresholds_enabled',False)
+ self.Set(SensorThresholds.IFACE_NAME,'warning_upper',0)
+ self.Set(SensorThresholds.IFACE_NAME,'warning_lower',0)
+ self.Set(SensorThresholds.IFACE_NAME,'critical_upper',0)
+ self.Set(SensorThresholds.IFACE_NAME,'critical_lower',0)
+ self.Set(SensorThresholds.IFACE_NAME,'critical_lower',0)
+ self.Set(SensorThresholds.IFACE_NAME,'threshold_state',"NORMAL")
+ self.Set(SensorThresholds.IFACE_NAME,'worst_threshold_state',"NORMAL")
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='', out_signature='')
+ def resetThresholdState(self):
+ self.Set(SensorThresholds.IFACE_NAME,'worst_threshold_state',"NORMAL")
+
+ def check_thresholds(self,value):
+ iface = SensorThresholds.IFACE_NAME
+ if (self.Get(iface,'thresholds_enabled') == False):
+ return False
+ rtn = False
+ current_state = "NORMAL"
+ if (value >= self.properties[iface]['critical_upper']):
+ current_state = "CRITICAL"
+ rtn = True
+ elif (value <= self.properties[iface]['critical_lower']):
+ current_state = "CRITICAL"
+ rtn = True
+ elif (value >= self.properties[iface]['warning_upper']):
+ current_state = "WARNING"
+ rtn = True
+ elif (value <= self.properties[iface]['warning_lower']):
+ current_state = "WARNING"
+ rtn = True
+ self.Set(iface,'threshold_state',current_state)
+ worst = self.properties[iface]['worst_threshold_state']
+ if (current_state == "CRITICAL" or
+ (current_state == "WARNING" and worst != "CRITICAL")):
+ self.Set(iface,'worst_threshold_state',current_state)
+
+ return rtn
+
+class VirtualSensor(SensorValue):
+ def __init__(self,bus,name):
+ Openbmc.DbusProperties.__init__(self)
+ SensorValue.__init__(self,bus,name)
+ dbus.service.Object.__init__(self,bus,name)
+
+class HwmonSensor(SensorValue,SensorThresholds):
+ IFACE_NAME = 'org.openbmc.HwmonSensor'
+ def __init__(self,bus,name):
+ Openbmc.DbusProperties.__init__(self)
+ SensorValue.__init__(self,bus,name)
+ SensorThresholds.__init__(self,bus,name)
+ self.Set(HwmonSensor.IFACE_NAME,'scale',1)
+ self.Set(HwmonSensor.IFACE_NAME,'offset',0)
+ self.Set(HwmonSensor.IFACE_NAME,'filename','')
+ self.value_dirty = False
+
+ # need to cache value to know if changed
+ self.value = None
+ dbus.service.Object.__init__(self,bus,name)
+
+ @dbus.service.method(SensorValue.IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ self.value_dirty = True
+ SensorValue.setValue(self,value)
+
+ ## Called by sensor process to update value from polling
+ ## if returns not None, then sensor process will update hwmon value
+ @dbus.service.method(IFACE_NAME,
+ in_signature='v', out_signature='(bv)')
+ def setByPoll(self,value):
+ scale = self.properties[HwmonSensor.IFACE_NAME]['scale']
+ offset = self.properties[HwmonSensor.IFACE_NAME]['offset']
+ if (self.value_dirty == True):
+ ## new value externally set, so just return to hwmon
+ ## process to write value
+ self.value_dirty = False
+ val = (self.properties[SensorValue.IFACE_NAME]['value']-offset) * scale
+ return [True,val]
+ else:
+ val = (value/scale) + offset
+ if (val != self.value):
+ SensorValue.setValue(self,val)
+ self.check_thresholds(val)
+ self.value = val
+
+ return [False,0]
+
+CONTROL_IFACE = 'org.openbmc.Control'
+class HostStatusSensor(VirtualSensor):
+ def __init__(self,bus,name):
+ VirtualSensor.__init__(self,bus,name)
+ self.setValue("Off")
+
+ ##override setValue method
+ @dbus.service.method(SensorValue.IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ SensorValue.setValue(self,value)
+
+ @dbus.service.signal(CONTROL_IFACE,signature='s')
+ def GotoSystemState(self,state):
+ pass
+
+class BootProgressSensor(VirtualSensor):
+ def __init__(self,bus,name):
+ VirtualSensor.__init__(self,bus,name)
+ self.setValue("Off")
+ bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
+
+ def SystemStateHandler(self,state):
+ if (state == "HOST_POWERED_OFF"):
+ self.setValue("Off")
+
+
+ ##override setValue method
+ @dbus.service.method(SensorValue.IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ SensorValue.setValue(self,value)
+ if (value == "FW Progress, Starting OS"):
+ self.GotoSystemState("HOST_BOOTED")
+
+ @dbus.service.signal(CONTROL_IFACE,signature='s')
+ def GotoSystemState(self,state):
+ pass
+
+class OccStatusSensor(VirtualSensor):
+ def __init__(self,bus,name):
+ VirtualSensor.__init__(self,bus,name)
+ self.setValue("Disabled")
+ bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
+
+ def SystemStateHandler(self,state):
+ if (state == "HOST_POWERED_OFF"):
+ self.setValue("Disabled")
+
+
+ ##override setValue method
+ @dbus.service.method(SensorValue.IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ if (value == "Enabled"):
+ print "Installing OCC device"
+ os.system("echo occ-i2c 0x50 > /sys/bus/i2c/devices/i2c-3/new_device")
+ os.system("echo occ-i2c 0x51 > /sys/bus/i2c/devices/i2c-3/new_device")
+ else:
+ print "Deleting OCC device"
+ os.system("echo 0x50 > /sys/bus/i2c/devices/i2c-3/delete_device")
+ os.system("echo 0x51 > /sys/bus/i2c/devices/i2c-3/delete_device")
+
+
+ SensorValue.setValue(self,value)
+
+ @dbus.service.signal(CONTROL_IFACE,signature='s')
+ def GotoSystemState(self,state):
+ pass
+
+class BootCountSensor(VirtualSensor):
+ def __init__(self,bus,name):
+ VirtualSensor.__init__(self,bus,name)
+ self.setValue(0)
+
+class OperatingSystemStatusSensor(VirtualSensor):
+ def __init__(self,bus,name):
+ VirtualSensor.__init__(self,bus,name)
+ self.setValue("Off")
+
+