mirror of
https://github.com/aurora-opensource/xviz.git
synced 2026-01-18 14:07:46 +00:00
Make sure to reset the primitive `_stream_id` after each usage, and make sure each class is calling the super class. It looks like the static `_category` was being improperly reset instead, that is now changed to `_stream_id` and everything works correctly with a full state flush each time.
89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
from xviz_avs.builder.base_builder import XVIZBaseBuilder, CATEGORY
|
|
from xviz_avs.v2.core_pb2 import VariableState
|
|
|
|
|
|
class XVIZVariableBuilder(XVIZBaseBuilder):
|
|
def __init__(self, metadata, logger=None):
|
|
super().__init__(CATEGORY.VARIABLE, metadata, logger)
|
|
|
|
# Stores variable data by stream then id
|
|
# They will then be group when constructing final object
|
|
self._data = {}
|
|
|
|
# inflight builder data
|
|
self._id = None
|
|
self._values = None
|
|
|
|
def id(self, identifier):
|
|
self._validate_prop_set_once('_id')
|
|
self._id = identifier
|
|
return self
|
|
|
|
def values(self, values):
|
|
self._validate_prop_set_once('_values')
|
|
if not isinstance(values, (list, tuple)):
|
|
self._logger.error("Input `values` must be array")
|
|
|
|
self._values = values
|
|
return self
|
|
|
|
def get_data(self):
|
|
self._flush()
|
|
if not self._data:
|
|
return None
|
|
|
|
return self._data
|
|
|
|
def _add_variable_entry(self):
|
|
if not self._data_pending():
|
|
return
|
|
|
|
stream_entry = None
|
|
if self._stream_id not in self._data:
|
|
stream_entry = VariableState()
|
|
self._data[self._stream_id] = stream_entry
|
|
else:
|
|
stream_entry = self._data[self._stream_id]
|
|
|
|
if self._id:
|
|
for entry in stream_entry.variables:
|
|
if entry.base.object_id == self._id:
|
|
# TODO validate error, which should throw
|
|
self._logger.error("Input `values` already set for id %s" % self._id)
|
|
raise Exception('id values already set')
|
|
|
|
var_entry = stream_entry.variables.add()
|
|
value = self._values[0]
|
|
if isinstance(value, str):
|
|
var_entry.values.strings.extend(self._values)
|
|
elif isinstance(value, bool):
|
|
var_entry.values.bools.extend(self._values)
|
|
elif isinstance(value, int):
|
|
var_entry.values.int32s.extend(self._values)
|
|
elif isinstance(value, float):
|
|
var_entry.values.doubles.extend(self._values)
|
|
else:
|
|
self._logger.error("The type of input value is not recognized!")
|
|
|
|
if self._id:
|
|
var_entry.base.object_id = self._id
|
|
|
|
def _data_pending(self):
|
|
return self._values or self._id
|
|
|
|
def _validate(self):
|
|
if self._data_pending():
|
|
super()._validate()
|
|
if self._values is None:
|
|
self._logger.warning("Stream %s values are not provided" % self._stream_id)
|
|
|
|
def _flush(self):
|
|
self._validate()
|
|
self._add_variable_entry()
|
|
self.reset()
|
|
|
|
def reset(self):
|
|
super().reset()
|
|
self._id = None
|
|
self._values = None
|