24 |
24 |
25 |
25 |
26 from __future__ import absolute_import |
26 from __future__ import absolute_import |
27 from datetime import timedelta |
27 from datetime import timedelta |
28 import binascii |
28 import binascii |
29 import numpy |
29 import numpy as np |
30 from graphics.DebugDataConsumer import DebugDataConsumer, TYPE_TRANSLATOR |
30 from graphics.DebugDataConsumer import DebugDataConsumer, TYPE_TRANSLATOR |
|
31 from controls.DebugVariablePanel.RingBuffer import RingBuffer |
31 |
32 |
32 # ------------------------------------------------------------------------------- |
33 # ------------------------------------------------------------------------------- |
33 # Constant for calculate CRC for string variables |
34 # Constant for calculate CRC for string variables |
34 # ------------------------------------------------------------------------------- |
35 # ------------------------------------------------------------------------------- |
35 |
36 |
140 @param start_tick: Start tick of given range (default None, first data) |
141 @param start_tick: Start tick of given range (default None, first data) |
141 @param end_tick: end tick of given range (default None, last data) |
142 @param end_tick: end tick of given range (default None, last data) |
142 @return: Data as numpy.array([(tick, value, forced),...]) |
143 @return: Data as numpy.array([(tick, value, forced),...]) |
143 """ |
144 """ |
144 # Return immediately if data empty or none |
145 # Return immediately if data empty or none |
145 if self.Data is None or len(self.Data) == 0: |
146 if self.Data is None or self.Data.count == 0: |
146 return self.Data |
147 return None |
147 |
148 |
148 # Find nearest data outside given range indexes |
149 # Find nearest data outside given range indexes |
149 start_idx = (self.GetNearestData(start_tick, -1) |
150 start_idx = (self.GetNearestData(start_tick, -1) |
150 if start_tick is not None |
151 if start_tick is not None |
151 else 0) |
152 else 0) |
152 end_idx = (self.GetNearestData(end_tick, 1) |
153 end_idx = (self.GetNearestData(end_tick, 1) |
153 if end_tick is not None |
154 if end_tick is not None |
154 else len(self.Data)) |
155 else len(self.Data)) |
155 |
156 |
156 # Return data between indexes |
157 # Return data between indexes |
157 return self.Data[start_idx:end_idx] |
158 return self.Data.view[start_idx:end_idx] |
158 |
159 |
159 def GetRawValue(self, index): |
160 def GetRawValue(self, index): |
160 """ |
161 """ |
161 Return raw value at given index for string variables |
162 Return raw value at given index for string variables |
162 @param index: Variable value index |
163 @param index: Variable value index |
193 # Check that data in given range is not empty |
194 # Check that data in given range is not empty |
194 values = data[:, 1] |
195 values = data[:, 1] |
195 if len(values) > 0: |
196 if len(values) > 0: |
196 # Return value range for data in given tick range |
197 # Return value range for data in given tick range |
197 return (data, |
198 return (data, |
198 data[numpy.argmin(values), 1], |
199 data[np.argmin(values), 1], |
199 data[numpy.argmax(values), 1]) |
200 data[np.argmax(values), 1]) |
200 |
201 |
201 # Return default values |
202 # Return default values |
202 return data, None, None |
203 return data, None, None |
203 |
204 |
204 def ResetData(self): |
205 def ResetData(self): |
205 """ |
206 """ |
206 Reset data stored when store data option enabled |
207 Reset data stored when store data option enabled |
207 """ |
208 """ |
208 if self.StoreData and self.IsNumVariable(): |
209 if self.StoreData and self.IsNumVariable(): |
209 # Init table storing data |
210 # Init table storing data |
210 self.Data = numpy.array([]).reshape(0, 3) |
211 self.Data = RingBuffer(3) |
211 |
212 |
212 # Init table storing raw data if variable is strin |
213 # Init table storing raw data if variable is strin |
213 self.RawData = ([] |
214 self.RawData = ([] |
214 if self.VariableType in ["STRING", "WSTRING"] |
215 if self.VariableType in ["STRING", "WSTRING"] |
215 else None) |
216 else None) |
292 |
293 |
293 data_values.append( |
294 data_values.append( |
294 [float(tick), num_value, extra_value]) |
295 [float(tick), num_value, extra_value]) |
295 |
296 |
296 # Add New data to stored data table |
297 # Add New data to stored data table |
297 self.Data = numpy.append(self.Data, data_values, axis=0) |
298 self.Data.append(data_values) |
298 |
299 |
299 # Signal to debug variable panel to refresh |
300 # Signal to debug variable panel to refresh |
300 self.Parent.HasNewData = True |
301 self.Parent.HasNewData = True |
301 |
302 |
302 def SetForced(self, forced): |
303 def SetForced(self, forced): |
335 """ |
336 """ |
336 # If tick given and stored data option enabled |
337 # If tick given and stored data option enabled |
337 if tick is not None and self.Data is not None: |
338 if tick is not None and self.Data is not None: |
338 |
339 |
339 # Return current value and forced flag if data empty |
340 # Return current value and forced flag if data empty |
340 if len(self.Data) == 0: |
341 if self.Data.count == 0: |
341 return self.Value, self.IsForced() |
342 return self.Value, self.IsForced() |
342 |
343 |
343 # Get index of nearest data from tick given |
344 # Get index of nearest data from tick given |
344 idx = self.GetNearestData(tick, 0) |
345 idx = self.GetNearestData(tick, 0) |
345 |
346 |
346 # Get value and forced flag at given index |
347 # Get value and forced flag at given index |
347 value, forced = \ |
348 value, forced = \ |
348 self.RawData[int(self.Data[idx, 2])] \ |
349 self.RawData[int(self.Data.view[idx, 2])] \ |
349 if self.VariableType in ["STRING", "WSTRING"] \ |
350 if self.VariableType in ["STRING", "WSTRING"] \ |
350 else self.Data[idx, 1:3] |
351 else self.Data.view[idx, 1:3] |
351 |
352 |
352 if self.VariableType in ["TIME", "TOD", "DT", "DATE"]: |
353 if self.VariableType in ["TIME", "TOD", "DT", "DATE"]: |
353 value = timedelta(seconds=value) |
354 value = timedelta(seconds=value) |
354 |
355 |
355 # Get raw value if asked |
356 # Get raw value if asked |
378 # Return immediately if data is empty |
379 # Return immediately if data is empty |
379 if self.Data is None: |
380 if self.Data is None: |
380 return None |
381 return None |
381 |
382 |
382 # Extract data ticks |
383 # Extract data ticks |
383 ticks = self.Data[:, 0] |
384 ticks = self.Data.view[:, 0] |
384 |
385 |
385 # Get nearest data from tick |
386 # Get nearest data from tick |
386 idx = numpy.argmin(abs(ticks - tick)) |
387 idx = np.searchsorted(ticks, tick) |
387 |
388 |
388 # Adjust data index according to constraint |
389 # Adjust data index according to constraint |
389 if adjust < 0 and ticks[idx] > tick and idx > 0 or \ |
390 if adjust < 0 and ticks[idx] > tick and idx > 0 or \ |
390 adjust > 0 and ticks[idx] < tick and idx < len(ticks): |
391 adjust > 0 and ticks[idx] < tick and idx < len(ticks): |
391 idx += adjust |
392 idx += adjust |