def unescape_data(data): if cppunescape: return unescape(data) else: res = '' i = 0 l = len(data) while i < l: c = data[i] i += 1 if c == '\x1B': if not i < l: raise UnescapeError('Short escape sequence') d = data[i] i += 1 if d not in _UNESCAPE_MAP: raise UnescapeError('Invalid escape sequence') c = _UNESCAPE_MAP[d] res += c return res
def process(self, lines, linesSoFar): # group non-empty lines together, empty lines replaced with null # eg. 'a\nb\n\nc\nd\n' -> [['a','b'],None,['c','d']] parts = linesplitter(lines) if len(parts)==0: _log.warn("no parts in %d lines? %s", len(lines), lines[:5]) return self._count for P in parts: if P is None: # new header will be next self.header = None continue elif len(P)==0: continue if not self.header: # first message in the stream self.header = H = PayloadInfo() H.ParseFromString(unescape(P[0])) try: if H.year<0: H.year = 1 # -1 when no samples available self._year = calendar.timegm(datetime.date(H.year,1,1).timetuple()) except ValueError: _log.error("Error docoding header: %s %s %s", self.name, H.year, repr(P[0])) raise P = P[1:] else: # use header from previous H = self.header Nsamp = len(P) if not Nsamp: continue # header w/o samples... elif self._count_limit and self._count+Nsamp>=self._count_limit: assert self._count < self._count_limit cnt = self._count_limit-self._count P = P[:cnt] Nsamp = len(P) try: V, M = decoders[H.type](P, self.cadiscon, self._year) except DecodeError as e: _log.error("Failed to decode sample %s %s %s", self.name,H.type,repr(e.args[0])) raise M = np.rec.array(M, dtype=dbr_time) M['sec'] += self._year #TODO: recheck _count_limit here as len(M)>=Nsamp due to # disconnect events self._count += len(M) if len(M)==0: _log.warn("%s discarding 0 length array %s %s", self.name, V, M) else: #_log.debug("pushing %s samples: %s", V.shape, self.name) if self.inthread: reactor.callFromThread(self._CB, V, M, *self._CB_args, **self._CB_kws) else: D = self._CB(V, M, *self._CB_args, **self._CB_kws) assert not isinstance(D, defer.Deferred), "appl does not support callbacks w/ deferred" if self._count_limit and self._count>=self._count_limit: _log.debug("%s count limit reached (%d,%d)", self.name, self._count, self._count_limit) self.transport.stopProducing() break return self._count
def process(self, lines, linesSoFar): # group non-empty lines together, empty lines replaced with null # eg. 'a\nb\n\nc\nd\n' -> [['a','b'],None,['c','d']] parts = linesplitter(lines) if len(parts) == 0: _log.warn("no parts in %d lines? %s", len(lines), lines[:5]) return self._count for P in parts: if P is None: # new header will be next self.header = None continue elif len(P) == 0: continue if not self.header: # first message in the stream self.header = H = PayloadInfo() H.ParseFromString(unescape(P[0])) try: if H.year < 0: H.year = 1 # -1 when no samples available self._year = calendar.timegm( datetime.date(H.year, 1, 1).timetuple()) except ValueError: _log.error("Error docoding header: %s %s %s", self.name, H.year, repr(P[0])) raise P = P[1:] else: # use header from previous H = self.header Nsamp = len(P) if not Nsamp: continue # header w/o samples... elif self._count_limit and self._count + Nsamp >= self._count_limit: assert self._count < self._count_limit cnt = self._count_limit - self._count P = P[:cnt] Nsamp = len(P) try: V, M = decoders[H.type](P, self.cadiscon, self._year) except DecodeError as e: _log.error("Failed to decode sample %s %s %s", self.name, H.type, repr(e.args[0])) raise M = np.rec.array(M, dtype=dbr_time) M['sec'] += self._year #TODO: recheck _count_limit here as len(M)>=Nsamp due to # disconnect events self._count += len(M) if len(M) == 0: _log.warn("%s discarding 0 length array %s %s", self.name, V, M) else: #_log.debug("pushing %s samples: %s", V.shape, self.name) if self.inthread: reactor.callFromThread(self._CB, V, M, *self._CB_args, **self._CB_kws) else: D = self._CB(V, M, *self._CB_args, **self._CB_kws) assert not isinstance( D, defer.Deferred ), "appl does not support callbacks w/ deferred" if self._count_limit and self._count >= self._count_limit: _log.debug("%s count limit reached (%d,%d)", self.name, self._count, self._count_limit) self.transport.stopProducing() break return self._count