Mercurial > templog
annotate py/utils.py @ 571:ccfaa4351fd8
scale integrate by delay time
namedtuple for StepIntegrator
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Wed, 11 Nov 2015 21:58:38 +0800 |
parents | afe2eb17723e |
children | 02aff9ff8d24 |
rev | line source |
---|---|
439 | 1 import os |
2 import sys | |
564 | 3 import ctypes |
439 | 4 import time |
5 import select | |
6 import logging | |
551
9499bd2f344b
long polling config updates
Matt Johnston <matt@ucc.asn.au>
parents:
529
diff
changeset
|
7 import binascii |
556 | 8 import json |
564 | 9 import datetime |
571
ccfaa4351fd8
scale integrate by delay time
Matt Johnston <matt@ucc.asn.au>
parents:
570
diff
changeset
|
10 import collections |
439 | 11 |
448
fe729664a5e6
working better. logging works properly, cleanup fridge.off() happens.
Matt Johnston <matt@ucc.asn.au>
parents:
444
diff
changeset
|
12 D = logging.debug |
439 | 13 L = logging.info |
14 W = logging.warning | |
15 E = logging.error | |
16 | |
17 DEFAULT_TRIES = 3 | |
18 READLINE_SELECT_TIMEOUT = 1 | |
19 | |
443 | 20 def EX(msg, *args, **kwargs): |
21 kwargs['exc_info'] = True | |
22 logging.error(msg, *args, **kwargs) | |
23 | |
439 | 24 clock_gettime = None |
25 no_clock_gettime = True | |
26 def monotonic_time(): | |
27 global clock_gettime | |
28 global no_clock_gettime | |
29 if no_clock_gettime: | |
30 return time.time() | |
31 | |
32 class timespec(ctypes.Structure): | |
33 _fields_ = [ | |
34 ('tv_sec', ctypes.c_long), | |
35 ('tv_nsec', ctypes.c_long) | |
36 ] | |
37 if not clock_gettime: | |
38 try: | |
39 librt = ctypes.CDLL('librt.so.0', use_errno=True) | |
40 clock_gettime = librt.clock_gettime | |
41 clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)] | |
42 except: | |
43 W("No clock_gettime(), using fake fallback.") | |
44 no_clock_gettime = True | |
45 return time.time() | |
46 | |
47 t = timespec() | |
48 CLOCK_MONOTONIC = 1 # see <linux/time.h> | |
49 | |
50 if clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(t)) != 0: | |
51 errno_ = ctypes.get_errno() | |
52 raise OSError(errno_, os.strerror(errno_)) | |
53 return t.tv_sec + t.tv_nsec * 1e-9 | |
54 | |
55 # decorator, tries a number of times, returns None on failure, sleeps between | |
56 # Must be used as "@retry()" if arguments are defaulted | |
57 def retry(retries=DEFAULT_TRIES, try_time = 1): | |
58 def inner(func): | |
59 def new_f(*args, **kwargs): | |
60 for i in range(retries): | |
61 d = func(*args, **kwargs) | |
62 if d is not None: | |
63 return d | |
64 time.sleep(try_time) | |
65 return None | |
66 | |
529 | 67 new_f.__name__ = func.__name__ |
439 | 68 return new_f |
69 return inner | |
70 | |
71 def readline(sock): | |
72 timeout = READLINE_SELECT_TIMEOUT | |
73 buf = '' | |
74 while True: | |
75 (rlist, wlist, xlist) = select.select([sock], [], [], timeout) | |
76 if sock not in rlist: | |
77 # hit timeout | |
78 return None | |
79 | |
80 c = sock.recv(1) | |
81 if c == '': | |