blob: 7b73b617c7288a45dc55b01a6076d70aac3331f5 [file] [log] [blame]
Norman Jamese2765102015-08-19 22:00:55 -05001#!/usr/bin/env python
2
3import gobject
4import dbus
5import dbus.service
6import dbus.mainloop.glib
7
Norman James2a3d20b2015-08-20 07:09:33 -05008POWER_OFF = 0
9POWER_ON = 1
10
Norman Jamese2765102015-08-19 22:00:55 -050011class ChassisControlObject(dbus.service.Object):
12 def __init__(self,bus,name):
Norman James2a3d20b2015-08-20 07:09:33 -050013 self.power_sequence = 0
Norman Jamese2765102015-08-19 22:00:55 -050014 dbus.service.Object.__init__(self,bus,name)
15 bus = dbus.SessionBus()
16 try:
17 # Get PowerControl object
18 power_control_service = bus.get_object('org.openbmc.PowerControl','/org/openbmc/PowerControl/0')
19 self.power_control_iface = dbus.Interface(power_control_service, 'org.openbmc.PowerControl')
20 # Get ChassisIdentify object
21 chassis_identify_service = bus.get_object('org.openbmc.ChassisIdentify','/org/openbmc/ChassisIdentify/0')
22 self.identify_led_iface = dbus.Interface(chassis_identify_service, 'org.openbmc.Led');
23 # Get HostControl object
24 host_control_service = bus.get_object('org.openbmc.HostControl','/org/openbmc/HostControl/0')
25 self.host_control_iface = dbus.Interface(host_control_service, 'org.openbmc.HostControl');
26
Norman James2a3d20b2015-08-20 07:09:33 -050027 bus.add_signal_receiver(self.power_button_signal_handler,
28 dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed")
29 bus.add_signal_receiver(self.power_good_signal_handler,
30 dbus_interface = "org.openbmc.PowerControl", signal_name = "PowerGood")
Norman James81dbd352015-08-19 22:44:53 -050031
Norman Jamese2765102015-08-19 22:00:55 -050032
33 except dbus.exceptions.DBusException, e:
34 # TODO: not sure what to do if can't find other services
35 print "Unable to find dependent services: ",e
36
37
38 @dbus.service.method("org.openbmc.ChassisControl",
39 in_signature='', out_signature='s')
40 def getID(self):
41 return id
42
43
44 @dbus.service.method("org.openbmc.ChassisControl",
45 in_signature='', out_signature='')
46 def setIdentify(self):
47 print "Turn on identify"
48 self.identify_led_iface.setOn()
49 return None
50
51
52 @dbus.service.method("org.openbmc.ChassisControl",
53 in_signature='', out_signature='')
54 def clearIdentify(self):
55 print "Turn off identify"
56 r=self.identify_led_iface.setOff()
57 return None
58
59 @dbus.service.method("org.openbmc.ChassisControl",
60 in_signature='', out_signature='')
61 def setPowerOn(self):
62 print "Turn on power and boot"
Norman James2a3d20b2015-08-20 07:09:33 -050063 self.power_sequence = 0
Norman Jamese2765102015-08-19 22:00:55 -050064 if (self.getPowerState()==0):
Norman James2a3d20b2015-08-20 07:09:33 -050065 self.power_control_iface.setPowerState(POWER_ON)
66 self.power_sequence = 1
Norman Jamese2765102015-08-19 22:00:55 -050067 return None
68
69 @dbus.service.method("org.openbmc.ChassisControl",
70 in_signature='', out_signature='')
71 def setPowerOff(self):
72 print "Turn off power"
Norman James2a3d20b2015-08-20 07:09:33 -050073 self.power_control_iface.setPowerState(POWER_OFF);
Norman Jamese2765102015-08-19 22:00:55 -050074 return None
75
76 @dbus.service.method("org.openbmc.ChassisControl",
77 in_signature='', out_signature='i')
78 def getPowerState(self):
79 state = self.power_control_iface.getPowerState();
80 return state
81
82 @dbus.service.method("org.openbmc.ChassisControl",
83 in_signature='', out_signature='')
84 def setDebugMode(self):
85 return None
86
87 @dbus.service.method("org.openbmc.ChassisControl",
88 in_signature='i', out_signature='')
89 def setPowerPolicy(self,policy):
90 return None
91
92 ## Signal handler
93 def power_button_signal_handler(self):
94 # only power on if not currently powered on
95 state = self.getPowerState()
Norman James2a3d20b2015-08-20 07:09:33 -050096 if state == POWER_OFF:
Norman Jamese2765102015-08-19 22:00:55 -050097 self.setPowerOn()
Norman James2a3d20b2015-08-20 07:09:33 -050098 elif state == POWER_ON:
Norman Jamese2765102015-08-19 22:00:55 -050099 self.setPowerOff();
100
101 # TODO: handle long press and reset
102
103 ## Signal handler
104 def power_good_signal_handler(self):
Norman James2a3d20b2015-08-20 07:09:33 -0500105 if (self.power_sequence==1):
Norman Jamese2765102015-08-19 22:00:55 -0500106 self.host_control_iface.boot()
Norman James2a3d20b2015-08-20 07:09:33 -0500107 self.power_sequence = 2
Norman Jamese2765102015-08-19 22:00:55 -0500108
109
110
111if __name__ == '__main__':
112 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
113
114 bus = dbus.SessionBus()
115 name = dbus.service.BusName("org.openbmc.ChassisControl", bus)
116 object = ChassisControlObject(bus, '/org/openbmc/ChassisControl')
117 mainloop = gobject.MainLoop()
Norman James81dbd352015-08-19 22:44:53 -0500118
Norman Jamese2765102015-08-19 22:00:55 -0500119 print "Running ChassisControlService"
120 mainloop.run()
121