Skip to content

Commit 731c270

Browse files
authored
Support CAN Bus (#315)
* Added CAN bus support. (#208) * Added OBD2 support. (#208)
1 parent 0fceb6d commit 731c270

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

leads_can/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from importlib.util import find_spec as _find_spec
2+
3+
if not _find_spec("can"):
4+
raise ImportError("Please install `python-can` to run this module\n>>>pip install python-can")
5+
6+
from leads_can.prototype import *
7+
from leads_can.obd import *

leads_can/obd.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import override as _override
2+
3+
from can import Message as _Message
4+
5+
from leads import DataContainer as _DataContainer
6+
from leads_can.prototype import CANBus
7+
8+
9+
class OBD2(CANBus):
10+
@_override
11+
def write(self, payload: _DataContainer) -> None:
12+
t = payload.time_stamp() * .001
13+
super().write(_Message(t, 0x00, data=str(payload.voltage).encode()))
14+
super().write(_Message(t, 0x01, data=str(payload.speed).encode()))
15+
super().write(_Message(t, 0x10, data=str(payload.front_wheel_speed).encode()))
16+
super().write(_Message(t, 0x11, data=str(payload.rear_wheel_speed).encode()))
17+
super().write(_Message(t, 0x20, data=str(payload.forward_acceleration).encode()))
18+
super().write(_Message(t, 0x21, data=str(payload.lateral_acceleration).encode()))
19+
super().write(_Message(t, 0x30, data=str(payload.mileage).encode()))
20+
super().write(_Message(t, 0x40, data=str(payload.gps_ground_speed).encode(),
21+
is_error_frame=not payload.gps_valid))
22+
super().write(_Message(t, 0x41, data=str(payload.latitude).encode(),
23+
is_error_frame=not payload.gps_valid))
24+
super().write(_Message(t, 0x42, data=str(payload.longitude).encode(),
25+
is_error_frame=not payload.gps_valid))
26+
super().write(_Message(t, 0x50, data=str(payload.throttle).encode()))
27+
super().write(_Message(t, 0x51, data=str(payload.brake).encode()))

leads_can/prototype.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from typing import override as _override
2+
3+
from can import Bus as _Bus, Notifier as _Notifier, Listener as _Listener, Message as _Message
4+
5+
from leads import Controller as _Controller
6+
7+
8+
class CANBus(_Controller, _Listener):
9+
def __init__(self) -> None:
10+
_Controller.__init__(self)
11+
_Listener.__init__(self)
12+
self._bus: _Bus | None = None
13+
self._notifier: _Notifier | None = None
14+
15+
@_override
16+
def on_message_received(self, msg: _Message) -> None:
17+
for device in self.devices():
18+
device.update(msg)
19+
20+
@_override
21+
def initialize(self, *parent_tags: str) -> None:
22+
super().initialize(*parent_tags)
23+
self._bus = _Bus()
24+
self._notifier = _Notifier(self._bus, (self,))
25+
26+
@_override
27+
def write(self, payload: _Message) -> None:
28+
self._bus.send(payload)
29+
30+
@_override
31+
def close(self) -> None:
32+
self._bus.close()

0 commit comments

Comments
 (0)