-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcan_controller.py
39 lines (33 loc) · 1.29 KB
/
can_controller.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
import can
import time
import threading
class CanController:
def __init__(self) -> None:
self.bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=500000)
self.message_to_send: dict[int, bytearray] = {}
self.message_received: dict[int, bytearray] = {}
self._sender_flag = True
self._receiver_flag = True
self.sender_thread = threading.Thread(target=self.run_sender)
self.sender_thread.start()
self.receiver_thread = threading.Thread(target=self.run_receiver)
self.receiver_thread.start()
def close(self):
self._sender_flag = False
self._receiver_flag = False
self.sender_thread.join()
self.receiver_thread.join()
self.bus.shutdown()
def run_sender(self):
while self._sender_flag:
for msg_id, msg_data in self.message_to_send.items():
msg = can.Message(arbitration_id=msg_id, data=msg_data, is_extended_id=False)
self.bus.send(msg)
time.sleep(0.01)
def run_receiver(self):
while self._receiver_flag:
for i, msg in enumerate(self.bus):
self.message_received[msg.arbitration_id] = msg.data
if i > 20:
break
time.sleep(0.05)