blob: e2b79acb99644b9aa07312ae9af0790f4d170864 [file] [log] [blame]
Norman James323ed972015-12-09 09:06:37 -06001#!/usr/bin/python -u
2
3import sys
4#from gi.repository import GObject
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import os
10import Openbmc
11
12## Abstract class, must subclass
13class SensorValue(Openbmc.DbusProperties):
14 IFACE_NAME = 'org.openbmc.SensorValue'
15 def __init__(self,bus,name):
16 #Openbmc.DbusProperties.__init__(self)
17 self.Set(SensorValue.IFACE_NAME,'units',"")
18 self.Set(SensorValue.IFACE_NAME,'error',False)
19
20 @dbus.service.method(IFACE_NAME,
21 in_signature='v', out_signature='')
22 def setValue(self,value):
23 self.Set(SensorValue.IFACE_NAME,'value',value)
24
25 @dbus.service.method(IFACE_NAME,
26 in_signature='', out_signature='v')
27 def getValue(self):
28 return self.Get(SensorValue.IFACE_NAME,'value')
29
30class SensorThresholds(Openbmc.DbusProperties):
31 IFACE_NAME = 'org.openbmc.SensorThresholds'
32 def __init__(self,bus,name):
33 self.Set(SensorThresholds.IFACE_NAME,'thresholds_enabled',False)
34 self.Set(SensorThresholds.IFACE_NAME,'warning_upper',0)
35 self.Set(SensorThresholds.IFACE_NAME,'warning_lower',0)
36 self.Set(SensorThresholds.IFACE_NAME,'critical_upper',0)
37 self.Set(SensorThresholds.IFACE_NAME,'critical_lower',0)
38 self.Set(SensorThresholds.IFACE_NAME,'critical_lower',0)
39 self.Set(SensorThresholds.IFACE_NAME,'threshold_state',"NORMAL")
40 self.Set(SensorThresholds.IFACE_NAME,'worst_threshold_state',"NORMAL")
41
42 @dbus.service.method(IFACE_NAME,
43 in_signature='', out_signature='')
44 def resetThresholdState(self):
45 self.Set(SensorThresholds.IFACE_NAME,'worst_threshold_state',"NORMAL")
46
47 def check_thresholds(self,value):
48 iface = SensorThresholds.IFACE_NAME
49 if (self.Get(iface,'thresholds_enabled') == False):
50 return False
51 rtn = False
52 current_state = "NORMAL"
53 if (value >= self.properties[iface]['critical_upper']):
54 current_state = "CRITICAL"
55 rtn = True
56 elif (value <= self.properties[iface]['critical_lower']):
57 current_state = "CRITICAL"
58 rtn = True
59 elif (value >= self.properties[iface]['warning_upper']):
60 current_state = "WARNING"
61 rtn = True
62 elif (value <= self.properties[iface]['warning_lower']):
63 current_state = "WARNING"
64 rtn = True
65 self.Set(iface,'threshold_state',current_state)
66 worst = self.properties[iface]['worst_threshold_state']
67 if (current_state == "CRITICAL" or
68 (current_state == "WARNING" and worst != "CRITICAL")):
69 self.Set(iface,'worst_threshold_state',current_state)
70
71 return rtn
72
73class VirtualSensor(SensorValue):
74 def __init__(self,bus,name):
75 Openbmc.DbusProperties.__init__(self)
76 SensorValue.__init__(self,bus,name)
77 dbus.service.Object.__init__(self,bus,name)
78
79class HwmonSensor(SensorValue,SensorThresholds):
80 IFACE_NAME = 'org.openbmc.HwmonSensor'
81 def __init__(self,bus,name):
82 Openbmc.DbusProperties.__init__(self)
83 SensorValue.__init__(self,bus,name)
84 SensorThresholds.__init__(self,bus,name)
85 self.Set(HwmonSensor.IFACE_NAME,'scale',1)
86 self.Set(HwmonSensor.IFACE_NAME,'offset',0)
87 self.Set(HwmonSensor.IFACE_NAME,'filename','')
88 self.value_dirty = False
89
90 # need to cache value to know if changed
91 self.value = None
92 dbus.service.Object.__init__(self,bus,name)
93
94 @dbus.service.method(SensorValue.IFACE_NAME,
95 in_signature='v', out_signature='')
96 def setValue(self,value):
97 self.value_dirty = True
98 SensorValue.setValue(self,value)
99
100 ## Called by sensor process to update value from polling
101 ## if returns not None, then sensor process will update hwmon value
102 @dbus.service.method(IFACE_NAME,
103 in_signature='v', out_signature='(bv)')
104 def setByPoll(self,value):
105 scale = self.properties[HwmonSensor.IFACE_NAME]['scale']
106 offset = self.properties[HwmonSensor.IFACE_NAME]['offset']
107 if (self.value_dirty == True):
108 ## new value externally set, so just return to hwmon
109 ## process to write value
110 self.value_dirty = False
111 val = (self.properties[SensorValue.IFACE_NAME]['value']-offset) * scale
112 return [True,val]
113 else:
114 val = (value/scale) + offset
115 if (val != self.value):
116 SensorValue.setValue(self,val)
117 self.check_thresholds(val)
118 self.value = val
119
120 return [False,0]
121
122CONTROL_IFACE = 'org.openbmc.Control'
123class HostStatusSensor(VirtualSensor):
124 def __init__(self,bus,name):
125 VirtualSensor.__init__(self,bus,name)
126 self.setValue("Off")
127
128 ##override setValue method
129 @dbus.service.method(SensorValue.IFACE_NAME,
130 in_signature='v', out_signature='')
131 def setValue(self,value):
132 SensorValue.setValue(self,value)
133
134 @dbus.service.signal(CONTROL_IFACE,signature='s')
135 def GotoSystemState(self,state):
136 pass
137
138class BootProgressSensor(VirtualSensor):
139 def __init__(self,bus,name):
140 VirtualSensor.__init__(self,bus,name)
141 self.setValue("Off")
142 bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
143
144 def SystemStateHandler(self,state):
145 if (state == "HOST_POWERED_OFF"):
146 self.setValue("Off")
147
148
149 ##override setValue method
150 @dbus.service.method(SensorValue.IFACE_NAME,
151 in_signature='v', out_signature='')
152 def setValue(self,value):
153 SensorValue.setValue(self,value)
154 if (value == "FW Progress, Starting OS"):
155 self.GotoSystemState("HOST_BOOTED")
156
157 @dbus.service.signal(CONTROL_IFACE,signature='s')
158 def GotoSystemState(self,state):
159 pass
160
161class OccStatusSensor(VirtualSensor):
162 def __init__(self,bus,name):
163 VirtualSensor.__init__(self,bus,name)
164 self.setValue("Disabled")
165 bus.add_signal_receiver(self.SystemStateHandler,signal_name = "GotoSystemState")
166
167 def SystemStateHandler(self,state):
168 if (state == "HOST_POWERED_OFF"):
169 self.setValue("Disabled")
170
171
172 ##override setValue method
173 @dbus.service.method(SensorValue.IFACE_NAME,
174 in_signature='v', out_signature='')
175 def setValue(self,value):
176 if (value == "Enabled"):
177 print "Installing OCC device"
178 os.system("echo occ-i2c 0x50 > /sys/bus/i2c/devices/i2c-3/new_device")
179 os.system("echo occ-i2c 0x51 > /sys/bus/i2c/devices/i2c-3/new_device")
180 else:
181 print "Deleting OCC device"
182 os.system("echo 0x50 > /sys/bus/i2c/devices/i2c-3/delete_device")
183 os.system("echo 0x51 > /sys/bus/i2c/devices/i2c-3/delete_device")
184
185
186 SensorValue.setValue(self,value)
187
188 @dbus.service.signal(CONTROL_IFACE,signature='s')
189 def GotoSystemState(self,state):
190 pass
191
192class BootCountSensor(VirtualSensor):
193 def __init__(self,bus,name):
194 VirtualSensor.__init__(self,bus,name)
195 self.setValue(0)
196
197class OperatingSystemStatusSensor(VirtualSensor):
198 def __init__(self,bus,name):
199 VirtualSensor.__init__(self,bus,name)
200 self.setValue("Off")
201
202