temperature_monitor.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Copyright 2011 Shadow Robot Company Ltd.
4 #
5 # This program is free software: you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the Free
7 # Software Foundation version 2 of the License.
8 #
9 # This program is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 # more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 import rospy
18 from diagnostic_msgs.msg import DiagnosticArray
19 
20 import curses
21 import traceback
22 
23 CASE_WIDTH = 20
24 CASE_HEIGHT = 1
25 JOINT_NAMES = ["FFJ0", "FFJ3", "FFJ4",
26  "MFJ0", "MFJ3", "MFJ4",
27  "RFJ0", "RFJ3", "RFJ4",
28  "LFJ0", "LFJ3", "LFJ4",
29  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5",
30  "WRJ1", "WRJ2"]
31 COOL = 50
32 WARM = 55
33 
34 
35 class Joint(object):
36  def __init__(self, screen, joint_name, x, y):
37  self.screen = screen
38  self.x = x
39  self.y = y
40  self.joint_name = joint_name
41  self.temperature = -1
42 
43  # self.window = self.screen.subwin(1, 15, self.y+1, self.x + 1)
44  self.refresh()
45 
46  def set_temperature(self, temperature):
47  self.temperature = temperature
48  self.refresh()
49 
50  def refresh(self):
51  self.screen.addstr(self.y+1, self.x+1, self.joint_name)
52 
53  if self.temperature == -1: # joint not found
54  self.screen.addstr(self.y + 1, self.x + 6, "X", curses.color_pair(4))
55  elif self.temperature < COOL:
56  self.screen.addstr(self.y + 1, self.x+6, str(self.temperature), curses.color_pair(1))
57  elif self.temperature < WARM:
58  self.screen.addstr(self.y + 1, self.x + 6, str(self.temperature), curses.color_pair(2))
59  else:
60  self.screen.addstr(self.y + 1, self.x + 6, str(self.temperature), curses.color_pair(3))
61  # self.window.refresh()#0,0,0,0,1,15)
62 
63 
64 class TemperatureMonitor(object):
65  MAX_X = 17
66  MAX_Y = 21
67 
68  def __init__(self, screen=None):
69  try:
70  curses.curs_set(0)
71  except:
72  pass
73  self.screen = screen
74  self.pad = curses.newpad(self.MAX_Y, self.MAX_X)
75  self.pad_pos_x_ = 0
76  self.pad_pos_y_ = 0
77  self.pad.border(0)
78  self.joint_monitors = {}
79 
80  curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLACK)
81  curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_GREEN)
82  curses.init_pair(2, curses.COLOR_BLACK, curses.COLOR_YELLOW)
83  curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_RED)
84 
85  for index, joint_name in enumerate(JOINT_NAMES):
86  begin_x = 0
87  begin_y = CASE_HEIGHT*index
88 
89  self.joint_monitors[joint_name] = Joint(self.pad, joint_name, begin_x, begin_y)
90 
91  self.diag_sub_ = rospy.Subscriber("/diagnostics", DiagnosticArray, self.diag_cb_)
92  self.resize_()
93 
94  while True:
95  event = self.pad.getch()
96  if event == ord("q"):
97  break
98  elif event == curses.KEY_RESIZE:
99  self.resize_()
100 
101  elif event == ord("s"):
102  self.pad_pos_y_ += 1
103  self.refresh_()
104  elif event == ord("w"):
105  self.pad_pos_y_ -= 1
106  self.refresh_()
107  elif event == ord("a"):
108  self.pad_pos_x_ -= 1
109  self.refresh_()
110  elif event == ord("d"):
111  self.pad_pos_x_ += 1
112  self.refresh_()
113 
114  def diag_cb_(self, msg):
115  for status in msg.status:
116  for joint in JOINT_NAMES:
117  if joint in status.name:
118  for value in status.values:
119  if value.key == "Temperature":
120  self.joint_monitors[joint].set_temperature(round(float(value.value), 1))
121  break
122  break
123  self.resize_()
124 
125  def resize_(self):
126  self.pad_pos_x_ = 0
127  self.pad_pos_y_ = 0
128  self.refresh_()
129 
130  def refresh_(self):
131  y, x = self.screen.getmaxyx()
132  self.pad_pos_x_ = min(max(self.pad_pos_x_, 0), self.MAX_X - 1)
133  self.pad_pos_y_ = min(max(self.pad_pos_y_, 0), self.MAX_Y - 1)
134  self.pad.refresh(self.pad_pos_y_, self.pad_pos_x_, 0, 0, y - 1, x - 1)
135  self.pad.border(0)
136  for monitor in self.joint_monitors.values():
137  monitor.refresh()
138 
139 
140 if __name__ == '__main__':
141  rospy.init_node("temperature_monitor", anonymous=True)
142  try:
143  curses.wrapper(TemperatureMonitor)
144  except:
145  traceback.print_exc()
def __init__(self, screen, joint_name, x, y)
def set_temperature(self, temperature)


sr_utilities
Author(s): Ugo Cupcic
autogenerated on Mon Feb 28 2022 23:52:19