blob: 6c01c39f10587678cefdada66ca2df9a851b4694 [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
8class ChassisControlObject(dbus.service.Object):
9 def __init__(self,bus,name):
10 self.power_state=0
11 dbus.service.Object.__init__(self,bus,name)
12 bus = dbus.SessionBus()
13 try:
14 # Get PowerControl object
15 power_control_service = bus.get_object('org.openbmc.PowerControl','/org/openbmc/PowerControl/0')
16 self.power_control_iface = dbus.Interface(power_control_service, 'org.openbmc.PowerControl')
17 # Get ChassisIdentify object
18 chassis_identify_service = bus.get_object('org.openbmc.ChassisIdentify','/org/openbmc/ChassisIdentify/0')
19 self.identify_led_iface = dbus.Interface(chassis_identify_service, 'org.openbmc.Led');
20 # Get HostControl object
21 host_control_service = bus.get_object('org.openbmc.HostControl','/org/openbmc/HostControl/0')
22 self.host_control_iface = dbus.Interface(host_control_service, 'org.openbmc.HostControl');
23
24
25 except dbus.exceptions.DBusException, e:
26 # TODO: not sure what to do if can't find other services
27 print "Unable to find dependent services: ",e
28
29
30 @dbus.service.method("org.openbmc.ChassisControl",
31 in_signature='', out_signature='s')
32 def getID(self):
33 return id
34
35
36 @dbus.service.method("org.openbmc.ChassisControl",
37 in_signature='', out_signature='')
38 def setIdentify(self):
39 print "Turn on identify"
40 self.identify_led_iface.setOn()
41 return None
42
43
44 @dbus.service.method("org.openbmc.ChassisControl",
45 in_signature='', out_signature='')
46 def clearIdentify(self):
47 print "Turn off identify"
48 r=self.identify_led_iface.setOff()
49 return None
50
51 @dbus.service.method("org.openbmc.ChassisControl",
52 in_signature='', out_signature='')
53 def setPowerOn(self):
54 print "Turn on power and boot"
55 self.power_state=0
56 if (self.getPowerState()==0):
57 self.power_control_iface.setPowerState(1)
58 self.power_state=1
59 return None
60
61 @dbus.service.method("org.openbmc.ChassisControl",
62 in_signature='', out_signature='')
63 def setPowerOff(self):
64 print "Turn off power"
65 self.power_control_iface.setPowerState(0);
66 return None
67
68 @dbus.service.method("org.openbmc.ChassisControl",
69 in_signature='', out_signature='i')
70 def getPowerState(self):
71 state = self.power_control_iface.getPowerState();
72 return state
73
74 @dbus.service.method("org.openbmc.ChassisControl",
75 in_signature='', out_signature='')
76 def setDebugMode(self):
77 return None
78
79 @dbus.service.method("org.openbmc.ChassisControl",
80 in_signature='i', out_signature='')
81 def setPowerPolicy(self,policy):
82 return None
83
84 ## Signal handler
85 def power_button_signal_handler(self):
86 # only power on if not currently powered on
87 state = self.getPowerState()
88 if state == 0:
89 self.setPowerOn()
90 elif state == 1:
91 self.setPowerOff();
92
93 # TODO: handle long press and reset
94
95 ## Signal handler
96 def power_good_signal_handler(self):
97 if (self.power_state==1):
98 self.host_control_iface.boot()
99 self.power_state=2
100
101
102
103if __name__ == '__main__':
104 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
105
106 bus = dbus.SessionBus()
107 name = dbus.service.BusName("org.openbmc.ChassisControl", bus)
108 object = ChassisControlObject(bus, '/org/openbmc/ChassisControl')
109 mainloop = gobject.MainLoop()
110 bus.add_signal_receiver(object.power_button_signal_handler, dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed")
111 bus.add_signal_receiver(object.power_good_signal_handler, dbus_interface = "org.openbmc.PowerControl", signal_name = "PowerGood")
112
113 print "Running ChassisControlService"
114 mainloop.run()
115