parameter.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import struct
4 import rospy
5 import vigir_footstep_planning_msgs.msg
6 
7 from vigir_generic_params.msg import ParameterMsg
9 
10 class Parameter():
11 
12  TYPE_INVALID = 0
13  TYPE_BOOLEAN = 1
14  TYPE_INT = 2
15  TYPE_DOUBLE = 3
16  TYPE_STRING = 4
17  TYPE_DATE_TIME = 5
18  TYPE_BASE64 = 6
19  TYPE_ARRAY = 7
20  TYPE_STRUCT = 8
21 
22  _type = int()
23  _name = str()
24  _value = None
25 
26  def __init__(self, _type = TYPE_INVALID, name = str(), value = None, msg = None):
27  if msg is not None:
28  self.from_msg(msg)
29  elif (_type != self.TYPE_INVALID):
30  self.set_type(_type)
31  self.set_name(name)
32  self.set_value(value)
33 
34  def __str__(self):
35  return self._name + " (" + str(self.get_type_as_text()) + "): " + str(self._value)
36 
37  def __repr__(self):
38  return self.__str__()
39 
40  def set_name(self, name):
41  self._name = name
42 
43  def get_name(self):
44  return self._name
45 
46  def set_type(self, t):
47  self._type = t
48 
49  def get_type(self):
50  return self._type
51 
52  def get_type_as_text(self):
53  if self.get_type() == self.TYPE_BOOLEAN:
54  return "bool"
55  elif self.get_type() == self.TYPE_INT:
56  return "int"
57  elif (self.get_type() == self.TYPE_DOUBLE):
58  return "double"
59  elif (self.get_type() == self.TYPE_STRING):
60  return "string"
61  elif (self.get_type() == self.TYPE_DATE_TIME):
62  return "date_time"
63  elif (self.get_type() == self.TYPE_BASE64):
64  return "base64"
65  elif (self.get_type() == self.TYPE_ARRAY):
66  return "array"
67  elif (self.get_type() == self.TYPE_STRUCT):
68  return "struct"
69  else:
70  return "unknown"
71 
72  def set_value(self, value):
73  try:
74  if self.get_type() == self.TYPE_BOOLEAN:
75  if (value.lower() == "true"):
76  self._value = True
77  if (value.lower() == "false"):
78  self._value = False
79  elif self.get_type() == self.TYPE_INT:
80  self._value = int(value)
81  elif (self.get_type() == self.TYPE_DOUBLE):
82  self._value = float(value)
83  elif (self.get_type() == self.TYPE_STRING):
84  self._value = str(value)
85  elif (self.get_type() == self.TYPE_ARRAY):
86  if (len(self._value) == 0):
87  return False
88  _type = self._value[0].get_type()
89  _name = self._value[0].get_name()
90  _value = []
91  for val in value.split():
92  val = val.strip('[],')
93  p = Parameter(_type, _name, val)
94  if p.get_value() is not None:
95  _value.append(p)
96  else:
97  return False
98  self._value = _value
99  else:
100  rospy.logerr("set_value called on parameter with incompatible type!")
101  return False
102  except ValueError:
103  return False
104  return True
105 
106  def get_value(self):
107  if (self.get_type() == self.TYPE_ARRAY):
108  val = []
109  for p in self._value:
110  val.append(p.get_value())
111  return val
112  else:
113  return self._value
114 
115  def to_msg(self):
116  msg = vigir_footstep_planning_msgs.msg.ParameterMsg()
117  msg.key.data = self.get_name()
118 
119  # dispatch type
120  msg.data += pack_uint8(self.get_type())
121 
122  if self.get_type() == self.TYPE_BOOLEAN:
123  msg.data += pack_bool(self._value)
124  elif self.get_type() == self.TYPE_INT:
125  msg.data += pack_int32(self._value)
126  elif (self.get_type() == self.TYPE_DOUBLE):
127  msg.data += pack_double(self._value)
128  elif (self.get_type() == self.TYPE_STRING):
129  msg.data += pack_string(self._value)
130  elif (self.get_type() == self.TYPE_ARRAY):
131  msg.data += pack_uint32(len(self._value))
132  for p in self._value:
133  msg.data += p.to_msg().data
134  elif (self.get_type() == self.TYPE_STRUCT):
135  msg.data += pack_uint32(len(self._value))
136  for p in self._value:
137  msg.data += pack_string(p.get_name()) + p.to_msg().data
138  else:
139  print "ERROR: Unsupported type (" + str(self.get_type()) + ")!"
140 
141  return msg
142 
143  def from_msg(self, msg, offset = 0):
144 
145  self._name = msg.key.data
146 
147  # dispatch type
148  self._type, offset = unpack_uint8(msg.data, offset)
149 
150  if self.get_type() == self.TYPE_BOOLEAN:
151  self._value, offset = unpack_bool(msg.data, offset)
152  elif self.get_type() == self.TYPE_INT:
153  self._value, offset = unpack_int32(msg.data, offset)
154  elif (self.get_type() == self.TYPE_DOUBLE):
155  self._value, offset = unpack_double(msg.data, offset)
156  elif (self.get_type() == self.TYPE_STRING):
157  self._value, offset = unpack_string(msg.data, offset)
158  elif (self.get_type() == self.TYPE_ARRAY):
159  size, offset = unpack_uint32(msg.data, offset)
160  self._value = []
161  for i in range(size):
162  p = Parameter()
163  offset = p.from_msg(msg, offset)
164  self._value.append(p)
165  elif (self.get_type() == self.TYPE_STRUCT):
166  size, offset = unpack_uint32(msg.data, offset)
167  self._value = []
168  for i in range(size):
169  # read name
170  name, offset = unpack_string(msg.data, offset)
171  # read param
172  p = Parameter()
173  offset = p.from_msg(msg, offset)
174  p.set_name(name)
175  self._value.append(p)
176  else:
177  print "ERROR: Unsupported type (" + str(self.get_type()) + ")!"
178 
179  return offset
180 
def unpack_double(bytestream, offset=0)
def unpack_string(bytestream, offset=0)
def unpack_int32(bytestream, offset=0)
def unpack_bool(bytestream, offset=0)
def __init__(self, _type=TYPE_INVALID, name=str(), value=None, msg=None)
Definition: parameter.py:26
def unpack_uint8(bytestream, offset=0)
def unpack_uint32(bytestream, offset=0)


vigir_footstep_planning_msgs
Author(s): Alexander Stumpf
autogenerated on Mon Jun 10 2019 15:45:25