-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcan_runner.py
80 lines (69 loc) · 2.59 KB
/
can_runner.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
import can
import datetime
import time
import threading
import sched
class CanRunner():
def __init__(self):
self.bus = can.Bus(channel='can0', interface='socketcan', bitrate=125000)
self.sender = threading.Thread(target=self.sender)
self.sender_exit = threading.Event()
self.receiver = threading.Thread(target=self.receiver)
self.receiver_exit = threading.Event()
self.messages = []
self.mess = []
self.modules = {}
def reg(self, func, id, schedule, tp_id=None, tp_callback=None, *args, **kwargs):
new_module = {
'id': id,
'timer': datetime.datetime.now(),
'schedule': schedule/1000,
'call': func,
'tp_id': tp_id,
'tp_callback': tp_callback
}
self.mess.append(new_module)
def register(self, schedule, call):
new_module = {
'timer': datetime.datetime.now(),
'schedule': schedule/1000,
'call': call
}
self.messages.append(new_module)
def receiver(self):
while True:
if self.receiver_exit.is_set():
return
recvd = self.bus.recv(1.0)
if not recvd:
continue
for message in self.mess:
if message['tp_id'] == recvd['arbitration_id']:
message['tp_callback'](recvd['data'])
def sender(self):
while True:
# If we need to exit
if self.sender_exit.is_set():
return
for message in self.mess:
now = datetime.datetime.now()
if (now - message['timer']).total_seconds() >= message['schedule']:
data = message['call']() #self.modules[message['module']])
if data != None:
self.bus.send(can.Message(arbitration_id=message['id'], data=data, is_extended_id=False))
message['timer'] = now
for message in self.messages:
now = datetime.datetime.now()
if (now - message['timer']).total_seconds() >= message['schedule']:
id, data = message['call']()
#print(f'sending {id}')
self.bus.send(can.Message(arbitration_id=id, data=data, is_extended_id=False))
message['timer'] = now
# Wait until next round
time.sleep(0.01)
def run(self):
self.sender.start()
self.receiver.start()
def stop(self):
self.sender_exit.set()
self.receiver_exit.set()