mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2026-02-11 07:03:07 +01:00
add pass format to sendN2K
This commit is contained in:
@@ -411,11 +411,22 @@ def dataToSep(data,maxbytes=None):
|
|||||||
else:
|
else:
|
||||||
pd+=","+data[i:i+2]
|
pd+=","+data[i:i+2]
|
||||||
return pd
|
return pd
|
||||||
|
class Format:
|
||||||
|
F_PLAIN=0
|
||||||
|
N_PLAIN='plain'
|
||||||
|
F_ACT=1
|
||||||
|
N_ACT='actisense'
|
||||||
|
F_PASS=2
|
||||||
|
N_PASS='pass'
|
||||||
|
def __init__(self,name,key,merge=True):
|
||||||
|
self.key=key
|
||||||
|
self.name=name
|
||||||
|
self.merge=merge
|
||||||
|
|
||||||
class CanFrame:
|
class CanFrame:
|
||||||
DUMP_PAT=re.compile(r'\(([^)]*)\) *([^ ]*) *([^#]*)#(.*)')
|
DUMP_PAT=re.compile(r'\(([^)]*)\) *([^ ]*) *([^#]*)#(.*)')
|
||||||
|
|
||||||
def __init__(self,ts,pgn,src=1,dst=255,prio=1,data=None):
|
def __init__(self,ts,pgn,src=1,dst=255,prio=1,dev=None,hdr=None,data=None):
|
||||||
self.pgn=pgn
|
self.pgn=pgn
|
||||||
self.mode=PGN_MODES.get(pgn)
|
self.mode=PGN_MODES.get(pgn)
|
||||||
self.ts=ts
|
self.ts=ts
|
||||||
@@ -426,6 +437,8 @@ class CanFrame:
|
|||||||
self.sequence=None
|
self.sequence=None
|
||||||
self.frame=None
|
self.frame=None
|
||||||
self.len=8
|
self.len=8
|
||||||
|
self.dev=dev
|
||||||
|
self.hdr=hdr
|
||||||
if self.mode == PGNM_Fast and data is not None and len(self.data) >= 2:
|
if self.mode == PGNM_Fast and data is not None and len(self.data) >= 2:
|
||||||
fb=int(data[0:2],16)
|
fb=int(data[0:2],16)
|
||||||
self.frame=fb & 0x1f
|
self.frame=fb & 0x1f
|
||||||
@@ -446,8 +459,18 @@ class CanFrame:
|
|||||||
frames=int((numbytes-6-1)/7)+1+1 if numbytes > 6 else 1
|
frames=int((numbytes-6-1)/7)+1+1 if numbytes > 6 else 1
|
||||||
return frames
|
return frames
|
||||||
|
|
||||||
|
def _formatTs(self):
|
||||||
|
dt=datetime.datetime.fromtimestamp(self.ts,tz=datetime.UTC)
|
||||||
|
return dt.strftime("%F-%T.")+dt.strftime("%f")[0:3]
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.ts},{self.prio},{self.pgn},{self.src},{self.dst},{self.len},{dataToSep(self.data)}"
|
return f"{self._formatTs()},{self.prio},{self.pgn},{self.src},{self.dst},{self.len},{dataToSep(self.data)}"
|
||||||
|
|
||||||
|
def printOut(self,format:Format):
|
||||||
|
if format.key == Format.F_PASS:
|
||||||
|
return f"({self.ts}) {self.dev} {self.hdr}#{self.data}"
|
||||||
|
else:
|
||||||
|
return str(self)
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -458,8 +481,6 @@ class CanFrame:
|
|||||||
logError("no dump pattern in line %s",line,keep=True)
|
logError("no dump pattern in line %s",line,keep=True)
|
||||||
return
|
return
|
||||||
ts=match[1]
|
ts=match[1]
|
||||||
dt=datetime.datetime.fromtimestamp(float(ts),tz=datetime.UTC)
|
|
||||||
tstr=dt.strftime("%F-%T.")+dt.strftime("%f")[0:3]
|
|
||||||
data=match[4]
|
data=match[4]
|
||||||
hdr=match[3]
|
hdr=match[3]
|
||||||
hdrval=int(hdr,16)
|
hdrval=int(hdr,16)
|
||||||
@@ -476,12 +497,13 @@ class CanFrame:
|
|||||||
else:
|
else:
|
||||||
dst=0xff
|
dst=0xff
|
||||||
pgn=(RDP << 16) + (PF << 8)+PS
|
pgn=(RDP << 16) + (PF << 8)+PS
|
||||||
return CanFrame(tstr,pgn,src=src,dst=dst,prio=prio,data=data)
|
return CanFrame(float(ts),pgn,src=src,dst=dst,prio=prio,data=data,dev=match[2],hdr=hdr)
|
||||||
|
|
||||||
class MultiFrame(CanFrame):
|
class MultiFrame(CanFrame):
|
||||||
def __init__(self,firstFrame: CanFrame):
|
def __init__(self,firstFrame: CanFrame):
|
||||||
super().__init__(firstFrame.ts,firstFrame.pgn,
|
super().__init__(firstFrame.ts,firstFrame.pgn,
|
||||||
src=firstFrame.src,dst=firstFrame.dst,prio=firstFrame.prio)
|
src=firstFrame.src,dst=firstFrame.dst,prio=firstFrame.prio,
|
||||||
|
dev=firstFrame.dev,hdr=firstFrame.hdr)
|
||||||
self.data=""
|
self.data=""
|
||||||
self.numFrames=firstFrame.getFPNum(bytes=False)
|
self.numFrames=firstFrame.getFPNum(bytes=False)
|
||||||
self.len=firstFrame.getFPNum(bytes=True)
|
self.len=firstFrame.getFPNum(bytes=True)
|
||||||
@@ -502,26 +524,19 @@ class MultiFrame(CanFrame):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.ts},{self.prio},{self.pgn},{self.src},{self.dst},{self.len},{dataToSep(self.data,self.len)}"
|
return f"{self._formatTs()},{self.prio},{self.pgn},{self.src},{self.dst},{self.len},{dataToSep(self.data,self.len)}"
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print(f"usage: {sys.argv[0]} [-q] [-p pgn,pgn,...] [-w waitsec] [ -f plain|actisense] file")
|
print(f"usage: {sys.argv[0]} [-q] [-p pgn,pgn,...] [-w waitsec] [ -f plain|actisense] file")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
class Format:
|
|
||||||
F_PLAIN=0
|
|
||||||
N_PLAIN='plain'
|
|
||||||
F_ACT=1
|
|
||||||
N_ACT='actisense'
|
|
||||||
def __init__(self,name,key,merge=True):
|
|
||||||
self.key=key
|
|
||||||
self.name=name
|
|
||||||
self.merge=merge
|
|
||||||
|
|
||||||
FORMATS=[
|
FORMATS=[
|
||||||
Format(Format.N_PLAIN,Format.F_PLAIN),
|
Format(Format.N_PLAIN,Format.F_PLAIN),
|
||||||
Format(Format.N_ACT,Format.F_ACT)
|
Format(Format.N_ACT,Format.F_ACT),
|
||||||
|
Format(Format.N_PASS,Format.F_PASS,False)
|
||||||
]
|
]
|
||||||
|
|
||||||
MAX_ACT=400
|
MAX_ACT=400
|
||||||
@@ -626,8 +641,8 @@ def writeOut(frame:CanFrame,format:Format,quiet:bool,counters:Counters):
|
|||||||
rt=False
|
rt=False
|
||||||
if format.key == Format.F_ACT:
|
if format.key == Format.F_ACT:
|
||||||
rt= send_act(frame,quiet)
|
rt= send_act(frame,quiet)
|
||||||
elif format.key == Format.F_PLAIN:
|
else:
|
||||||
print(frame)
|
print(frame.printOut(format))
|
||||||
rt=True
|
rt=True
|
||||||
counters.add(Counters.C_OK if rt else Counters.C_FAIL)
|
counters.add(Counters.C_OK if rt else Counters.C_FAIL)
|
||||||
return rt
|
return rt
|
||||||
|
|||||||
Reference in New Issue
Block a user