-
Notifications
You must be signed in to change notification settings - Fork 0
/
bq78412.py~
86 lines (75 loc) · 2.93 KB
/
bq78412.py~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from serial import Serial, SerialException
from sys import stderr, exit
from gi.repository import Gtk
from exceptions import *
import logging
class Device:
def __init__(self, address, timeout, bitrate):
try:
self.device = Serial(address, bitrate)
self.device.timeout = timeout
except SerialException:
stderr.write("Error connecting to " + address + ".\n")
#self.errorMessage("Error connecting", "Problems connecting with " + address)
exit(1)
'''
def errorMessage(self, firstMessage, secondMessage):
dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, str(firstMessage))
dialog.format_secondary_text(str(secondMessage))
dialog.run()
print("ERROR dialog closed")
dialog.destroy()
'''
def get_data(self):
self.send_command(b"\xFF\x16\x00\x00\x1A\x00\x0C")
raw_data = self.read_input(27)
if raw_data != None:
data = self.parse_data(raw_data)
return data
else:
return None
def reset_rsoc(self):
self.send_command(b"\xFF\x13\x05\x00\x00\x64\x8D")
raw_data = self.read_input(3)
return True
def send_command(self, command):
logging.debug("Send command: "+str(command))
self.device.write(command)
def read_input(self, size):
raw_data = self.device.read(size)
logging.debug("Receive data: "+str(raw_data))
if len(raw_data) != 0:
if not self.ack(raw_data):
raise ACKError(raw_data[1])
#self.errorMessage("Data error", "Received CRC is not correct")
#return None
elif not self.crc(raw_data):
raise CRCError(raw_data[-1])
#self.errorMessage("Data error", "Received data has not ACK")
#return None
elif size != len(raw_data):
raise sizeError(len(raw_data))
#self.errorMessage("Data error", "Received data has not correct size")
#return None
else:
return raw_data
else:
raise timeoutError("Timeout finished")
#self.errorMessage("Timeout", "The device doesn't respond.")
return None
def parse_data(self, raw_data):
logging.debug("Raw data to parse: " + str(raw_data))
data = {}
data['voltage'] = (raw_data[6] << 8) + raw_data[5]
data['current'] = ((raw_data[8] << 8) + raw_data[7])/100
data['avg_current'] = ((raw_data[18] << 8) + raw_data[17])/100
data['temperature'] = (raw_data[4] << 8) + raw_data[3]
data['rsoc'] = (raw_data[24] << 8) + raw_data[23]
return data
def crc(self, data):
result = 0
for c in data[:-1]:
result = result ^ c
return result == data[-1]
def ack(self, data):
return data[1] == 33