173 return (-v_base[0], -v_base[1]) |
173 return (-v_base[0], -v_base[1]) |
174 elif dir_product == 0 and product(v_base, dir_target) != 0: |
174 elif dir_product == 0 and product(v_base, dir_target) != 0: |
175 return dir_target |
175 return dir_target |
176 return v_base |
176 return v_base |
177 |
177 |
|
178 SECOND = 1000000 |
|
179 MINUTE = 60 * SECOND |
|
180 HOUR = 60 * MINUTE |
|
181 DAY = 24 * HOUR |
|
182 |
|
183 def generate_time(value): |
|
184 microseconds = float(value.days * DAY + value.seconds * SECOND + value.microseconds) |
|
185 negative = microseconds < 0 |
|
186 microseconds = abs(microseconds) |
|
187 data = "T#" |
|
188 not_null = False |
|
189 if negative: |
|
190 data += "-" |
|
191 for val, format in [(int(microseconds) / DAY, "%dd"), |
|
192 ((int(microseconds) % DAY) / HOUR, "%dh"), |
|
193 ((int(microseconds) % HOUR) / MINUTE, "%dm"), |
|
194 ((int(microseconds) % MINUTE) / SECOND, "%ds")]: |
|
195 if val > 0 or not_null: |
|
196 data += format % val |
|
197 not_null = True |
|
198 data += "%gms" % (microseconds % SECOND / 1000.) |
|
199 return data |
|
200 |
|
201 TYPE_TRANSLATOR = {"TIME": generate_time} |
178 |
202 |
179 #------------------------------------------------------------------------------- |
203 #------------------------------------------------------------------------------- |
180 # Debug Data Consumer Class |
204 # Debug Data Consumer Class |
181 #------------------------------------------------------------------------------- |
205 #------------------------------------------------------------------------------- |
182 |
206 |
183 class DebugDataConsumer: |
207 class DebugDataConsumer: |
184 |
208 |
185 def __init__(self): |
209 def __init__(self): |
186 self.LastValue = None |
210 self.LastValue = None |
187 self.Value = None |
211 self.Value = None |
|
212 self.DataType = None |
188 self.LastForced = False |
213 self.LastForced = False |
189 self.Forced = False |
214 self.Forced = False |
190 self.Inhibited = False |
215 self.Inhibited = False |
191 |
216 |
192 def Inhibit(self, inhibit): |
217 def Inhibit(self, inhibit): |
193 self.Inhibited = inhibit |
218 self.Inhibited = inhibit |
194 if not inhibit and self.LastValue is not None: |
219 if not inhibit and self.LastValue is not None: |
195 self.SetForced(self.LastForced) |
220 self.SetForced(self.LastForced) |
196 self.SetValue(self.LastValue) |
221 self.SetValue(self.LastValue) |
197 self.LastValue = None |
222 self.LastValue = None |
198 |
223 |
|
224 def SetDataType(self, data_type): |
|
225 self.DataType = data_type |
|
226 |
199 def NewValue(self, tick, value, forced=False): |
227 def NewValue(self, tick, value, forced=False): |
|
228 value = TYPE_TRANSLATOR.get(self.DataType, lambda x:x)(value) |
200 if self.Inhibited: |
229 if self.Inhibited: |
201 self.LastValue = value |
230 self.LastValue = value |
202 self.LastForced = forced |
231 self.LastForced = forced |
203 else: |
232 else: |
204 self.SetForced(forced) |
233 self.SetForced(forced) |
205 self.SetValue(value) |
234 self.SetValue(value) |
206 |
235 |
207 def SetValue(self, value): |
236 def SetValue(self, value): |
208 self.Value = value |
237 self.Value = value |
209 |
238 |
210 def GetValue(self): |
239 def GetValue(self): |
211 return self.Value |
240 return self.Value |
264 if self.DataProducer is None: |
293 if self.DataProducer is None: |
265 return False |
294 return False |
266 result = self.DataProducer.SubscribeDebugIECVariable(iec_path, consumer) is not None |
295 result = self.DataProducer.SubscribeDebugIECVariable(iec_path, consumer) is not None |
267 if result is not None and consumer != self: |
296 if result is not None and consumer != self: |
268 self.DataConsumers[consumer] = iec_path |
297 self.DataConsumers[consumer] = iec_path |
|
298 consumer.SetDataType(self.GetDataType(iec_path)) |
269 return result |
299 return result |
270 |
300 |
271 def RemoveDataConsumer(self, consumer): |
301 def RemoveDataConsumer(self, consumer): |
272 iec_path = self.DataConsumers.pop(consumer, None) |
302 iec_path = self.DataConsumers.pop(consumer, None) |
273 if iec_path is not None: |
303 if iec_path is not None: |
1617 self.StartConnected = None |
1647 self.StartConnected = None |
1618 self.EndConnected = None |
1648 self.EndConnected = None |
1619 |
1649 |
1620 def CreateToolTip(self, pos): |
1650 def CreateToolTip(self, pos): |
1621 if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType): |
1651 if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType): |
1622 if isinstance(self.Value, StringType): |
1652 if isinstance(self.Value, StringType) and self.Value.find("#") == -1: |
1623 computed_value = "\"%s\""%self.Value |
1653 computed_value = "\"%s\""%self.Value |
1624 else: |
1654 else: |
1625 computed_value = str(self.Value) |
1655 computed_value = str(self.Value) |
1626 self.ToolTip = ToolTip(self.Parent, computed_value) |
1656 self.ToolTip = ToolTip(self.Parent, computed_value) |
1627 self.ToolTip.SetPosition(pos) |
1657 self.ToolTip.SetPosition(pos) |
1787 |
1817 |
1788 def SetValue(self, value): |
1818 def SetValue(self, value): |
1789 if self.Value != value: |
1819 if self.Value != value: |
1790 self.Value = value |
1820 self.Value = value |
1791 if value is not None and not isinstance(value, BooleanType): |
1821 if value is not None and not isinstance(value, BooleanType): |
1792 if isinstance(value, StringType): |
1822 if isinstance(value, StringType) and value.find('#') == -1: |
1793 self.ComputedValue = "\"%s\""%value |
1823 self.ComputedValue = "\"%s\""%value |
1794 else: |
1824 else: |
1795 self.ComputedValue = str(value) |
1825 self.ComputedValue = str(value) |
1796 if self.ToolTip is not None: |
1826 if self.ToolTip is not None: |
1797 self.ToolTip.SetTip(self.ComputedValue) |
1827 self.ToolTip.SetTip(self.ComputedValue) |
2685 if self.SelectedSegment == len(self.Segments) - 1: |
2715 if self.SelectedSegment == len(self.Segments) - 1: |
2686 dc.DrawPoint(self.Points[-1].x, self.Points[-1].y) |
2716 dc.DrawPoint(self.Points[-1].x, self.Points[-1].y) |
2687 if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined": |
2717 if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined": |
2688 dc.SetFont(self.Parent.GetMiniFont()) |
2718 dc.SetFont(self.Parent.GetMiniFont()) |
2689 dc.SetTextForeground(wx.NamedColour("purple")) |
2719 dc.SetTextForeground(wx.NamedColour("purple")) |
2690 width, height = self.ValueSize |
2720 if self.ValueSize is not None: |
2691 if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4: |
2721 width, height = self.ValueSize |
2692 x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) / 2 |
2722 if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4: |
2693 y = self.Points[0].y + height * (self.StartPoint[1][1] - 1) / 2 |
2723 x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) / 2 |
2694 dc.DrawText(self.ComputedValue, x, y) |
2724 y = self.Points[0].y + height * (self.StartPoint[1][1] - 1) / 2 |
2695 x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) / 2 |
2725 dc.DrawText(self.ComputedValue, x, y) |
2696 y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1) / 2 |
2726 x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) / 2 |
2697 dc.DrawText(self.ComputedValue, x, y) |
2727 y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1) / 2 |
2698 else: |
2728 dc.DrawText(self.ComputedValue, x, y) |
2699 middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1 |
2729 else: |
2700 x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2 |
2730 middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1 |
2701 y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2 |
2731 x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2 |
2702 dc.DrawText(self.ComputedValue, x, y) |
2732 y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2 |
|
2733 dc.DrawText(self.ComputedValue, x, y) |
2703 dc.SetFont(self.Parent.GetFont()) |
2734 dc.SetFont(self.Parent.GetFont()) |
2704 dc.SetTextForeground(wx.BLACK) |
2735 dc.SetTextForeground(wx.BLACK) |
2705 |
2736 |
2706 |
2737 |
2707 #------------------------------------------------------------------------------- |
2738 #------------------------------------------------------------------------------- |