|
1 | 1 | import math |
2 | 2 | import struct |
| 3 | +import decimal |
3 | 4 |
|
4 | 5 |
|
5 | | -def do_decode_value(data_type, data): |
| 6 | +def do_decode_value(data_type, data, conf): |
6 | 7 | if data_type == 'uint64': |
7 | 8 | try: |
8 | 9 | pack_item = struct.pack('8B', *data) |
@@ -38,7 +39,14 @@ def do_decode_value(data_type, data): |
38 | 39 | pack_item = struct.pack('4B', *data) |
39 | 40 | except: # pylint: disable=bare-except |
40 | 41 | return False |
41 | | - return struct.unpack('<f', pack_item)[0] |
| 42 | + |
| 43 | + unpack_value = struct.unpack('<f', pack_item)[0] |
| 44 | + # use decimal, float type is a special case |
| 45 | + if conf and conf['value_accuracy']: |
| 46 | + precision = conf['value_accuracy'] |
| 47 | + decimal_wrapped = decimal.Decimal(unpack_value) |
| 48 | + unpack_value = float(round(decimal_wrapped, precision)) |
| 49 | + return unpack_value |
42 | 50 | elif data_type == 'uint16': |
43 | 51 | try: |
44 | 52 | pack_item = struct.pack('2B', *data) |
@@ -104,8 +112,8 @@ def do_decode_value(data_type, data): |
104 | 112 | return False |
105 | 113 |
|
106 | 114 |
|
107 | | -def decode_value(data_type, data): |
108 | | - ret_value = do_decode_value(data_type, data) |
| 115 | +def decode_value(data_type, data, conf=None): |
| 116 | + ret_value = do_decode_value(data_type, data, conf) |
109 | 117 |
|
110 | 118 | if not isinstance(ret_value, float): |
111 | 119 | return ret_value |
|
0 commit comments