lots of changes
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 15a8feb..4be1afc 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -12,10 +12,13 @@
POWER_OFF = 0
POWER_ON = 1
+BOOTED = 100
+
class ChassisControlObject(dbus.service.Object):
def __init__(self,bus,name):
self.dbus_objects = { }
+ dbus.service.Object.__init__(self,bus,name)
## load utilized objects
self.dbus_busses = {
'org.openbmc.control.Power' :
@@ -26,16 +29,10 @@
[ { 'name' : 'HostControl1', 'intf' : 'org.openbmc.control.Host' } ]
}
self.power_sequence = 0
- dbus.service.Object.__init__(self,bus,name)
- bus = dbus.SessionBus()
- try:
- for bus_name in self.dbus_busses.keys():
- self.request_name(bus_name,"",bus_name)
+ self.reboot = 0
+ self.last_power_state = 0
- except:
- ## its ok if this fails. hotplug will detect too
- print "Warning: One of processes not started yet."
- pass
+ bus = dbus.SessionBus()
## add signal handler to detect when new objects show up on dbus
bus.add_signal_receiver(self.request_name,
@@ -46,9 +43,23 @@
dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed",
path="/org/openbmc/buttons/ButtonPower/PowerButton1" )
bus.add_signal_receiver(self.power_good_signal_handler,
- dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood",
- path="/org/openbmc/control/Power/PowerControl1")
+ dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
+ bus.add_signal_receiver(self.power_lost_signal_handler,
+ dbus_interface = "org.openbmc.control.Power", signal_name = "PowerLost")
+ bus.add_signal_receiver(self.host_watchdog_signal_handler,
+ dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
+ bus.add_signal_receiver(self.host_status_signal_handler,
+ dbus_interface = "org.openbmc.SensorMatch", signal_name = "SensorMatch",
+ path="/org/openbmc/sensors/HostStatus/HostStatus1")
+ try:
+ for bus_name in self.dbus_busses.keys():
+ self.request_name(bus_name,"",bus_name)
+
+ except:
+ ## its ok if this fails. hotplug will detect too
+ print "Warning: One of processes not started yet."
+ pass
def request_name(self, bus_name, a, b):
@@ -60,6 +71,7 @@
obj_path = "/"+bus_name.replace('.','/')
for objs in self.dbus_busses[bus_name]:
inst_name = objs['name']
+ print "Chassis control: "+inst_name
obj = bus.get_object(bus_name,obj_path+"/"+inst_name)
self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
@@ -69,7 +81,6 @@
def getID(self):
return id
-
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def setIdentify(self):
@@ -77,7 +88,6 @@
self.dbus_objects['ChassisIdentify1'].setOn()
return None
-
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def clearIdentify(self):
@@ -90,6 +100,7 @@
def setPowerOn(self):
print "Turn on power and boot"
self.power_sequence = 0
+ self.reboot = 0
if (self.getPowerState()==0):
self.dbus_objects['PowerControl1'].setPowerState(POWER_ON)
self.power_sequence = 1
@@ -98,6 +109,7 @@
@dbus.service.method(DBUS_NAME,
in_signature='', out_signature='')
def setPowerOff(self):
+ self.power_sequence = 0
print "Turn off power"
self.dbus_objects['PowerControl1'].setPowerState(POWER_OFF);
return None
@@ -118,9 +130,10 @@
def setPowerPolicy(self,policy):
return None
+
## Signal handler
def power_button_signal_handler(self):
- # only power on if not currently powered on
+ # toggle power
state = self.getPowerState()
if state == POWER_OFF:
self.setPowerOn()
@@ -129,13 +142,27 @@
# TODO: handle long press and reset
- ## Signal handler
+ ## Signal handlers
def power_good_signal_handler(self):
if (self.power_sequence==1):
self.dbus_objects['HostControl1'].boot()
self.power_sequence = 2
+ def host_status_signal_handler(self,value):
+ if (value == BOOTED and self.power_sequence==2):
+ self.power_sequence=0
+ print "Host booted"
+ def power_lost_signal_handler(self):
+ ## Reboot if power is lost but reboot requested
+ if (self.reboot == 1):
+ self.setPowerOn()
+
+ def host_watchdog_signal_handler(self):
+ print "Watchdog Error, Rebooting"
+ self.reboot = 1
+ self.setPowerOff()
+
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)