From f16dfc64b6c6412f089f8232a21494609a307500 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Wed, 13 Nov 2013 18:21:41 +0100 Subject: [PATCH 01/17] add support for timestamp in Message The Message Object has now an parameter named timestamp which is set when the message is received. The reveiv Method returns the ID of the received message --- CANLibrary/CanMessage.py | 1 + CANLibrary/PCan.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CANLibrary/CanMessage.py b/CANLibrary/CanMessage.py index 9c6fd0b..1248e18 100644 --- a/CANLibrary/CanMessage.py +++ b/CANLibrary/CanMessage.py @@ -48,6 +48,7 @@ class CanMessage(object): self.Id = MessageId self.CycleTime = MessageCycleTime self.Label = Label + self.timestamp = 0 # create an initial array of message data for i in range(0, self.Length): diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index 1fa0148..a0f2fcf 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -127,5 +127,7 @@ class PcanAdapter (object): for i in range(0, self.Messages[msgKey].Length): self.Messages[msgKey].Data[i] = msg.DATA[i] self.Messages[msgKey].decomposeData() + self.Messages[msgKey].timestamp = timestamp.micros + 1000 * timestamp.millis + 0xFFFFFFFF * 1000 * timestamp.millis_overflow + return msg.ID elif result == PCANBasic.PCAN_ERROR_QRCVEMPTY: - break + return None From c5cd6914c929bdffef66857e072192030b732d21 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Wed, 13 Nov 2013 18:31:39 +0100 Subject: [PATCH 02/17] Datatype change The GetData() Method of CanSignal returns the data as float --- CANLibrary/CanSignal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CANLibrary/CanSignal.py b/CANLibrary/CanSignal.py index fe932d1..4bdfe10 100644 --- a/CANLibrary/CanSignal.py +++ b/CANLibrary/CanSignal.py @@ -55,6 +55,6 @@ class CanSignal(object): for i in range(0, int(self.Length/8)+1): tmpData += ( self.Data[i] << (8*i) ) - tmpData = int( (tmpData * self.Scaling) + self.Offset ) + tmpData = ( (tmpData * self.Scaling) + self.Offset ) return tmpData \ No newline at end of file From 43af99401f3641178e27d7b343a6396317708427 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Wed, 13 Nov 2013 18:39:40 +0100 Subject: [PATCH 03/17] add some bus frequencies --- CANLibrary/PCan.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index a0f2fcf..025282c 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -16,9 +16,12 @@ class PcanAdapter (object): ''' # Class variables: - Baudrate = { '125k' : PCANBasic.PCAN_BAUD_125K, + Baudrate = { '100k' : PCANBasic.PCAN_BAUD_100K, + '125k' : PCANBasic.PCAN_BAUD_125K, + '250k' : PCANBasic.PCAN_BAUD_250K, '500k' : PCANBasic.PCAN_BAUD_500K, - '1000k' : PCANBasic.PCAN_BAUD_1M } + '1000k': PCANBasic.PCAN_BAUD_1M + } def __init__(self, Baudrate): From ec5cd45b4db44ee91bd0dc2baaa7302398b6b560 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Fri, 15 Nov 2013 16:01:45 +0100 Subject: [PATCH 04/17] Add support for RTR Frame * You can send an RTR-Frame by adding rtr=True the calling of sendMessage --- CANLibrary/PCan.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index 025282c..5007f3c 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -91,7 +91,7 @@ class PcanAdapter (object): print("PCAN deinitialised") - def sendMessage(self, Message): + def sendMessage(self, Message, rtr = False): ''' Sends the CanMessage object Message onto the CAN bus. @@ -101,7 +101,10 @@ class PcanAdapter (object): msg = PCANBasic.TPCANMsg() # create a new PCAN message object msg.ID = Message.Id # copy the ID - msg.MSGTYPE = PCANBasic.PCAN_MESSAGE_STANDARD # Message type is standard (not extended) + if rtr: + msg.MSGTYPE = PCANBasic.PCAN_MESSAGE_RTR # Message type is Remote-Transfer-Request + else: + msg.MSGTYPE = PCANBasic.PCAN_MESSAGE_STANDARD # Message type is standard (not extended) msg.LEN = Message.Length # copy the length msg.DATA[0:Message.Length] = Message.Data # copy the message data into the PCAN message object From d960680e2e3df72354f452dd758d729bf995398f Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Tue, 19 Nov 2013 15:05:58 +0100 Subject: [PATCH 05/17] add option block on receiveMessage added the option block to the receiveMessage Method *default False for no compatibility issues --- CANLibrary/PCan.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index 5007f3c..93bb842 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -8,9 +8,10 @@ Created on 06.07.2012 import PCANBasic # PCANBasic wrapper library provided by PEAK import sys +from time import sleep -class PcanAdapter (object): +class PcanAdapter(object): ''' A class for controlling a PEAK PCan adapter. Based on the PCANBasic library. ''' @@ -111,7 +112,7 @@ class PcanAdapter (object): self.Pcan.Write(self.Channel, msg) # write it onto the Bus #print ('Message ' + Message.Label + ' written.') - def receiveMessage(self): + def receiveMessage(self, block = False): ''' Tries to receive a CAN message and puts its data into the according CanMessage object's Data field. This method should be called frequently. @@ -135,5 +136,6 @@ class PcanAdapter (object): self.Messages[msgKey].decomposeData() self.Messages[msgKey].timestamp = timestamp.micros + 1000 * timestamp.millis + 0xFFFFFFFF * 1000 * timestamp.millis_overflow return msg.ID - elif result == PCANBasic.PCAN_ERROR_QRCVEMPTY: + elif result == PCANBasic.PCAN_ERROR_QRCVEMPTY and block == False: return None + sleep(0.01) \ No newline at end of file From effafdbb562a0e6306709f951db7aaadee32ca60 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Fri, 13 Dec 2013 12:23:53 +0100 Subject: [PATCH 06/17] remove compiled files --- .gitignore | 46 +++++++++++++++ .settings/org.eclipse.core.resources.prefs | 1 + CANLibrary/PCan.py | 64 +++++++++++---------- CANLibrary/example.py | 1 + PCANBasic/PCANBasic.pyc | Bin 14926 -> 0 bytes pycrc/crc_algorithms.pyc | Bin 5916 -> 0 bytes pycrc/crc_lexer.pyc | Bin 6993 -> 0 bytes pycrc/crc_models.pyc | Bin 5067 -> 0 bytes pycrc/crc_opt.pyc | Bin 11777 -> 0 bytes pycrc/crc_parser.pyc | Bin 8786 -> 0 bytes pycrc/crc_symtable.pyc | Bin 37868 -> 0 bytes pycrc/pycrc.pyc | Bin 6939 -> 0 bytes 12 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 .gitignore delete mode 100644 PCANBasic/PCANBasic.pyc delete mode 100644 pycrc/crc_algorithms.pyc delete mode 100644 pycrc/crc_lexer.pyc delete mode 100644 pycrc/crc_models.pyc delete mode 100644 pycrc/crc_opt.pyc delete mode 100644 pycrc/crc_parser.pyc delete mode 100644 pycrc/crc_symtable.pyc delete mode 100644 pycrc/pycrc.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9435d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Ignore-Datei selbst ausschließen +#.gitignore +.gitmodules +Thumbs.db + +# Bestimmte Dateien ausschließen +cache.dat + +# Es können Wildcards (*,?) verwendet werden: +*.exe +*.dll +*.dsbackup +*.avrsln +*.avrsuo +*.avrgccproj +*.aps +*.atsln +*.atsuo +*.cproj +*.aws +*.xml +*.xslt +*.aux +*.dvi +*.lof +*.log +*.lot +*.out +*.synctex.gz +*.toc +*.pyc +*.patch +*.csv +.project +.pydevproject +tmp?.dat + +# Auch Verzeichnisse kann man ausschießen: +*default/ +*Debug/ +*bin/ +*ADC/ +*CAN/ +*UART/ +.*/ +CANLibrary/ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 77d664b..24ecbd3 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -2,5 +2,6 @@ eclipse.preferences.version=1 encoding//CANLibrary/CanMessage.py=UTF-8 encoding//CANLibrary/CanSignal.py=UTF-8 encoding//CANLibrary/PCan.py=UTF-8 +encoding//CANLibrary/Sym2Lib.py=UTF-8 encoding//CANLibrary/example.py=UTF-8 encoding//pycrc/crc_algorithms.py=latin1 diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index 93bb842..ca81341 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -15,7 +15,7 @@ class PcanAdapter(object): ''' A class for controlling a PEAK PCan adapter. Based on the PCANBasic library. ''' - + # Class variables: Baudrate = { '100k' : PCANBasic.PCAN_BAUD_100K, '125k' : PCANBasic.PCAN_BAUD_125K, @@ -23,20 +23,21 @@ class PcanAdapter(object): '500k' : PCANBasic.PCAN_BAUD_500K, '1000k': PCANBasic.PCAN_BAUD_1M } - - - def __init__(self, Baudrate): + + + def __init__(self, Baudrate, debug = True): ''' Constructor. @param Baudrate: Baud rate from the PcanAdapter. Baud rate dictionary ''' - # Instance variables: - self.Messages = {} + # Instance variables: + self.debug = debug + self.Messages = {} self.Channel = PCANBasic.PCAN_USBBUS1 self.Pcan = PCANBasic.PCANBasic() self.Baudrate = Baudrate # Baud rate from PCANBasic self.isInitialised = False - + def __del__(self): ''' Destructor. @@ -44,26 +45,26 @@ class PcanAdapter(object): ''' print '\nDestructor:' self.uninitialize() - + def addMessage(self, CanMessage): ''' Add a Message of type CanMessage to the list of messages. - + @param CanMessage: The message to add to the list of messages. ''' - + self.Messages.update({CanMessage.Label: CanMessage}) - + def removeMessage(self, CanMessageLabel): try: self.Messages.pop(CanMessageLabel) except: pass - - + + def clearMessages(self): self.Messages = {} - + def initialize(self): ''' Initializes the PCAN adapter. @@ -71,15 +72,17 @@ class PcanAdapter(object): self.Pcan.Uninitialize(PCANBasic.PCAN_NONEBUS) status = self.Pcan.Initialize(self.Channel, self.Baudrate) if status != PCANBasic.PCAN_ERROR_OK: - print 'Error: ', self.Pcan.GetErrorText(status, 0)[1] + if self.debug: + print 'Error: ', self.Pcan.GetErrorText(status, 0)[1] sys.exit("PCAN initialisation error") - - print("PCAN initialised") + if self.debug: + print("PCAN initialised") self.isInitialised = True - + channel, hwId = self.Pcan.GetValue( self.Channel, PCANBasic.PCAN_DEVICE_NUMBER ) - print 'DeviceNumber: ', hwId - + if self.debug: + print 'DeviceNumber: ', hwId + def uninitialize(self): ''' Unitialize the PCAN adapter. @@ -87,19 +90,20 @@ class PcanAdapter(object): if self.isInitialised: status = self.Pcan.Uninitialize(self.Channel) if status != PCANBasic.PCAN_ERROR_OK: - print 'Error: ', self.Pcan.GetErrorText(status, 0)[1] + if self.debug: + print 'Error: ', self.Pcan.GetErrorText(status, 0)[1] sys.exit("PCAN deinitialisation error") - - print("PCAN deinitialised") - + if self.debug: + print("PCAN deinitialised") + def sendMessage(self, Message, rtr = False): ''' Sends the CanMessage object Message onto the CAN bus. - - @param Messge: The CanMessage object that is to be sent. + + @param Messge: The CanMessage object that is to be sent. ''' Message.composeData() # compose message data array from the signals in Message.Signals. - + msg = PCANBasic.TPCANMsg() # create a new PCAN message object msg.ID = Message.Id # copy the ID if rtr: @@ -108,10 +112,10 @@ class PcanAdapter(object): msg.MSGTYPE = PCANBasic.PCAN_MESSAGE_STANDARD # Message type is standard (not extended) msg.LEN = Message.Length # copy the length msg.DATA[0:Message.Length] = Message.Data # copy the message data into the PCAN message object - + self.Pcan.Write(self.Channel, msg) # write it onto the Bus #print ('Message ' + Message.Label + ' written.') - + def receiveMessage(self, block = False): ''' Tries to receive a CAN message and puts its data into the according CanMessage object's Data field. @@ -120,7 +124,7 @@ class PcanAdapter(object): while True: # do this while messages are read from the bus result, msg, timestamp = self.Pcan.Read(self.Channel) - + if result == PCANBasic.PCAN_ERROR_OK: # loop through the messages and look for one that matches the received message: for msgKey in self.Messages: diff --git a/CANLibrary/example.py b/CANLibrary/example.py index 3debfd4..ad98d90 100644 --- a/CANLibrary/example.py +++ b/CANLibrary/example.py @@ -9,6 +9,7 @@ Example for creating and sending CAN messages via PCAN using the CanMessage, Can from CanMessage import CanMessage from CanSignal import CanSignal from PCan import PcanAdapter +from Sym2Lib import addtoPCAN, printCode import time print '\nCreate a PCAN adapter' diff --git a/PCANBasic/PCANBasic.pyc b/PCANBasic/PCANBasic.pyc deleted file mode 100644 index 10571194bbcd525bd31ba99163a1d867f91b9f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14926 zcmds8-FFj7b}w1B!C*dyVSpLtqxc%ji~-wxGr%BAZCisZiI!wz54(!2ZrcsAw^OTpoI2p`Z7^143Bzzl3NCQLz(ZsZZERvD7aZ4}cDW z?gHHnIwb5pVrj3i`-IgeUQo+n;3V)q;C|r!zyrVsfCqsO0`CI;0C+d>A>bk44}tdp z9|qnF{1Nal@DbpBz(;}i10MrE0Q@oVLEuk-KL9=sdecHd>VKh_zds_@Rz`oz$3sHfm6VjfJcEZ1D^%H z0{j*5Rp2q;Ym9BGy-K`XQ@mV9{W;X%06q`=HSh)Co5171w}2;rZv#&PeL&-R`uP@E^>Y_k^^*s_ zfsXswtj%A<+SGy7`YZ#hxi^3npBC_K@NWxySIF}Uu;O_Y zSn;+7tn}0o_KH|~DC{+{^hnryh4l^kX#(E?UI$JCw}7XB+rSy%4d5*B_rM0Q3p@?% z0nY&Yz_Y*|;2iK{;BSGS0N(|E3Y-Vt6!z{=uYLopbl@+6)ml9RR`Y!htn}@#fR&E@ z0IYQEx56UT`kh!w2&*7o3h_dS#ibvGMT(_LOS<%hu%sn9w*x zn3qqfL+1i5hg0|`B8TttBdvsUn7KOq89&k@I2Trl{O|)UKF_UE%A^Z(-fDv|{+O95 z`gu2r*g`CkxQWu%n_wea!5&OrmO+wT0RwWnVEMyjE+~ z*X>%(=k==9*4tL6$&cKiR!OyJ>l~ z6g3tR@vhM0?2QLTqv>pT_Jb#F_mQ_zZ`coLB6(-ot-G5Kcv4e!&uK*H{Klrq3iZ$Q z^O(=Ub56r;dv>GUvOIZ9uH#XDB`3zm$K_diZZ;i{p2wd~2Y*!B zRat94w%wIx`-u`VYlM2sXI)lMxA9dqj|tr|`PpP~nyjfN8wZ3$0`u0|u5Yq^L_z}k zIg(;a`xp9oJltTvl9bQGYSC^L(ce*ZkBDB9y^v{y(G{CUAG>88Kaku&80rm)M7XWQHy8(uUH3YCvSbG5W3u`aH0q)-#7B4CCI>;)(6Y*Ggu77Hu*jFykqE-9Y%i)VC384%A0 z1v$QFIHQyoS_ecTk)U;+nf+0SRzlpTg;fjc{U=E!5GFg*9I@flo6c`+?M*Xl^;XMn z?$NDEb(j33Z@b$J=^IfKAIJFQh2c<8WC9#Z{H`R+LVCg^n* zr?+8~`&ena(x<0JdwspravD%5nVPDYgnb>&QQ?)m`gJ-L)n0C)*pgtGXpWueJ=uP_9@aPq0&8xeG;Ew=CLtJk8|>txL0M zH{}Ms7~?9}qP2268~zrqbd79v)|YLUx#Rh6-;?grwEd3T>RSC^$;)JO9Z%A5v~s*U z`W^2CDUG%n*>1sNpxx&qp%-9f=10^P+X!tuwWt;r1JSB+uw|M@xiRZ!AXF%HC{Ea$ z5(}VORk%JqdF;oulJCZxcr%Px{x5p+*qe)wl8Mg~`xD8;K%&83h}{YQU{SmaZ^|x< zBA@iU4^{*h`)Vs{c3V-k<;3iW{DvfPkZxejLrWn?sT)~xc~f>Tww9cf8k+Wco#KPI z+08hQ*{)b?;zswl-t5@&BzvNzpL{$E+ejUSg}y?o;8Y(br|RLpGTGc zjmC=!Y$jBsM#pt2!jp8o;0*^+|LZj87bj#%liNYaG*Pw3#RbjLFAG{%zGq>xV(GDN zX@T$S@g1xa{KHPxAh0>dq4f)a4UD2|0u&n}w0=k+At;`ufRT1M21s_lNQ&qE!XMxe zlB02ilPgK_>TR!18)-~COuJ6!xjJuT;Tc@6xb5{W*8^{}jl$@Dws9~OxGoNQq}tfv ztH`lX7`oQB*u~W4#dChULnn_h`DD$e=uUSiG5(6ok3tiiI?zp%YU* zpO1CIOtf7qiqgOejqKX-4f(tAU+D;V=WtBQ??o;%-^mLKAH1^v}lEbyoh{K_sC;+^{2c3vm2=rS~zLfwv~*cFvR0cc?UCP zjVq`#J(-6v*+NzH$|r5*lBLbLk0z;%Tk$VLKkpkNo1AgcWVy(sSp56%#BooKOD3Yr=L%{#; zq(eGO@S9iW0?}_{5+=`?CmMSgVb6k3v8WUp_ zi?a5p5ym8K3U$wx9r|(cNZI!1`Fu38O`lq&UakIGZT}?ApQg<)msNHXWRHU#N&9?C zX;RJ>icc+-&WGt#%^MkVoBMfXPixNV+M9GWM`?nvE9`_Q*kX#I*pNj@(azSgD33BG zCnnAXmkr)-Z>HDw!O_iUZ=|AjgW_)vjQ# zq0~+gE|UMCaB(OM7n9=Q9=@;9n^7{BYwV|7BQxpsI1&=D>yV-IW)wd=D3f@lABl{U zd_;@gN04J=HRID}z0sgpjWZ+KvK~>^S1Xs~IBzyg1g7G{k5YI1BDo9eyd)1(M?MZ2 z&+sr?e_VH(^<@e+V?C-_)C|)snzdX$UrL+lIlgcT@^PW3bCJHI&SUS!Ajg@iN#Gl{ z3w9^pL$J$Pffyg`D%BkgWeX{)=I6Tih@7m7!DCG|jN}pziFIoDEdvJKYmgjBE z!hAHl%T@bL!-II>IjQCp1)aeyENkr-M0Ri~bU4FCQb_S#0xkkslWKGqQkyr-a;{kL z>5f#OFf*Gj6pXyC_#mvv7iVhuVkTV)n>Q#p_w5>;2uKfW%ZQT@!!~M8%U1yjrPD3^3-$IG)ifh>Y#}rW)uSdNKA&A%FkK{)-*0ApdnbaiDLw zZzK$VIfx1`IS{)14HayDAM;|zBQNHj<+vsAT>bD|;g=%hlGG(gjQ|~Ydt4Y!w(P^mt?hq*0n#eOy+|h6yx`%p9v4#B)3$ptZ_^h7YxH87%#sDpUj*o6t1>w~ng)S_#n<7rH#~3VvclN6 zkm8FH^C}UaPc3j!?1?JI{fc>w>#j4o$prU7p~ne(P^X};xgJ^c?nueJMHTQzYQ@ak z+)xsEH>q{@Eg>iW%D#pDEc=#Y@GV1$k?>%Yq;d{F_y_N@KwvY?0g{e?*jps{>NyB_ z!ozit79)3}(qa_n;JXwZ=kNvfkHMWPWy{nz5`XOW7O?{pMJJ>rZyfMweV~A!cHc1R z8u|(9CyYbXB_yBjo9Z^RCo5I3JCyHl%GCJN@$u0yIb*x)6gctYReCg9tMtXi8lJDy zbD7R!;d6R49^~Zc`wd6EIWazpi-c*)1UJ;XnbE*d=%2`oDeix%F^#$`W#=7RZVk2X z=(=??aKQ?1@>;u;G9UPL@&dV*#n;$~c}GgFL-%=`GL)yxWk+NxYp>KfElH=^Kx(P+ z(KkIGy*{YHhf_PpGniS079&Wj!4ts#!}~MZ(RHIJ69PvOMHz@Z&B3hf*isy8^?vnpjLMMn!(M=ow%CQyxtxP6ym5kGJH_M-lMyCk zO!yNR^AZ!z)S2v7%o!q)Zv*-ncZc}U<=?4GkJD86x@$k@3=bU}`k4MZG9-tN4V@So z8A=t@pnpxx;BOmzLibEWq)ae9m8L+dlV`^cJNiyc>$tDmXYI#M!#1%;%yMH67||0> zy1Y8rHc&KG?^yH^h3&IAu#p5;&QU?GoTe-2iQaDk;svyRPDv0r+3SxYy zf*2pFAjXF(i1DEcVtkY`nQlH*!DJL9sPk>{uFugtq^(Ns&sCG?%pACFY;)V?@99i66BX}YjT6@+^$?wOf+W3E(L?Ct;F4*cBP zfqm1MsTk!gY!-@HGe!R7W)IL$wx#FWT?>tSxfXlDjPkJc18?kjrm;0s1>Sn zQzRL!K$qu>`AWG~DlWw3Wf~cSBv>=%c}=x;&Kc!$dd8?t=kgWOtIISilfMp%=BG5V zmabNcw8A7PEz^9iTrmo@Vj;h%0&D&j6;tEDx?D+Ds^y4VF3S`P)47?dX_$9-4E_QU z?ZaFF)n{oPDUG0wZ8mLY7t$t8Gd&j*c{rV5l&Gg-p<)*EdBY6XMfU_HFld%Fwk*9| zvEo8hs@9{H$rnkx^^AkkVu`+{*8PS}tK~{@&gX5mYfjZddOn@Yr>96`BQ}HNNK~cu zDO`(UCQ~itj4TX;7jL>+$ne_Kvc`0}ny-L^t_qT@xd`>|D%LYp(&(zolk+jQ_OxK; zDh5`gtF>vQvsjI;(lmKN&3>p*B$z^$WEU-7SYuYqtet4DLitij5q zde>4wvF=6h%v0%Vwl*<`%^zYx!L{-6yFEphw-!xa-qLDf@^bHs^quzIXtzN3*Qt>{ zWU2u#_Lgwp-EA&i?Jc>u<*msrZ%t51_iW>Xb2_%hjz+6{SW+v0n~r?0E-lS2R*X!< z87kO0b$37|HKSD8rj)zY$`HQIgP}c#Rps#JA7AvVJ8Tx?y9*}aFK@2n|HyEgZO-G5 zvG)uPCc6IHJ=`};QFH7+%F@N2xMsWO{&<_i@%J_ED(z}N-2J5A(0%sScXJTd(ns}! QyYxG+>!tt5@R0-m2Uxm=RsaA1 diff --git a/pycrc/crc_algorithms.pyc b/pycrc/crc_algorithms.pyc deleted file mode 100644 index 0ef825c90d4b8019131c641093b1f8634ef91bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5916 zcmb_g&u<&Y6`mz2%A_Slt{q#BjbJR-F^$Tsk~)c_+O&SyLEYH0yE3Z8aIjtO4ylz_ zyVUN`qKY^Tklc!%iXH+K=&?uNTA+s<(!ZcU@4dE{UJ9hg_Iq!Z%cWwsDJt4Knwgz> z^XAR>z4vCz|Cp|SviiP6EBPlgePH7pffxq_?#n$l(o)AV)qQ_o z>MfNG7)^6^5JxiZ@Jo`N#C;t^DqWzS2t|?T%;0YFR6E)IC`790V?ZkdRRMK-XB1~i1 zR}2uCS%ah zTx|Z1rW&=5vY06@%i>d`{WLeBL`ggrBKcb;2x`rdycrR}c4qzz*>|HcLHqv#1@Rh( zCcQXHb<+2AoPeK05YyY9o47kls|4f%k-^SR9ER~;x|9#2;Y^FM9wNtB$A}PP-G&rn zUBi(8{#ZW^E%pT#wh+*v26)7J<0X`uHn&ME)#Ov}Lk&%6u?-(@M?B#DI6c7|5 zx{4-VP<0wr_F}jFfe}W_+}&7p?z-t?mYi4C<4Cb6o?u3kkM`o^aoR&G6;FX_xD!h(KLt4}BDt2)c)KLlF(qPJ5sz`?9!) zuHBRLf74KZyCRl18l*tFi6X~cqI5r@D5)fl?Xo#H1Y$(Jz{J$7D-R%Y3nXbPL_QoC z06-yc$S6iE(~l1_aigxX3B@+8Y?I||0xJ)(XHny0W|)vsU~J8xXLn1^9-W79WG5iy zdD#33`qOWr5S6NR(yCikYnICsmPh)~VG+yL@T9j;;IQ~W%3^SZ4~!3Jj!$e}&^hsd zJ5SluVrVOyv5M2&J%iJrWQdPp72d(cQcqp1Wa;sjuvLDrYZUAQPo|t8bK03A zE^+A3b7oF{k(F_N*y%?eC&K~4nX4688jJ!A@>zxt(8O4B``tY2?ja-FQEBRS6)$9* zg29~UhF(8}IG>iz)qCQGeGEo&4$q;Yq7NXJo6to7Xpob(XHYPw0biS#WuK#hAUpC3 z#z`=iiFh_)r$I7|r=VsKISAzJf)mvZQtXtW?Xka!;f*wdoTG$}dxz&j2;Y#FC7~aq zW&D1%W=&gD@cl1a$5A^67cy5miP|yLPQd@qjmSW|Vlw;%6*_xEhTj@8{N{fogHt5K zkG>97PCo(v8_UVZS#k%Stb-?6(z!qSc7A|tI^yT*cWkPHoc$Q=V&VCGhN3oWX!ff0S z!#M8A`0MC~2wVl(l@e4reUXbKIn5Q@3%o6p{`GpmvJpt5gQ!RiTy?1PdAb!GGQFbI#Ed`2w}fE~fLAA(!+yE~0M(~jh!BGxvry(0M~GWY3Nw^1HyGJkh9Y!F`9l_6 z=z@Y9jgiw@ft=l+4PTiC;~r7zpW{k_Sw<7+md!R{DpS$iiD*S4QdwNvy~x?vMuR|* zR$!nUf#VLmtD?+<6W-{u$2U{+0fFv+)Lp!+j=AQXFdP{2FD65V;fnI?QhS-Ep6D)GVGzfAgIuON-NkSEMaXX^fx*Zyt5Op|E zY#$O?D2s&+9A5HwXr!;A5R=pJ{Kw(>i4uGO!!{26v2FHw$W&#D7ra#)~!h z<1oIwV8uyn$>@Tt>K%OjNz<`aFQ;e$kF!z(B060zMCLw6h8Mb%SOz} zCj|e(bd$qeM$KkV&PZf*GB6pj?A`eyevZbmC#SO>LDV?$@6g-albbxH9pa99NWdKN zztW1?=fy8O+lGVhm^gL>3tc%up&QaERkJ;Te!Y2{O;fuH9m=Bp~(l#B( zk8#VlDI2os)^F48-XwFh0s9gaY^m>}Hrf-{{-0~N4RPWMo|LYQ)pE5mb)j~wHeGwQ n_Db!{I{Q@n4ZLEL#_erfO?l2C>cHl?W(?9=BwYw$)ylsC?tm(o diff --git a/pycrc/crc_lexer.pyc b/pycrc/crc_lexer.pyc deleted file mode 100644 index b8d15f87c2cd282a474111ad54b5f5327a921e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6993 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 diff --git a/pycrc/crc_models.pyc b/pycrc/crc_models.pyc deleted file mode 100644 index f373a0970ec40e3a3baf1769ff02caf6bf21da79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5067 zcmeI0O>7%Q6o6-K$4Q)|NzEDGp$lIEkBtrZjaM(l$+t9Y`BOEoXO~OtRi} zch~t-ODh$DdP8vHQi&rMDkP*HI3Xm2IKTx}LP8uk04F%W2_(XMGaK7OH&KLogG8Rp z%zN|An>TOQ?CjYh~cvN3luR-UHPDO#{J-EiV`a-KOjC>c6cEz`|0)1mIXUZq4AO>5bt zu0@Nhs;$N&kxA&<%yhY8F=yurx~tm`vU3#1E>lZJ&K8>tMIw~ayloXItj>y!DJv8$ z+odU6y~r)$N}g=EG9B&4#eB1+|Ah?XSIMGhnDAt?k*`|pq+L-J z$JJyAoJTy#FNd0zOY>IA)Z*ZKw;tlJe8J@y#;81vk@k*tNppBj?XYls$xQ7zHx#He13B4X44qeh}Nk>nkPC>7QY!D<$)7NQ|5 zELb}Q3r5I-Q5CDzhqX&$?G`N0E{_GHM_GG(SbGJlP1v>1&n{n9yANx>U>y*wC;V8x zXFTY`IwV+!1&eO`j2%9#&MjC^O7{q(D&HURVRdbrCEw#wAJ$V6D=PWRv&-|BY*)7r z>*;N?WV@d6VLdCcVv=26e0g@oC4U|BVLd0YyfbbiR(pI{i7i-L-D9s0tIv-Gr^07j zKBMffejiryF|v*e)_{onLCN<+Tf8Tp_p$4QU=0h_N$DASL5h1ARmJ@&AJ&M(I=yXH z%7=AEVtICXzW40%;>+_rjPSjB)`vB^ZI*n-7kyY`Td?GqkXh$^Sm*s%Ufg?Ugwdn# z=nFoqafx+NiV4{+IaVipSeFFrvWSV7qTmdbP~brZN4ThA-wvT>xbvx(k z8fB1eLJA7`sN>ot)wOJ~z^MTg=63xqW)UXjoeZa3Yp|K3D8v2G@}5Mjcdl4ujVNgb3cC->9NdzN`&lze-a8A;JvdfHl4LC?sksf!@FyU_ z6Y@35Sjm}X>+2x+;$sk?9i9Nvve}Zuj$eT39hGTtHN*K1K(dL48)sCR>#~o!K^Ko_ z#{`7k1v{7mGwgL}xO*0LyTDv_w*z$XDpq2NerCSC;bY7O3+yvEKG$C39JdIQVJEz=~)6*7~g=;oYNyKeq*mgN{ezdJ`%evA#RR zWp`SeMnSgW>E1-FP}JwxPd_dN9dx%?5Sv|N#ROlluf26OD6Y3?Ic$a9Ub?pA;*JZs z0{iy!hCUunD|y{!_hFVV8c^HT0u^JEee4v7*a4Jd82)8F*!{ziSbvC=H%<1%7NGcW zxcr0uce)>r-7_LW9nXfp&0_fF)$8>cEjh7+IG8=7$*_85jW2yS`Az1-+PB(5Lidls z#K~We{&K#asCYSOH(o^wKF%>{AfLXekd;ny0}e#Unb+FL%>cQfkOhU@fD%z5?U*EA zZy{4KnTbN7NSt%fY!peNILwz!Q90VWTe7|C(0~dI%RQ%5#5xY1*{Y(lygrR~aV`%7 zi~_^q-CVJ#n_3iY=00|GBk!WN!CMxEF5!*S3%#+SnX{_FijF?BY}t!WF{kP?sga3s zHf!hX)frxx&VaYP@-kjrCluyG=L@R2Boo-ir>*T;EHkphU^=V>n|#D4(2{)xMsC@>s7fm*?1$Zi?5Sc*$Xj z#vL~y+=D@7Sj)Pd-U&VKEi7fZFue<>P=ot6y$5=a!F3pVHW}D z%;vp+d+ljJkv{l1EpW%-P&g0{)GM|B_-*)qPWjLIAY9)l9;x&}h!6f6vSt_HTb{?v WV~RiiRGbjc!O1wrA--zD;lBZ}*R>G< diff --git a/pycrc/crc_opt.pyc b/pycrc/crc_opt.pyc deleted file mode 100644 index 20e375bafb0691b7de70b60c68e07a46dfdcd9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11777 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 diff --git a/pycrc/crc_parser.pyc b/pycrc/crc_parser.pyc deleted file mode 100644 index fc1547bdbe74aad313988a831bc2d673e49805b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8786 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 EAFluI*Z=?k diff --git a/pycrc/crc_symtable.pyc b/pycrc/crc_symtable.pyc deleted file mode 100644 index 8c2c13dd2ea9ebd3cf387f9315cbb8316376ae5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37868 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 OQ42-}c5^**`2PVe3zob9 diff --git a/pycrc/pycrc.pyc b/pycrc/pycrc.pyc deleted file mode 100644 index 6706699d0e110aa90a1003b3ac361f18af9484a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6939 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 VC2Y@py}8nSrMZf~_2$`m=YJ#L Date: Fri, 13 Dec 2013 12:30:55 +0100 Subject: [PATCH 07/17] add sym2lib script --- .gitignore | 46 ++++ CANLibrary/Sym2Lib.py | 140 +++++++++++ CANLibrary/symfiles/MAB_Module_ACC.sym | 18 ++ CANLibrary/symfiles/MAB_Module_BMS.sym | 74 ++++++ CANLibrary/symfiles/MAB_Module_CUR.sym | 16 ++ .../symfiles/MAB_Module_CoolantPump.sym | 21 ++ .../symfiles/MAB_Module_Dcdc14VMain.sym | 20 ++ CANLibrary/symfiles/MAB_Module_MCU.sym | 49 ++++ CANLibrary/symfiles/MAB_Module_RLB.sym | 21 ++ CANLibrary/symfiles/MAB_Module_VBA.sym | 62 +++++ CANLibrary/symfiles/MAB_Module_VBB.sym | 15 ++ CANLibrary/symfiles/MCU.sym | 227 ++++++++++++++++++ pycrc/crc_algorithms.pyc | Bin 5916 -> 0 bytes pycrc/crc_lexer.pyc | Bin 6993 -> 0 bytes pycrc/crc_models.pyc | Bin 5067 -> 0 bytes pycrc/crc_opt.pyc | Bin 11777 -> 0 bytes pycrc/crc_parser.pyc | Bin 8786 -> 0 bytes pycrc/crc_symtable.pyc | Bin 37868 -> 0 bytes pycrc/pycrc.pyc | Bin 6939 -> 0 bytes 19 files changed, 709 insertions(+) create mode 100644 .gitignore create mode 100644 CANLibrary/Sym2Lib.py create mode 100644 CANLibrary/symfiles/MAB_Module_ACC.sym create mode 100644 CANLibrary/symfiles/MAB_Module_BMS.sym create mode 100644 CANLibrary/symfiles/MAB_Module_CUR.sym create mode 100644 CANLibrary/symfiles/MAB_Module_CoolantPump.sym create mode 100644 CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym create mode 100644 CANLibrary/symfiles/MAB_Module_MCU.sym create mode 100644 CANLibrary/symfiles/MAB_Module_RLB.sym create mode 100644 CANLibrary/symfiles/MAB_Module_VBA.sym create mode 100644 CANLibrary/symfiles/MAB_Module_VBB.sym create mode 100644 CANLibrary/symfiles/MCU.sym delete mode 100644 pycrc/crc_algorithms.pyc delete mode 100644 pycrc/crc_lexer.pyc delete mode 100644 pycrc/crc_models.pyc delete mode 100644 pycrc/crc_opt.pyc delete mode 100644 pycrc/crc_parser.pyc delete mode 100644 pycrc/crc_symtable.pyc delete mode 100644 pycrc/pycrc.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9435d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Ignore-Datei selbst ausschließen +#.gitignore +.gitmodules +Thumbs.db + +# Bestimmte Dateien ausschließen +cache.dat + +# Es können Wildcards (*,?) verwendet werden: +*.exe +*.dll +*.dsbackup +*.avrsln +*.avrsuo +*.avrgccproj +*.aps +*.atsln +*.atsuo +*.cproj +*.aws +*.xml +*.xslt +*.aux +*.dvi +*.lof +*.log +*.lot +*.out +*.synctex.gz +*.toc +*.pyc +*.patch +*.csv +.project +.pydevproject +tmp?.dat + +# Auch Verzeichnisse kann man ausschießen: +*default/ +*Debug/ +*bin/ +*ADC/ +*CAN/ +*UART/ +.*/ +CANLibrary/ diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py new file mode 100644 index 0000000..88f506a --- /dev/null +++ b/CANLibrary/Sym2Lib.py @@ -0,0 +1,140 @@ +# -*- coding: UTF-8 -*- + +''' +Created on 12.12.2013 + +@author: Philipp Rauch +@version: 1.0 +@attention: No support for multiplex; until now no motorola support +''' +from CanMessage import CanMessage +from CanSignal import CanSignal + +def readSym(symfile): + sym = open(symfile, "r") + + message = {} + tmp = {} + ignore = True + name = "" + + for line in sym: + line = line.split("//")[0].strip() + + if line == "": + if ignore: + continue + if name == "": + continue + tmp["CycleTime"] = 0 + message[name] = tmp + tmp = {} + name = "" + continue + + if ignore and not line[0] == "{": + continue + + if line[0] == "{": + ignore = False + modus = line.strip("{} \n") + if modus == "SEND": + ignore = False + elif modus == "RECEIVE": + ignore = False + elif modus == "SENDRECEIVE": + ignore = False + elif modus == "VIRTUALVARS": + ignore = True + + elif line[0] == "[": + name = line.strip("[] \n") + + elif line.find("ID") == 0: + msg_id = line.split("=")[1].strip().rstrip("h") + tmp["ID"] = int(msg_id, 16) + + elif line.find("DLC") == 0: + tmp["DLC"] = int(line.split("=")[1].strip()) + + elif line.find("CycleTime") == 0: + tmp["CycleTime"] = int(line.split("=")[1].strip()) + + elif line.find("Var") == 0: + arg = line.split("=")[1].strip().split(" ") + signal = {} + signal["factor"] = 1 + signal["data"] = 0 + signal["offset"] = 0 + + titel = arg[0] + del arg[0] + + signal["type"] = arg[0] + del arg[0] + + signal["begin"] = int(arg[0].split(",")[0]) + signal["length"] = int(arg[0].split(",")[1]) + del arg[0] + + if "-m" in arg: + signal["format"] = "motorola" + arg.remove("-m") + else: + signal["format"] = "intel" + + if "-b" in arg: + signal["output"] = "binary" + arg.remove("-b") + elif "-h" in arg: + signal["output"] = "hexadecimal" + arg.remove("-h") + else: + signal["output"] = "decimal" + + for i in arg: + a = i.split(":") + if a[0] == "/u": + signal["unit"] = a[1] + elif a[0] == "/f": + signal["factor"] = float(a[1]) + elif a[0] == "/o": + signal["offset"] = int(a[1]) + elif a[0] == "/d": + signal["data"] = float(a[1]) + + tmp[titel] = signal + return message + +def Sym2Code(symfile, adapter = "pcan"): + mes = readSym(symfile) + for i in mes.keys(): + print "%s.addMessage(CanMessage(%s, %s, %s, %s)" % (adapter, hex(mes[i]["ID"]), mes[i]["DLC"], mes[i]["CycleTime"], i) + for sig in mes[i]: + if isinstance(mes[i].get(sig), dict): + print "%s.Messages[%s].addSignal(CanSignal(%s, %s, %s, %s, %s, %s)" % (adapter, i, mes[i][sig]["begin"], mes[i][sig]["length"], mes[i][sig]["offset"], mes[i][sig]["factor"], mes[i][sig]["data"], sig) + print "" + +def Add2Adapter(pcan, symfile): + ''' + @attention: not tested + ''' + mes = readSym(symfile) + for i in mes.keys(): + pcan.addMessage(CanMessage(mes[i]["ID"], + mes[i]["DLC"], + mes[i]["CycleTime"], + i)) + print "add %s - %s to pcan" % (i, mes[i]["ID"]) + for sig in mes[i]: + if isinstance(mes[i].get(sig), dict): + pcan.Messages[i].addSignal(CanSignal(mes[i][sig]["begin"], + mes[i][sig]["length"], + mes[i][sig]["offset"], + mes[i][sig]["factor"], + mes[i][sig]["data"], + sig)) + print "add sig %s to msg %s" (sig, i) + return pcan + +Sym2Code("symfiles/MAB_Module_BMS.sym") diff --git a/CANLibrary/symfiles/MAB_Module_ACC.sym b/CANLibrary/symfiles/MAB_Module_ACC.sym new file mode 100644 index 0000000..033b6c6 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_ACC.sym @@ -0,0 +1,18 @@ +FormatVersion=5.0 // Do not edit! +Title="MicroAutoBox Artega" + +{SENDRECEIVE} + +[Module_ACC] +ID=513h +DLC=4 +Var=Input_Enable bit 0,1 +Var=Input_RelayIsClosed bit 1,1 +Var=Accelerator1PositionFiltered unsigned 2,7 /u:normed /f:0.01 /d:0 +Var=Accelerator2PositionFiltered unsigned 9,7 /u:norm /f:0.01 +Var=PositionFilteredAverage unsigned 16,7 /f:0.01 +Var=Error_VoltageLimit bit 24,1 +Var=Error_Difference bit 25,1 +Var=Warning_AcceleratorsNotEnabled bit 26,1 +Var=SignalIsValid bit 23,1 + diff --git a/CANLibrary/symfiles/MAB_Module_BMS.sym b/CANLibrary/symfiles/MAB_Module_BMS.sym new file mode 100644 index 0000000..aa126bf --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_BMS.sym @@ -0,0 +1,74 @@ +FormatVersion=5.0 // Do not edit! +Title="Untitled" + +{SENDRECEIVE} + +[MAB_Module_BMS_StateDemand] +ID=31Fh +DLC=1 +Var=Charge unsigned 0,1 +Var=Drive unsigned 2,1 +Var=Idle unsigned 3,1 + +[Module_BMS_ChargeState] +ID=152h +DLC=3 +Var=Voltage_Line1_CriticallyHigh unsigned 0,1 +Var=Voltage_Line2_CriticallyHigh unsigned 2,1 +Var=Charge_Stop_Line1 unsigned 1,1 +Var=Charge_Stop_Line2 unsigned 3,1 +Var=Current_Excess unsigned 8,8 +Var=Voltage_Excess unsigned 16,8 + +[Module_BMS_SOC] +ID=352h +DLC=1 +Var=SOC unsigned 0,8 + +[Module_BMS_State] +ID=150h +DLC=1 +Var=Init unsigned 0,1 +Var=Idle unsigned 1,1 +Var=Charge unsigned 2,1 +Var=Drive unsigned 3,1 +Var=DrivingPermitted unsigned 4,1 + +[Module_BMS_Voltage] +ID=350h +DLC=8 +Var=Voltage_Line1 unsigned 0,32 // in mV +Var=Voltage_Line2 unsigned 32,32 // in mV + +[Module_BMS_Current] +ID=351h +DLC=8 +Var=Current_Line1 unsigned 0,32 // in mA +Var=Current_Line2 unsigned 32,32 // in mA + +[Module_BMS_Temperature] +ID=153h +DLC=6 +Var=Temp_Max unsigned 0,16 // in Celcius +Var=Temp_Min unsigned 16,16 // in Celcius +Var=Temp_Average unsigned 32,16 // in Celcius + +[Module_BMS_DischargeState] +ID=151h +DLC=8 +Var=OverCurrent unsigned 0,1 /ln:"Maximaler continous Entladestrom erreicht" +Var=DeratePower unsigned 1,2 // Leistungdrosseln +Var=InsolationFault unsigned 8,4 +Var=DeviceError unsigned 12,4 +Var=Voltage_Line1_Critically_Low unsigned 16,2 +Var=Voltage_Line2_Critically_Low unsigned 18,2 +Var=Voltage_Line1_LowerLimit unsigned 20,2 +Var=Voltage_Line2_LowerLimit unsigned 22,2 +Var=BatteryCells_Warm unsigned 24,2 +Var=BatteryCells_Hot unsigned 26,1 + +[Module_BMS_InfoDCDC] +ID=353h +DLC=1 +Var=DCDC_PowerOnPermitted unsigned 0,8 + diff --git a/CANLibrary/symfiles/MAB_Module_CUR.sym b/CANLibrary/symfiles/MAB_Module_CUR.sym new file mode 100644 index 0000000..77c7a24 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_CUR.sym @@ -0,0 +1,16 @@ +FormatVersion=5.0 // Do not edit! +Title="MAB Artega" + +{SENDRECEIVE} + +[Module_CUR] +ID=515h +DLC=7 +CycleTime=50 +Var=SignalIsValid bit 0,1 +Var=Warning_CurrentOutOfBounds bit 1,1 +Var=Error_InvalidDutyCycle bit 2,1 +Var=CurrentFiltered signed 8,16 /u:A /f:0.0078 /d:0 +Var=ChargeBalance signed 24,32 /u:As /f:0.125 /d:0 +Var=Error_InvalidFrequency bit 3,1 + diff --git a/CANLibrary/symfiles/MAB_Module_CoolantPump.sym b/CANLibrary/symfiles/MAB_Module_CoolantPump.sym new file mode 100644 index 0000000..a2e2d27 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_CoolantPump.sym @@ -0,0 +1,21 @@ +FormatVersion=5.0 // Do not edit! +Title="MicroAutoBox Artega" + +{SENDRECEIVE} + +[Module_CoolantPump] +ID=514h // Debug info for module CoolantPump +DLC=7 +CycleTime=50 +Var=Input_Enable bit 0,1 +Var=Input_PumpMotorsEnable bit 8,1 +Var=Input_SpeedMotorsDemand unsigned 9,7 /f:0.01 +Var=Input_ErrorMotorsExternal bit 1,1 +Var=Input_PumpBatteryEnable bit 16,1 +Var=Input_SpeedBatteryDemand unsigned 17,7 /f:0.01 /d:0 +Var=Input_ErrorBatteryExternal bit 2,1 +Var=ControllerMotors_State unsigned 24,8 +Var=ControllerBattery_State unsigned 40,8 +Var=ControllerMotors_DutyCycle unsigned 32,7 /f:0.01 +Var=ControllerBattery_DutyCycle unsigned 48,7 /f:0.01 + diff --git a/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym b/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym new file mode 100644 index 0000000..0b4ad94 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym @@ -0,0 +1,20 @@ +FormatVersion=5.0 // Do not edit! +Title="MicroAutoBox Artega" + +{SENDRECEIVE} + +[Module_DCDC14V] +ID=512h // Status Information of Software Module DCDC14V +DLC=8 +CycleTime=50 +Var=Controller_State unsigned 24,8 +Var=Error_CanReception bit 56,1 +Var=Error_Temperature bit 57,1 +Var=Warning_Temperature bit 58,1 +Var=Error_Voltages bit 59,1 +Var=Input_Enable bit 0,1 +Var=Input_ModeDemandActive bit 1,1 +Var=Input_VoltageSetValue unsigned 8,8 /u:Volt /f:0.1 /d:0 +Var=Input_CurrentLimit unsigned 16,8 /u:Ampere +Var=Input_RelayDCDCIsClosed bit 2,1 + diff --git a/CANLibrary/symfiles/MAB_Module_MCU.sym b/CANLibrary/symfiles/MAB_Module_MCU.sym new file mode 100644 index 0000000..fc1af53 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_MCU.sym @@ -0,0 +1,49 @@ +FormatVersion=5.0 // Do not edit! +Title="MicroAutoBox Artega" + +{SENDRECEIVE} + +[Module_MCU] +ID=510h // Status Information of Software Module "Motor Control Unit" +DLC=8 +CycleTime=50 +Mux=Input 0,4 0 +Var=Input_PowerOn bit 4,1 +Var=Input_EnableController bit 5,1 +Var=Input_TorqueDemandLeft signed 8,16 /u:Nm +Var=Input_TorqueDemandRight signed 24,16 /u:Nm + +[Module_MCU] +DLC=7 +Mux=Internal 0,4 1 +Var=TorqueDemandPermittted bit 5,1 +Var=toRelaysPowerOnMCU unsigned 4,1 +Var=ControllerState unsigned 8,8 +Var=toMCU_StateDemand unsigned 16,8 +Var=IsEnabled bit 6,1 +Var=ControllerIsEnabled bit 7,1 +Var=TorqueAvailableMax signed 32,8 /u:Nm /f:2.5 /d:0 +Var=TorqueAvailableMin signed 40,8 /u:Nm /f:2.5 /d:0 +Var=McuStateActual unsigned 24,8 + +[Module_MCU] +DLC=3 +Mux=Errors 0,4 2 +Var=ErrorSpeed unsigned 4,1 /u:bool +Var=ErrorTemp unsigned 5,1 /u:bool +Var=ErrorVoltage unsigned 6,1 /u:bool +Var=ErrorSpeedMotorLeft unsigned 7,1 +Var=ErrorSpeedMotorRight unsigned 8,1 +Var=ErrorLimitTempCapacitorLeft unsigned 9,1 +Var=ErrorLimitTempCapacitorRight unsigned 10,1 +Var=ErrorTempT1Left unsigned 11,1 +Var=ErrorTempT1Right unsigned 12,1 +Var=ErrorTempT2Left unsigned 13,1 +Var=ErrorTempT2Right unsigned 14,1 +Var=ErrorTempT3Left unsigned 15,1 +Var=ErrorTempT3Right unsigned 16,1 +Var=ErrorVoltageDcLink unsigned 17,1 +Var=ErrorCanReceptionTime unsigned 18,1 +Var=ErrorCanMessageCounter unsigned 19,1 +Var=ErrorCan unsigned 20,1 + diff --git a/CANLibrary/symfiles/MAB_Module_RLB.sym b/CANLibrary/symfiles/MAB_Module_RLB.sym new file mode 100644 index 0000000..c09cdde --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_RLB.sym @@ -0,0 +1,21 @@ +FormatVersion=5.0 // Do not edit! +Title="MicroAutoBox Artega" + +{SENDRECEIVE} + +[Module_RLB] +ID=517h // Debug info for the module "Relay Board". +DLC=2 +CycleTime=50 +Var=AcceleratorIsClosed bit 0,1 +Var=VacuumPumpIsClosed bit 2,1 +Var=MotorsIsClosed bit 3,1 +Var=BmsIsClosed bit 4,1 +Var=TriportIsClosed bit 5,1 +Var=DcdcIsClosed bit 6,1 +Var=ChargerConductiveIsClosed bit 8,1 +Var=CoolingSystemIsClosed bit 7,1 +Var=VacuumSensorIsClosed bit 1,1 +Var=ChargerAuxiliaryPowerIsClosed bit 9,1 +Var=ReverseLightIsClosed bit 10,1 + diff --git a/CANLibrary/symfiles/MAB_Module_VBA.sym b/CANLibrary/symfiles/MAB_Module_VBA.sym new file mode 100644 index 0000000..7d81184 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_VBA.sym @@ -0,0 +1,62 @@ +FormatVersion=5.0 // Do not edit! +Title="Adapterboard" + +{SEND} + +[Module_VAB_Relays_and_Lights] +ID=2A3h +DLC=2 +Var=MAB2AB_RelayH2OPumpOn_b bit 7,1 -b -m +Var=MAB2AB_RelayRadiatorFanOn_b bit 6,1 -b -m +Var=MAB2AB_RelayHazardLightOn_b bit 5,1 -b -m +Var=MAB2AB_RelayRadiatorEMotorOn_b bit 4,1 -b -m +Var=MAB2AB_RelayBackLightOn_b bit 3,1 -b -m +Var=MAB2AB_RelayBrakeLightOn_b bit 2,1 -b -m +Var=MAB2AB_RelayExcessCurrentOn_b bit 1,1 -b -m +Var=MAB2AB_LightTempFaultOn_b bit 0,1 -b -m // LED in der Momentanverbrauchsanzeige +Var=MAB2AB_LightChargingOn_b bit 15,1 -b -m +Var=MAB2AB_LightBatDischargedOn_b bit 14,1 -b -m +Var=MAB2AB_LightForwardSpeedOn_b bit 13,1 -b -m +Var=MAB2AB_LightReverseGearOn_b bit 12,1 -b -m +Var=MAB2AB_Light12VBatFaultOn_b bit 11,1 -b -m +Var=MAB2AB_LightELFaultOn_b bit 10,1 -b -m +Var=MAB2AB_LightStopOn_b bit 9,1 -b -m +Var=MAB2AB_LightBatH2OLackOn_b bit 8,1 -b -m + +[MAB_Module_VAB_Displays] +ID=4A1h +DLC=3 +Var=MAB2AB_DisplayResidualEnergy_U8 unsigned 0,8 -m +Var=MAB2AB_DisplayConsumption_U8 unsigned 8,8 -m +Var=MAB2AB_DisplaySpeedometer_kmh unsigned 16,8 -m /u:km/h + +{RECEIVE} + +[Module_VAB_Status] +ID=2A1h +DLC=4 +Var=AB2MAB_BootCheckOkay_b bit 7,1 -b -m +Var=AB2MAB_EmergencyStopInactive_b bit 6,1 -b -m +Var=AB2MAB_ErrorModeS1Inactive_b bit 5,1 -b -m +Var=AB2MAB_ErrorModeS2Inactive_b bit 4,1 -b -m +Var=AB2MAB_ErrorModeS3Inactive_b bit 3,1 -b -m +Var=AB2MAB_OverallCheckOkay_b bit 2,1 -b -m +Var=AB2MAB_ChargingCoverClosed_b bit 15,1 -b -m +Var=AB2MAB_ChargingPlugConnected_b bit 14,1 -b -m +Var=AB2MAB_SwitchRearGearActive_b bit 13,1 -b -m +Var=AB2MAB_SwitchIgnitionIsOn_b bit 12,1 -b -m +Var=AB2MAB_SwitchEngineStartIsOn_b bit 11,1 -b -m +Var=AB2MAB_SensorFootBrakeIsOn_b bit 10,1 -b -m +Var=AB2MAB_SensorHandbrakeIsOn_b bit 9,1 -b -m +Var=AB2MAB_SensorBrakeFluidOkay_b bit 8,1 -b -m +Var=AB2MAB_SensorDriversDoorClosed_b bit 16,1 -b -m +Var=AB2MAB_TemperatureCoolant_C unsigned 22,10 -m /u:°C /f:0.1955034213 /o:-50 /d:0 + +[MAB_Module_VAB_AccPedal] +ID=2A2h // Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.00392157 +DLC=2 +Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.097751710654 + +{VIRTUALVARS} +Var=VV_Schalter_Ladeklappe bit -b + diff --git a/CANLibrary/symfiles/MAB_Module_VBB.sym b/CANLibrary/symfiles/MAB_Module_VBB.sym new file mode 100644 index 0000000..bac9551 --- /dev/null +++ b/CANLibrary/symfiles/MAB_Module_VBB.sym @@ -0,0 +1,15 @@ +FormatVersion=5.0 // Do not edit! +Title="Untitled" + +{SENDRECEIVE} + +[MAB_Module_VBB] +ID=516h +DLC=4 +Var=SensorVoltage_internal unsigned 8,8 /u:V /f:0.02 /d:0 +Var=SensorPressure_out unsigned 16,8 /u:bar /f:0.02 +Var=RelayVacuumSensorCloseDemand_out unsigned 0,1 /u:bool +Var=RelayVacuumPumpCloseDemand_out unsigned 1,1 /u:bool +Var=VbbIsEnabled_out unsigned 2,1 /u:bool +Var=PumpControllerState_internal unsigned 24,8 /u:uint8 + diff --git a/CANLibrary/symfiles/MCU.sym b/CANLibrary/symfiles/MCU.sym new file mode 100644 index 0000000..5dedb06 --- /dev/null +++ b/CANLibrary/symfiles/MCU.sym @@ -0,0 +1,227 @@ +FormatVersion=5.0 // Do not edit! +Title="Untitled" + +{SEND} + +[Receive_TorqueRequest] +ID=131h // Requested motor torque +DLC=8 +CycleTime=50 +Var=MessageCounter unsigned 0,4 +Var=CRC unsigned 8,8 +Var=TorqueDemand_Left signed 16,16 /u:Nm /f:0.0625 /d:0 +Var=TorqueDemand_Right signed 32,16 /u:Nm /f:0.0625 /d:0 + +[Module_VAB_AccPedal] +ID=2A2h +DLC=2 +Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.1 + +[Module_VAB_Status] +ID=2A1h +DLC=4 +Var=AB2MAB_TemperatureCoolant_C unsigned 22,10 -m /u:°C /f:0.195503 /o:-50 +Var=AB2MAB_SensorDriversDoorClosed_b unsigned 16,1 -m +Var=AB2MAB_ChargingHatchClosed_b unsigned 15,1 -m +Var=AB2MAB_ChargingPlugConnected_b unsigned 14,1 -m +Var=AB2MAB_SwitchRearGearActive_b unsigned 13,1 -m +Var=AB2MAB_SwitchIgnitionIsOn_b unsigned 12,1 -m +Var=AB2MAB_SwitchEngineStartIsOn_b unsigned 11,1 -m +Var=AB2MAB_SensorFootBrakeIsOff_b unsigned 10,1 -m +Var=AB2MAB_SensorHandbrakeIsOff_b unsigned 9,1 -m +Var=AB2MAB_SensorBrakeFluidOkay_b unsigned 8,1 -m +Var=AB2MAB_BootCheckOkay_b unsigned 7,1 -m +Var=AB2MAB_EmergencyStopInactive_b unsigned 6,1 -m +Var=AB2MAB_ErrorModeS1Inactive_b unsigned 5,1 -m +Var=AB2MAB_ErrorModeS2Inactive_b unsigned 4,1 -m +Var=AB2MAB_ErrorModeS3Inactive_b unsigned 3,1 -m +Var=AB2MAB_OverallCheckOkay_b unsigned 2,1 -m + +{RECEIVE} + +[MCU1_Energy] +ID=334h // Energy related sensor data. +DLC=8 +CycleTime=2 +Var=MCU1_MessageCounter unsigned 0,4 +Var=MCU1_VoltageDCLink unsigned 8,8 /u:V /f:2 +Var=MCU1_Current_Left signed 16,16 /u:A /f:0.0625 /d:0 +Var=MCU1_Current_Right signed 32,16 /u:A /f:0.0625 /d:0 + +[MCU2_Warning] +ID=336h // Warning levels for various values. If possible, there should be an escalation over two levels before an error +DLC=8 +CycleTime=2 +Var=MCU2_MessageCounter unsigned 0,4 +Var=MCU2_Communication unsigned 8,2 +Var=MCU2_TemperatureDCLink unsigned 10,2 +Var=MCU2_VoltageDCLink unsigned 12,2 +Var=MCU2_TemperatureCooler unsigned 14,2 +Var=MCU2_Speed unsigned 16,2 + +[MCU3_TorqueAvailable] +ID=335h // Currently available motor torques for normal and boost operation. +DLC=8 +CycleTime=2 +Var=MCU3_TorqueNormal_Left signed 0,16 /u:Nm /f:0.125 /d:0 +Var=MCU3_TorqueNormal_Right signed 16,16 /u:Nm /f:0.125 /d:0 +Var=MCU3_TorqueBoost_Left signed 32,16 /u:Nm /f:0.125 /d:0 +Var=MCU3_TorqueBoost_Right signed 48,16 /u:Nm /f:0.125 /d:0 + +[MCU4_TorqueActual] +ID=331h // Current actual motor torque values. +DLC=8 +CycleTime=2 +Var=MCU4_MessageCounter unsigned 0,4 +Var=MCU4_TorqueActual_Left signed 8,16 /u:Nm /f:0.0625 /d:0 +Var=MCU4_TorqueActual_Right signed 24,16 /u:Nm /f:0.0625 /d:0 + +[MCU5_Temperature] +ID=533h // Measured temperatures. +DLC=8 +CycleTime=2 +Var=MCU5_TempCapacitorLeft unsigned 0,8 /u:Celsius /o:-50 +Var=MCU5_TempCapacitorRight unsigned 8,8 /u:Celsius /o:-50 +Var=MCU5_TempT1Left unsigned 16,8 /u:Celsius /o:-50 +Var=MCU5_TempT1Right unsigned 24,8 /u:Celsius /o:-50 +Var=MCU5_TempT2Left unsigned 32,8 /u:Celsius /o:-50 +Var=MCU5_TempT2Right unsigned 40,8 /u:Celsius /o:-50 +Var=MCU5_TempT3Left unsigned 48,8 /u:Celsius /o:-50 +Var=MCU5_TempT3Right unsigned 56,8 /u:Celsius /o:-50 + +[MCU6_StateActual] +ID=333h // Current internal states indicators of the MCU firmware. +DLC=8 +CycleTime=2 +Var=MCU6_MessageCounter unsigned 0,4 +Var=MCU6_SysState_Actual unsigned 8,8 +Var=MCU6_CtrlState unsigned 16,8 +Var=MCU6_SysMode unsigned 24,8 +Var=MCU6_SysEmergencyId unsigned 32,8 +Var=MCU6_SysRunModeAtErrorDetection unsigned 40,8 +Var=MCU6_StateRequested unsigned 48,8 +Var=MCU6_StateRequestAck unsigned 56,8 + +[MCU7_MotorSpeed] +ID=337h // Motor speedes. +DLC=8 +CycleTime=2 +Var=MCU7_MessageCounter unsigned 0,4 +Var=MCU7_Speed_Left signed 8,16 /u:rad/s /f:0.0625 /d:0 +Var=MCU7_Speed_Right signed 24,16 /u:rad/s /f:0.0625 /d:0 + +[MCU8_CtrlPar1] +ID=339h // Feedback controller parameters. +DLC=8 +CycleTime=2 +Var=MCU8_MessageCounter unsigned 0,4 +Var=MCU8_TorqueReducedLeft signed 8,16 /f:0.0625 /d:0 +Var=MCU8_TorqueReducedRight signed 24,16 /f:0.0625 /d:0 + +[MCU9_Sense] +ID=535h // Sensor values. +DLC=8 +Var=MCU9_VoltageDcLink signed 0,16 /u:V /f:0.0625 /d:0 + +[MCU10_Diag] +ID=539h // Diagnosis bitmasks. +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_0 0,8 0 +Var=ErrGeneralMsk_MessageCounter unsigned 8,4 +Var=ErrGeneralMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_1 0,8 1 +Var=ErrCtrlMsk_MessageCounter unsigned 8,4 +Var=ErrCtrlMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_2 0,8 2 +Var=ErrAdcMsk_MessageCounter unsigned 8,4 +Var=ErrAdcMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_3 0,8 3 +Var=ErrComMsk_MessageCounter unsigned 8,4 +Var=ErrComMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_4 0,8 4 +Var=WarnGeneralMsk_MessageCounter unsigned 8,4 +Var=WarnGeneralMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_5 0,8 5 +Var=WarnCtrlMsk_MessageCounter unsigned 8,4 +Var=WarnCtrlMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_6 0,8 6 +Var=WarnAdcMsk_MessageCounter unsigned 8,4 +Var=WarnAdcMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_7 0,8 7 +Var=WarnComMsk_MessageCounter unsigned 8,4 +Var=WarnComMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_8 0,8 8 +Var=DiagGeneralMsk_MessageCounter unsigned 8,4 +Var=DiagGeneralMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_9 0,8 9 +Var=DiagCtrlMsk_MessageCounter unsigned 8,4 +Var=DiagCtrlMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_10 0,8 0Ah +Var=DiagAdcMsk_MessageCounter unsigned 8,4 +Var=DiagAdcMsk unsigned 16,32 + +[MCU10_Diag] +DLC=8 +CycleTime=2 +Mux=MCU10_Diag_Mux_11 0,8 0Bh +Var=DiagComMsk_MessageCounter unsigned 8,4 +Var=DiagComMsk unsigned 16,32 + +[VCU_Module_VAB_Displays] +ID=4A1h +DLC=3 +CycleTime=4 +Var=MAB2AB_DisplaySpeedometer_kmh unsigned 16,8 -m /u:km/h +Var=MAB2AB_DisplayConsumption_U8 unsigned 8,8 -m +Var=MAB2AB_DisplayResidualEnergy_U8 unsigned 0,8 -m + +{SENDRECEIVE} + +[Receive_StateRequest] +ID=332h // Requested Motor Controller State +DLC=8 +Var=MessageCounter unsigned 0,4 +Var=CRC unsigned 8,8 +Var=State_Request unsigned 16,8 + diff --git a/pycrc/crc_algorithms.pyc b/pycrc/crc_algorithms.pyc deleted file mode 100644 index 0ef825c90d4b8019131c641093b1f8634ef91bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5916 zcmb_g&u<&Y6`mz2%A_Slt{q#BjbJR-F^$Tsk~)c_+O&SyLEYH0yE3Z8aIjtO4ylz_ zyVUN`qKY^Tklc!%iXH+K=&?uNTA+s<(!ZcU@4dE{UJ9hg_Iq!Z%cWwsDJt4Knwgz> z^XAR>z4vCz|Cp|SviiP6EBPlgePH7pffxq_?#n$l(o)AV)qQ_o z>MfNG7)^6^5JxiZ@Jo`N#C;t^DqWzS2t|?T%;0YFR6E)IC`790V?ZkdRRMK-XB1~i1 zR}2uCS%ah zTx|Z1rW&=5vY06@%i>d`{WLeBL`ggrBKcb;2x`rdycrR}c4qzz*>|HcLHqv#1@Rh( zCcQXHb<+2AoPeK05YyY9o47kls|4f%k-^SR9ER~;x|9#2;Y^FM9wNtB$A}PP-G&rn zUBi(8{#ZW^E%pT#wh+*v26)7J<0X`uHn&ME)#Ov}Lk&%6u?-(@M?B#DI6c7|5 zx{4-VP<0wr_F}jFfe}W_+}&7p?z-t?mYi4C<4Cb6o?u3kkM`o^aoR&G6;FX_xD!h(KLt4}BDt2)c)KLlF(qPJ5sz`?9!) zuHBRLf74KZyCRl18l*tFi6X~cqI5r@D5)fl?Xo#H1Y$(Jz{J$7D-R%Y3nXbPL_QoC z06-yc$S6iE(~l1_aigxX3B@+8Y?I||0xJ)(XHny0W|)vsU~J8xXLn1^9-W79WG5iy zdD#33`qOWr5S6NR(yCikYnICsmPh)~VG+yL@T9j;;IQ~W%3^SZ4~!3Jj!$e}&^hsd zJ5SluVrVOyv5M2&J%iJrWQdPp72d(cQcqp1Wa;sjuvLDrYZUAQPo|t8bK03A zE^+A3b7oF{k(F_N*y%?eC&K~4nX4688jJ!A@>zxt(8O4B``tY2?ja-FQEBRS6)$9* zg29~UhF(8}IG>iz)qCQGeGEo&4$q;Yq7NXJo6to7Xpob(XHYPw0biS#WuK#hAUpC3 z#z`=iiFh_)r$I7|r=VsKISAzJf)mvZQtXtW?Xka!;f*wdoTG$}dxz&j2;Y#FC7~aq zW&D1%W=&gD@cl1a$5A^67cy5miP|yLPQd@qjmSW|Vlw;%6*_xEhTj@8{N{fogHt5K zkG>97PCo(v8_UVZS#k%Stb-?6(z!qSc7A|tI^yT*cWkPHoc$Q=V&VCGhN3oWX!ff0S z!#M8A`0MC~2wVl(l@e4reUXbKIn5Q@3%o6p{`GpmvJpt5gQ!RiTy?1PdAb!GGQFbI#Ed`2w}fE~fLAA(!+yE~0M(~jh!BGxvry(0M~GWY3Nw^1HyGJkh9Y!F`9l_6 z=z@Y9jgiw@ft=l+4PTiC;~r7zpW{k_Sw<7+md!R{DpS$iiD*S4QdwNvy~x?vMuR|* zR$!nUf#VLmtD?+<6W-{u$2U{+0fFv+)Lp!+j=AQXFdP{2FD65V;fnI?QhS-Ep6D)GVGzfAgIuON-NkSEMaXX^fx*Zyt5Op|E zY#$O?D2s&+9A5HwXr!;A5R=pJ{Kw(>i4uGO!!{26v2FHw$W&#D7ra#)~!h z<1oIwV8uyn$>@Tt>K%OjNz<`aFQ;e$kF!z(B060zMCLw6h8Mb%SOz} zCj|e(bd$qeM$KkV&PZf*GB6pj?A`eyevZbmC#SO>LDV?$@6g-albbxH9pa99NWdKN zztW1?=fy8O+lGVhm^gL>3tc%up&QaERkJ;Te!Y2{O;fuH9m=Bp~(l#B( zk8#VlDI2os)^F48-XwFh0s9gaY^m>}Hrf-{{-0~N4RPWMo|LYQ)pE5mb)j~wHeGwQ n_Db!{I{Q@n4ZLEL#_erfO?l2C>cHl?W(?9=BwYw$)ylsC?tm(o diff --git a/pycrc/crc_lexer.pyc b/pycrc/crc_lexer.pyc deleted file mode 100644 index b8d15f87c2cd282a474111ad54b5f5327a921e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6993 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 diff --git a/pycrc/crc_models.pyc b/pycrc/crc_models.pyc deleted file mode 100644 index f373a0970ec40e3a3baf1769ff02caf6bf21da79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5067 zcmeI0O>7%Q6o6-K$4Q)|NzEDGp$lIEkBtrZjaM(l$+t9Y`BOEoXO~OtRi} zch~t-ODh$DdP8vHQi&rMDkP*HI3Xm2IKTx}LP8uk04F%W2_(XMGaK7OH&KLogG8Rp z%zN|An>TOQ?CjYh~cvN3luR-UHPDO#{J-EiV`a-KOjC>c6cEz`|0)1mIXUZq4AO>5bt zu0@Nhs;$N&kxA&<%yhY8F=yurx~tm`vU3#1E>lZJ&K8>tMIw~ayloXItj>y!DJv8$ z+odU6y~r)$N}g=EG9B&4#eB1+|Ah?XSIMGhnDAt?k*`|pq+L-J z$JJyAoJTy#FNd0zOY>IA)Z*ZKw;tlJe8J@y#;81vk@k*tNppBj?XYls$xQ7zHx#He13B4X44qeh}Nk>nkPC>7QY!D<$)7NQ|5 zELb}Q3r5I-Q5CDzhqX&$?G`N0E{_GHM_GG(SbGJlP1v>1&n{n9yANx>U>y*wC;V8x zXFTY`IwV+!1&eO`j2%9#&MjC^O7{q(D&HURVRdbrCEw#wAJ$V6D=PWRv&-|BY*)7r z>*;N?WV@d6VLdCcVv=26e0g@oC4U|BVLd0YyfbbiR(pI{i7i-L-D9s0tIv-Gr^07j zKBMffejiryF|v*e)_{onLCN<+Tf8Tp_p$4QU=0h_N$DASL5h1ARmJ@&AJ&M(I=yXH z%7=AEVtICXzW40%;>+_rjPSjB)`vB^ZI*n-7kyY`Td?GqkXh$^Sm*s%Ufg?Ugwdn# z=nFoqafx+NiV4{+IaVipSeFFrvWSV7qTmdbP~brZN4ThA-wvT>xbvx(k z8fB1eLJA7`sN>ot)wOJ~z^MTg=63xqW)UXjoeZa3Yp|K3D8v2G@}5Mjcdl4ujVNgb3cC->9NdzN`&lze-a8A;JvdfHl4LC?sksf!@FyU_ z6Y@35Sjm}X>+2x+;$sk?9i9Nvve}Zuj$eT39hGTtHN*K1K(dL48)sCR>#~o!K^Ko_ z#{`7k1v{7mGwgL}xO*0LyTDv_w*z$XDpq2NerCSC;bY7O3+yvEKG$C39JdIQVJEz=~)6*7~g=;oYNyKeq*mgN{ezdJ`%evA#RR zWp`SeMnSgW>E1-FP}JwxPd_dN9dx%?5Sv|N#ROlluf26OD6Y3?Ic$a9Ub?pA;*JZs z0{iy!hCUunD|y{!_hFVV8c^HT0u^JEee4v7*a4Jd82)8F*!{ziSbvC=H%<1%7NGcW zxcr0uce)>r-7_LW9nXfp&0_fF)$8>cEjh7+IG8=7$*_85jW2yS`Az1-+PB(5Lidls z#K~We{&K#asCYSOH(o^wKF%>{AfLXekd;ny0}e#Unb+FL%>cQfkOhU@fD%z5?U*EA zZy{4KnTbN7NSt%fY!peNILwz!Q90VWTe7|C(0~dI%RQ%5#5xY1*{Y(lygrR~aV`%7 zi~_^q-CVJ#n_3iY=00|GBk!WN!CMxEF5!*S3%#+SnX{_FijF?BY}t!WF{kP?sga3s zHf!hX)frxx&VaYP@-kjrCluyG=L@R2Boo-ir>*T;EHkphU^=V>n|#D4(2{)xMsC@>s7fm*?1$Zi?5Sc*$Xj z#vL~y+=D@7Sj)Pd-U&VKEi7fZFue<>P=ot6y$5=a!F3pVHW}D z%;vp+d+ljJkv{l1EpW%-P&g0{)GM|B_-*)qPWjLIAY9)l9;x&}h!6f6vSt_HTb{?v WV~RiiRGbjc!O1wrA--zD;lBZ}*R>G< diff --git a/pycrc/crc_opt.pyc b/pycrc/crc_opt.pyc deleted file mode 100644 index 20e375bafb0691b7de70b60c68e07a46dfdcd9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11777 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 diff --git a/pycrc/crc_parser.pyc b/pycrc/crc_parser.pyc deleted file mode 100644 index fc1547bdbe74aad313988a831bc2d673e49805b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8786 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 EAFluI*Z=?k diff --git a/pycrc/crc_symtable.pyc b/pycrc/crc_symtable.pyc deleted file mode 100644 index 8c2c13dd2ea9ebd3cf387f9315cbb8316376ae5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37868 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 OQ42-}c5^**`2PVe3zob9 diff --git a/pycrc/pycrc.pyc b/pycrc/pycrc.pyc deleted file mode 100644 index 6706699d0e110aa90a1003b3ac361f18af9484a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6939 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 VC2Y@py}8nSrMZf~_2$`m=YJ#L Date: Fri, 13 Dec 2013 12:32:22 +0100 Subject: [PATCH 08/17] add sym2lib to .prefs --- .settings/org.eclipse.core.resources.prefs | 1 + 1 file changed, 1 insertion(+) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 77d664b..24ecbd3 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -2,5 +2,6 @@ eclipse.preferences.version=1 encoding//CANLibrary/CanMessage.py=UTF-8 encoding//CANLibrary/CanSignal.py=UTF-8 encoding//CANLibrary/PCan.py=UTF-8 +encoding//CANLibrary/Sym2Lib.py=UTF-8 encoding//CANLibrary/example.py=UTF-8 encoding//pycrc/crc_algorithms.py=latin1 From 4916261e78dce0ab65efa063f2ac932f99a0c36d Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Wed, 15 Jan 2014 13:10:22 +0100 Subject: [PATCH 09/17] bugfix sym2lib --- CANLibrary/Sym2Lib.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 88f506a..0a78098 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -120,12 +120,13 @@ def Add2Adapter(pcan, symfile): @attention: not tested ''' mes = readSym(symfile) + print "" for i in mes.keys(): pcan.addMessage(CanMessage(mes[i]["ID"], mes[i]["DLC"], mes[i]["CycleTime"], i)) - print "add %s - %s to pcan" % (i, mes[i]["ID"]) + print "add %s - %s to pcan" % (i, hex(mes[i]["ID"])) for sig in mes[i]: if isinstance(mes[i].get(sig), dict): pcan.Messages[i].addSignal(CanSignal(mes[i][sig]["begin"], @@ -134,7 +135,6 @@ def Add2Adapter(pcan, symfile): mes[i][sig]["factor"], mes[i][sig]["data"], sig)) - print "add sig %s to msg %s" (sig, i) + print "add sig %s to msg %s" % (sig, i) + print "" return pcan - -Sym2Code("symfiles/MAB_Module_BMS.sym") From d34df5ba18fcce3c6e55d2dc16cce2adc09d8717 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Wed, 15 Jan 2014 18:00:28 +0100 Subject: [PATCH 10/17] bugfix --- CANLibrary/Sym2Lib.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 0a78098..0662430 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -26,7 +26,8 @@ def readSym(symfile): continue if name == "": continue - tmp["CycleTime"] = 0 + if not tmp.has_key("CycleTime"): + tmp["CycleTime"] = 0 message[name] = tmp tmp = {} name = "" @@ -52,7 +53,7 @@ def readSym(symfile): elif line.find("ID") == 0: msg_id = line.split("=")[1].strip().rstrip("h") - tmp["ID"] = int(msg_id, 16) + tmp["ID"] = int(msg_id, 16) # convert hex to int elif line.find("DLC") == 0: tmp["DLC"] = int(line.split("=")[1].strip()) @@ -117,7 +118,7 @@ def Sym2Code(symfile, adapter = "pcan"): def Add2Adapter(pcan, symfile): ''' - @attention: not tested + ''' mes = readSym(symfile) print "" From 8b43ba9c3168c340a80fd1bcefe19bde9b8f15d0 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Mon, 27 Jan 2014 14:27:06 +0100 Subject: [PATCH 11/17] delete sym files --- CANLibrary/symfiles/MAB_Module_ACC.sym | 18 -- CANLibrary/symfiles/MAB_Module_BMS.sym | 74 ------ CANLibrary/symfiles/MAB_Module_CUR.sym | 16 -- .../symfiles/MAB_Module_CoolantPump.sym | 21 -- .../symfiles/MAB_Module_Dcdc14VMain.sym | 20 -- CANLibrary/symfiles/MAB_Module_MCU.sym | 49 ---- CANLibrary/symfiles/MAB_Module_RLB.sym | 21 -- CANLibrary/symfiles/MAB_Module_VBA.sym | 62 ----- CANLibrary/symfiles/MAB_Module_VBB.sym | 15 -- CANLibrary/symfiles/MCU.sym | 227 ------------------ 10 files changed, 523 deletions(-) delete mode 100644 CANLibrary/symfiles/MAB_Module_ACC.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_BMS.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_CUR.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_CoolantPump.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_MCU.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_RLB.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_VBA.sym delete mode 100644 CANLibrary/symfiles/MAB_Module_VBB.sym delete mode 100644 CANLibrary/symfiles/MCU.sym diff --git a/CANLibrary/symfiles/MAB_Module_ACC.sym b/CANLibrary/symfiles/MAB_Module_ACC.sym deleted file mode 100644 index 033b6c6..0000000 --- a/CANLibrary/symfiles/MAB_Module_ACC.sym +++ /dev/null @@ -1,18 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MicroAutoBox Artega" - -{SENDRECEIVE} - -[Module_ACC] -ID=513h -DLC=4 -Var=Input_Enable bit 0,1 -Var=Input_RelayIsClosed bit 1,1 -Var=Accelerator1PositionFiltered unsigned 2,7 /u:normed /f:0.01 /d:0 -Var=Accelerator2PositionFiltered unsigned 9,7 /u:norm /f:0.01 -Var=PositionFilteredAverage unsigned 16,7 /f:0.01 -Var=Error_VoltageLimit bit 24,1 -Var=Error_Difference bit 25,1 -Var=Warning_AcceleratorsNotEnabled bit 26,1 -Var=SignalIsValid bit 23,1 - diff --git a/CANLibrary/symfiles/MAB_Module_BMS.sym b/CANLibrary/symfiles/MAB_Module_BMS.sym deleted file mode 100644 index aa126bf..0000000 --- a/CANLibrary/symfiles/MAB_Module_BMS.sym +++ /dev/null @@ -1,74 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="Untitled" - -{SENDRECEIVE} - -[MAB_Module_BMS_StateDemand] -ID=31Fh -DLC=1 -Var=Charge unsigned 0,1 -Var=Drive unsigned 2,1 -Var=Idle unsigned 3,1 - -[Module_BMS_ChargeState] -ID=152h -DLC=3 -Var=Voltage_Line1_CriticallyHigh unsigned 0,1 -Var=Voltage_Line2_CriticallyHigh unsigned 2,1 -Var=Charge_Stop_Line1 unsigned 1,1 -Var=Charge_Stop_Line2 unsigned 3,1 -Var=Current_Excess unsigned 8,8 -Var=Voltage_Excess unsigned 16,8 - -[Module_BMS_SOC] -ID=352h -DLC=1 -Var=SOC unsigned 0,8 - -[Module_BMS_State] -ID=150h -DLC=1 -Var=Init unsigned 0,1 -Var=Idle unsigned 1,1 -Var=Charge unsigned 2,1 -Var=Drive unsigned 3,1 -Var=DrivingPermitted unsigned 4,1 - -[Module_BMS_Voltage] -ID=350h -DLC=8 -Var=Voltage_Line1 unsigned 0,32 // in mV -Var=Voltage_Line2 unsigned 32,32 // in mV - -[Module_BMS_Current] -ID=351h -DLC=8 -Var=Current_Line1 unsigned 0,32 // in mA -Var=Current_Line2 unsigned 32,32 // in mA - -[Module_BMS_Temperature] -ID=153h -DLC=6 -Var=Temp_Max unsigned 0,16 // in Celcius -Var=Temp_Min unsigned 16,16 // in Celcius -Var=Temp_Average unsigned 32,16 // in Celcius - -[Module_BMS_DischargeState] -ID=151h -DLC=8 -Var=OverCurrent unsigned 0,1 /ln:"Maximaler continous Entladestrom erreicht" -Var=DeratePower unsigned 1,2 // Leistungdrosseln -Var=InsolationFault unsigned 8,4 -Var=DeviceError unsigned 12,4 -Var=Voltage_Line1_Critically_Low unsigned 16,2 -Var=Voltage_Line2_Critically_Low unsigned 18,2 -Var=Voltage_Line1_LowerLimit unsigned 20,2 -Var=Voltage_Line2_LowerLimit unsigned 22,2 -Var=BatteryCells_Warm unsigned 24,2 -Var=BatteryCells_Hot unsigned 26,1 - -[Module_BMS_InfoDCDC] -ID=353h -DLC=1 -Var=DCDC_PowerOnPermitted unsigned 0,8 - diff --git a/CANLibrary/symfiles/MAB_Module_CUR.sym b/CANLibrary/symfiles/MAB_Module_CUR.sym deleted file mode 100644 index 77c7a24..0000000 --- a/CANLibrary/symfiles/MAB_Module_CUR.sym +++ /dev/null @@ -1,16 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MAB Artega" - -{SENDRECEIVE} - -[Module_CUR] -ID=515h -DLC=7 -CycleTime=50 -Var=SignalIsValid bit 0,1 -Var=Warning_CurrentOutOfBounds bit 1,1 -Var=Error_InvalidDutyCycle bit 2,1 -Var=CurrentFiltered signed 8,16 /u:A /f:0.0078 /d:0 -Var=ChargeBalance signed 24,32 /u:As /f:0.125 /d:0 -Var=Error_InvalidFrequency bit 3,1 - diff --git a/CANLibrary/symfiles/MAB_Module_CoolantPump.sym b/CANLibrary/symfiles/MAB_Module_CoolantPump.sym deleted file mode 100644 index a2e2d27..0000000 --- a/CANLibrary/symfiles/MAB_Module_CoolantPump.sym +++ /dev/null @@ -1,21 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MicroAutoBox Artega" - -{SENDRECEIVE} - -[Module_CoolantPump] -ID=514h // Debug info for module CoolantPump -DLC=7 -CycleTime=50 -Var=Input_Enable bit 0,1 -Var=Input_PumpMotorsEnable bit 8,1 -Var=Input_SpeedMotorsDemand unsigned 9,7 /f:0.01 -Var=Input_ErrorMotorsExternal bit 1,1 -Var=Input_PumpBatteryEnable bit 16,1 -Var=Input_SpeedBatteryDemand unsigned 17,7 /f:0.01 /d:0 -Var=Input_ErrorBatteryExternal bit 2,1 -Var=ControllerMotors_State unsigned 24,8 -Var=ControllerBattery_State unsigned 40,8 -Var=ControllerMotors_DutyCycle unsigned 32,7 /f:0.01 -Var=ControllerBattery_DutyCycle unsigned 48,7 /f:0.01 - diff --git a/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym b/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym deleted file mode 100644 index 0b4ad94..0000000 --- a/CANLibrary/symfiles/MAB_Module_Dcdc14VMain.sym +++ /dev/null @@ -1,20 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MicroAutoBox Artega" - -{SENDRECEIVE} - -[Module_DCDC14V] -ID=512h // Status Information of Software Module DCDC14V -DLC=8 -CycleTime=50 -Var=Controller_State unsigned 24,8 -Var=Error_CanReception bit 56,1 -Var=Error_Temperature bit 57,1 -Var=Warning_Temperature bit 58,1 -Var=Error_Voltages bit 59,1 -Var=Input_Enable bit 0,1 -Var=Input_ModeDemandActive bit 1,1 -Var=Input_VoltageSetValue unsigned 8,8 /u:Volt /f:0.1 /d:0 -Var=Input_CurrentLimit unsigned 16,8 /u:Ampere -Var=Input_RelayDCDCIsClosed bit 2,1 - diff --git a/CANLibrary/symfiles/MAB_Module_MCU.sym b/CANLibrary/symfiles/MAB_Module_MCU.sym deleted file mode 100644 index fc1af53..0000000 --- a/CANLibrary/symfiles/MAB_Module_MCU.sym +++ /dev/null @@ -1,49 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MicroAutoBox Artega" - -{SENDRECEIVE} - -[Module_MCU] -ID=510h // Status Information of Software Module "Motor Control Unit" -DLC=8 -CycleTime=50 -Mux=Input 0,4 0 -Var=Input_PowerOn bit 4,1 -Var=Input_EnableController bit 5,1 -Var=Input_TorqueDemandLeft signed 8,16 /u:Nm -Var=Input_TorqueDemandRight signed 24,16 /u:Nm - -[Module_MCU] -DLC=7 -Mux=Internal 0,4 1 -Var=TorqueDemandPermittted bit 5,1 -Var=toRelaysPowerOnMCU unsigned 4,1 -Var=ControllerState unsigned 8,8 -Var=toMCU_StateDemand unsigned 16,8 -Var=IsEnabled bit 6,1 -Var=ControllerIsEnabled bit 7,1 -Var=TorqueAvailableMax signed 32,8 /u:Nm /f:2.5 /d:0 -Var=TorqueAvailableMin signed 40,8 /u:Nm /f:2.5 /d:0 -Var=McuStateActual unsigned 24,8 - -[Module_MCU] -DLC=3 -Mux=Errors 0,4 2 -Var=ErrorSpeed unsigned 4,1 /u:bool -Var=ErrorTemp unsigned 5,1 /u:bool -Var=ErrorVoltage unsigned 6,1 /u:bool -Var=ErrorSpeedMotorLeft unsigned 7,1 -Var=ErrorSpeedMotorRight unsigned 8,1 -Var=ErrorLimitTempCapacitorLeft unsigned 9,1 -Var=ErrorLimitTempCapacitorRight unsigned 10,1 -Var=ErrorTempT1Left unsigned 11,1 -Var=ErrorTempT1Right unsigned 12,1 -Var=ErrorTempT2Left unsigned 13,1 -Var=ErrorTempT2Right unsigned 14,1 -Var=ErrorTempT3Left unsigned 15,1 -Var=ErrorTempT3Right unsigned 16,1 -Var=ErrorVoltageDcLink unsigned 17,1 -Var=ErrorCanReceptionTime unsigned 18,1 -Var=ErrorCanMessageCounter unsigned 19,1 -Var=ErrorCan unsigned 20,1 - diff --git a/CANLibrary/symfiles/MAB_Module_RLB.sym b/CANLibrary/symfiles/MAB_Module_RLB.sym deleted file mode 100644 index c09cdde..0000000 --- a/CANLibrary/symfiles/MAB_Module_RLB.sym +++ /dev/null @@ -1,21 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="MicroAutoBox Artega" - -{SENDRECEIVE} - -[Module_RLB] -ID=517h // Debug info for the module "Relay Board". -DLC=2 -CycleTime=50 -Var=AcceleratorIsClosed bit 0,1 -Var=VacuumPumpIsClosed bit 2,1 -Var=MotorsIsClosed bit 3,1 -Var=BmsIsClosed bit 4,1 -Var=TriportIsClosed bit 5,1 -Var=DcdcIsClosed bit 6,1 -Var=ChargerConductiveIsClosed bit 8,1 -Var=CoolingSystemIsClosed bit 7,1 -Var=VacuumSensorIsClosed bit 1,1 -Var=ChargerAuxiliaryPowerIsClosed bit 9,1 -Var=ReverseLightIsClosed bit 10,1 - diff --git a/CANLibrary/symfiles/MAB_Module_VBA.sym b/CANLibrary/symfiles/MAB_Module_VBA.sym deleted file mode 100644 index 7d81184..0000000 --- a/CANLibrary/symfiles/MAB_Module_VBA.sym +++ /dev/null @@ -1,62 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="Adapterboard" - -{SEND} - -[Module_VAB_Relays_and_Lights] -ID=2A3h -DLC=2 -Var=MAB2AB_RelayH2OPumpOn_b bit 7,1 -b -m -Var=MAB2AB_RelayRadiatorFanOn_b bit 6,1 -b -m -Var=MAB2AB_RelayHazardLightOn_b bit 5,1 -b -m -Var=MAB2AB_RelayRadiatorEMotorOn_b bit 4,1 -b -m -Var=MAB2AB_RelayBackLightOn_b bit 3,1 -b -m -Var=MAB2AB_RelayBrakeLightOn_b bit 2,1 -b -m -Var=MAB2AB_RelayExcessCurrentOn_b bit 1,1 -b -m -Var=MAB2AB_LightTempFaultOn_b bit 0,1 -b -m // LED in der Momentanverbrauchsanzeige -Var=MAB2AB_LightChargingOn_b bit 15,1 -b -m -Var=MAB2AB_LightBatDischargedOn_b bit 14,1 -b -m -Var=MAB2AB_LightForwardSpeedOn_b bit 13,1 -b -m -Var=MAB2AB_LightReverseGearOn_b bit 12,1 -b -m -Var=MAB2AB_Light12VBatFaultOn_b bit 11,1 -b -m -Var=MAB2AB_LightELFaultOn_b bit 10,1 -b -m -Var=MAB2AB_LightStopOn_b bit 9,1 -b -m -Var=MAB2AB_LightBatH2OLackOn_b bit 8,1 -b -m - -[MAB_Module_VAB_Displays] -ID=4A1h -DLC=3 -Var=MAB2AB_DisplayResidualEnergy_U8 unsigned 0,8 -m -Var=MAB2AB_DisplayConsumption_U8 unsigned 8,8 -m -Var=MAB2AB_DisplaySpeedometer_kmh unsigned 16,8 -m /u:km/h - -{RECEIVE} - -[Module_VAB_Status] -ID=2A1h -DLC=4 -Var=AB2MAB_BootCheckOkay_b bit 7,1 -b -m -Var=AB2MAB_EmergencyStopInactive_b bit 6,1 -b -m -Var=AB2MAB_ErrorModeS1Inactive_b bit 5,1 -b -m -Var=AB2MAB_ErrorModeS2Inactive_b bit 4,1 -b -m -Var=AB2MAB_ErrorModeS3Inactive_b bit 3,1 -b -m -Var=AB2MAB_OverallCheckOkay_b bit 2,1 -b -m -Var=AB2MAB_ChargingCoverClosed_b bit 15,1 -b -m -Var=AB2MAB_ChargingPlugConnected_b bit 14,1 -b -m -Var=AB2MAB_SwitchRearGearActive_b bit 13,1 -b -m -Var=AB2MAB_SwitchIgnitionIsOn_b bit 12,1 -b -m -Var=AB2MAB_SwitchEngineStartIsOn_b bit 11,1 -b -m -Var=AB2MAB_SensorFootBrakeIsOn_b bit 10,1 -b -m -Var=AB2MAB_SensorHandbrakeIsOn_b bit 9,1 -b -m -Var=AB2MAB_SensorBrakeFluidOkay_b bit 8,1 -b -m -Var=AB2MAB_SensorDriversDoorClosed_b bit 16,1 -b -m -Var=AB2MAB_TemperatureCoolant_C unsigned 22,10 -m /u:°C /f:0.1955034213 /o:-50 /d:0 - -[MAB_Module_VAB_AccPedal] -ID=2A2h // Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.00392157 -DLC=2 -Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.097751710654 - -{VIRTUALVARS} -Var=VV_Schalter_Ladeklappe bit -b - diff --git a/CANLibrary/symfiles/MAB_Module_VBB.sym b/CANLibrary/symfiles/MAB_Module_VBB.sym deleted file mode 100644 index bac9551..0000000 --- a/CANLibrary/symfiles/MAB_Module_VBB.sym +++ /dev/null @@ -1,15 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="Untitled" - -{SENDRECEIVE} - -[MAB_Module_VBB] -ID=516h -DLC=4 -Var=SensorVoltage_internal unsigned 8,8 /u:V /f:0.02 /d:0 -Var=SensorPressure_out unsigned 16,8 /u:bar /f:0.02 -Var=RelayVacuumSensorCloseDemand_out unsigned 0,1 /u:bool -Var=RelayVacuumPumpCloseDemand_out unsigned 1,1 /u:bool -Var=VbbIsEnabled_out unsigned 2,1 /u:bool -Var=PumpControllerState_internal unsigned 24,8 /u:uint8 - diff --git a/CANLibrary/symfiles/MCU.sym b/CANLibrary/symfiles/MCU.sym deleted file mode 100644 index 5dedb06..0000000 --- a/CANLibrary/symfiles/MCU.sym +++ /dev/null @@ -1,227 +0,0 @@ -FormatVersion=5.0 // Do not edit! -Title="Untitled" - -{SEND} - -[Receive_TorqueRequest] -ID=131h // Requested motor torque -DLC=8 -CycleTime=50 -Var=MessageCounter unsigned 0,4 -Var=CRC unsigned 8,8 -Var=TorqueDemand_Left signed 16,16 /u:Nm /f:0.0625 /d:0 -Var=TorqueDemand_Right signed 32,16 /u:Nm /f:0.0625 /d:0 - -[Module_VAB_AccPedal] -ID=2A2h -DLC=2 -Var=AB2MAB_AccPedalPosition unsigned 0,10 -m /f:0.1 - -[Module_VAB_Status] -ID=2A1h -DLC=4 -Var=AB2MAB_TemperatureCoolant_C unsigned 22,10 -m /u:°C /f:0.195503 /o:-50 -Var=AB2MAB_SensorDriversDoorClosed_b unsigned 16,1 -m -Var=AB2MAB_ChargingHatchClosed_b unsigned 15,1 -m -Var=AB2MAB_ChargingPlugConnected_b unsigned 14,1 -m -Var=AB2MAB_SwitchRearGearActive_b unsigned 13,1 -m -Var=AB2MAB_SwitchIgnitionIsOn_b unsigned 12,1 -m -Var=AB2MAB_SwitchEngineStartIsOn_b unsigned 11,1 -m -Var=AB2MAB_SensorFootBrakeIsOff_b unsigned 10,1 -m -Var=AB2MAB_SensorHandbrakeIsOff_b unsigned 9,1 -m -Var=AB2MAB_SensorBrakeFluidOkay_b unsigned 8,1 -m -Var=AB2MAB_BootCheckOkay_b unsigned 7,1 -m -Var=AB2MAB_EmergencyStopInactive_b unsigned 6,1 -m -Var=AB2MAB_ErrorModeS1Inactive_b unsigned 5,1 -m -Var=AB2MAB_ErrorModeS2Inactive_b unsigned 4,1 -m -Var=AB2MAB_ErrorModeS3Inactive_b unsigned 3,1 -m -Var=AB2MAB_OverallCheckOkay_b unsigned 2,1 -m - -{RECEIVE} - -[MCU1_Energy] -ID=334h // Energy related sensor data. -DLC=8 -CycleTime=2 -Var=MCU1_MessageCounter unsigned 0,4 -Var=MCU1_VoltageDCLink unsigned 8,8 /u:V /f:2 -Var=MCU1_Current_Left signed 16,16 /u:A /f:0.0625 /d:0 -Var=MCU1_Current_Right signed 32,16 /u:A /f:0.0625 /d:0 - -[MCU2_Warning] -ID=336h // Warning levels for various values. If possible, there should be an escalation over two levels before an error -DLC=8 -CycleTime=2 -Var=MCU2_MessageCounter unsigned 0,4 -Var=MCU2_Communication unsigned 8,2 -Var=MCU2_TemperatureDCLink unsigned 10,2 -Var=MCU2_VoltageDCLink unsigned 12,2 -Var=MCU2_TemperatureCooler unsigned 14,2 -Var=MCU2_Speed unsigned 16,2 - -[MCU3_TorqueAvailable] -ID=335h // Currently available motor torques for normal and boost operation. -DLC=8 -CycleTime=2 -Var=MCU3_TorqueNormal_Left signed 0,16 /u:Nm /f:0.125 /d:0 -Var=MCU3_TorqueNormal_Right signed 16,16 /u:Nm /f:0.125 /d:0 -Var=MCU3_TorqueBoost_Left signed 32,16 /u:Nm /f:0.125 /d:0 -Var=MCU3_TorqueBoost_Right signed 48,16 /u:Nm /f:0.125 /d:0 - -[MCU4_TorqueActual] -ID=331h // Current actual motor torque values. -DLC=8 -CycleTime=2 -Var=MCU4_MessageCounter unsigned 0,4 -Var=MCU4_TorqueActual_Left signed 8,16 /u:Nm /f:0.0625 /d:0 -Var=MCU4_TorqueActual_Right signed 24,16 /u:Nm /f:0.0625 /d:0 - -[MCU5_Temperature] -ID=533h // Measured temperatures. -DLC=8 -CycleTime=2 -Var=MCU5_TempCapacitorLeft unsigned 0,8 /u:Celsius /o:-50 -Var=MCU5_TempCapacitorRight unsigned 8,8 /u:Celsius /o:-50 -Var=MCU5_TempT1Left unsigned 16,8 /u:Celsius /o:-50 -Var=MCU5_TempT1Right unsigned 24,8 /u:Celsius /o:-50 -Var=MCU5_TempT2Left unsigned 32,8 /u:Celsius /o:-50 -Var=MCU5_TempT2Right unsigned 40,8 /u:Celsius /o:-50 -Var=MCU5_TempT3Left unsigned 48,8 /u:Celsius /o:-50 -Var=MCU5_TempT3Right unsigned 56,8 /u:Celsius /o:-50 - -[MCU6_StateActual] -ID=333h // Current internal states indicators of the MCU firmware. -DLC=8 -CycleTime=2 -Var=MCU6_MessageCounter unsigned 0,4 -Var=MCU6_SysState_Actual unsigned 8,8 -Var=MCU6_CtrlState unsigned 16,8 -Var=MCU6_SysMode unsigned 24,8 -Var=MCU6_SysEmergencyId unsigned 32,8 -Var=MCU6_SysRunModeAtErrorDetection unsigned 40,8 -Var=MCU6_StateRequested unsigned 48,8 -Var=MCU6_StateRequestAck unsigned 56,8 - -[MCU7_MotorSpeed] -ID=337h // Motor speedes. -DLC=8 -CycleTime=2 -Var=MCU7_MessageCounter unsigned 0,4 -Var=MCU7_Speed_Left signed 8,16 /u:rad/s /f:0.0625 /d:0 -Var=MCU7_Speed_Right signed 24,16 /u:rad/s /f:0.0625 /d:0 - -[MCU8_CtrlPar1] -ID=339h // Feedback controller parameters. -DLC=8 -CycleTime=2 -Var=MCU8_MessageCounter unsigned 0,4 -Var=MCU8_TorqueReducedLeft signed 8,16 /f:0.0625 /d:0 -Var=MCU8_TorqueReducedRight signed 24,16 /f:0.0625 /d:0 - -[MCU9_Sense] -ID=535h // Sensor values. -DLC=8 -Var=MCU9_VoltageDcLink signed 0,16 /u:V /f:0.0625 /d:0 - -[MCU10_Diag] -ID=539h // Diagnosis bitmasks. -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_0 0,8 0 -Var=ErrGeneralMsk_MessageCounter unsigned 8,4 -Var=ErrGeneralMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_1 0,8 1 -Var=ErrCtrlMsk_MessageCounter unsigned 8,4 -Var=ErrCtrlMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_2 0,8 2 -Var=ErrAdcMsk_MessageCounter unsigned 8,4 -Var=ErrAdcMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_3 0,8 3 -Var=ErrComMsk_MessageCounter unsigned 8,4 -Var=ErrComMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_4 0,8 4 -Var=WarnGeneralMsk_MessageCounter unsigned 8,4 -Var=WarnGeneralMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_5 0,8 5 -Var=WarnCtrlMsk_MessageCounter unsigned 8,4 -Var=WarnCtrlMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_6 0,8 6 -Var=WarnAdcMsk_MessageCounter unsigned 8,4 -Var=WarnAdcMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_7 0,8 7 -Var=WarnComMsk_MessageCounter unsigned 8,4 -Var=WarnComMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_8 0,8 8 -Var=DiagGeneralMsk_MessageCounter unsigned 8,4 -Var=DiagGeneralMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_9 0,8 9 -Var=DiagCtrlMsk_MessageCounter unsigned 8,4 -Var=DiagCtrlMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_10 0,8 0Ah -Var=DiagAdcMsk_MessageCounter unsigned 8,4 -Var=DiagAdcMsk unsigned 16,32 - -[MCU10_Diag] -DLC=8 -CycleTime=2 -Mux=MCU10_Diag_Mux_11 0,8 0Bh -Var=DiagComMsk_MessageCounter unsigned 8,4 -Var=DiagComMsk unsigned 16,32 - -[VCU_Module_VAB_Displays] -ID=4A1h -DLC=3 -CycleTime=4 -Var=MAB2AB_DisplaySpeedometer_kmh unsigned 16,8 -m /u:km/h -Var=MAB2AB_DisplayConsumption_U8 unsigned 8,8 -m -Var=MAB2AB_DisplayResidualEnergy_U8 unsigned 0,8 -m - -{SENDRECEIVE} - -[Receive_StateRequest] -ID=332h // Requested Motor Controller State -DLC=8 -Var=MessageCounter unsigned 0,4 -Var=CRC unsigned 8,8 -Var=State_Request unsigned 16,8 - From 65b371fc25d2141dbcbb45ff14435bfebf965494 Mon Sep 17 00:00:00 2001 From: Philipp Rauch Date: Tue, 18 Feb 2014 16:48:31 +0100 Subject: [PATCH 12/17] DataFrame and Enum Support for Symfiles * add support for enums in CanSignal and Sym2Lib * add pandas DataFrame support in Sym2Lib * add ID Handler in PCAN * Change return value to Message-Name for the receiveMessage --- .pydevproject | 6 ++-- CANLibrary/CanSignal.py | 23 ++++++++------ CANLibrary/PCan.py | 18 +++++++++-- CANLibrary/Sym2Lib.py | 68 ++++++++++++++++++++++++++++++++++++++--- 4 files changed, 95 insertions(+), 20 deletions(-) diff --git a/.pydevproject b/.pydevproject index 546e447..8e2b33d 100644 --- a/.pydevproject +++ b/.pydevproject @@ -1,8 +1,6 @@ - - - -Default + +python python 2.7 /CANLibrary diff --git a/CANLibrary/CanSignal.py b/CANLibrary/CanSignal.py index 4bdfe10..a98f5e9 100644 --- a/CANLibrary/CanSignal.py +++ b/CANLibrary/CanSignal.py @@ -28,13 +28,15 @@ class CanSignal(object): self.Length = SignalLength self.Offset = SignalOffset self.Scaling = SignalScaling - + self.Label = SignalLabel self.Data = [] - - self.SetData(SignalData) - - + + self.Enum = None + + self.SetData(SignalData) + + def SetData(self, SignalData): ''' Update the data of the Signal. @@ -47,14 +49,17 @@ class CanSignal(object): self.Data = [] for i in range(0, int(self.Length/8)+1): self.Data.append ( (tmpData >> (8*i) ) & 0xff ) - + def GetData(self): ''' ''' tmpData = 0 for i in range(0, int(self.Length/8)+1): tmpData += ( self.Data[i] << (8*i) ) - + tmpData = ( (tmpData * self.Scaling) + self.Offset ) - - return tmpData \ No newline at end of file + + return tmpData + + def SetEnum(self, Enum): + self.Enum = Enum diff --git a/CANLibrary/PCan.py b/CANLibrary/PCan.py index ca81341..4e3c734 100644 --- a/CANLibrary/PCan.py +++ b/CANLibrary/PCan.py @@ -55,6 +55,20 @@ class PcanAdapter(object): self.Messages.update({CanMessage.Label: CanMessage}) + def _getIDs_(self): + _ids_ = {} + for key in self.Messages.keys(): + _ids_.update( { self.Messages[key].Id : key } ) + return _ids_ + + def getMessageName(self, ID): + _ids_ = self._getIDs_() + if ID in _ids_.keys(): + return _ids_[ID] + else: + print 'ERROR: Message ID %s not defined' % ID + return False + def removeMessage(self, CanMessageLabel): try: self.Messages.pop(CanMessageLabel) @@ -139,7 +153,7 @@ class PcanAdapter(object): self.Messages[msgKey].Data[i] = msg.DATA[i] self.Messages[msgKey].decomposeData() self.Messages[msgKey].timestamp = timestamp.micros + 1000 * timestamp.millis + 0xFFFFFFFF * 1000 * timestamp.millis_overflow - return msg.ID + return msgKey elif result == PCANBasic.PCAN_ERROR_QRCVEMPTY and block == False: return None - sleep(0.01) \ No newline at end of file + sleep(0.01) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 0662430..1d35dd2 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -9,13 +9,17 @@ Created on 12.12.2013 ''' from CanMessage import CanMessage from CanSignal import CanSignal +from pandas import DataFrame +from pprint import pprint def readSym(symfile): sym = open(symfile, "r") message = {} tmp = {} + enums = {} ignore = True + enums_bool = False name = "" for line in sym: @@ -35,16 +39,39 @@ def readSym(symfile): if ignore and not line[0] == "{": continue + elif enums_bool and not line[0] == "{": + arg = line.strip() + if arg.find("enum") == 0: + arg = line.split("(") + ident =arg[0].split(" ")[1] + enums[ident] = {} + arg = arg[1] + if ")" in arg: + arg = (arg.split(")"))[0] + tm = arg.split(",") + else: + tm = arg.split(",") + del tm[-1] + for i in range(len(tm)): + tm[i] = tm[i].split("=") + tm[i][0] = int(tm[i][0].strip()) + tm[i][1] = tm[i][1].strip("\"") + for i in tm: + enums[ident][i[0]] = i[1] if line[0] == "{": ignore = False + enums_bool = False modus = line.strip("{} \n") - if modus == "SEND": + if modus == "ENUMS": + enums_bool = True ignore = False + elif modus == "SEND": + ignore = True elif modus == "RECEIVE": ignore = False elif modus == "SENDRECEIVE": - ignore = False + ignore = True elif modus == "VIRTUALVARS": ignore = True @@ -103,6 +130,8 @@ def readSym(symfile): signal["offset"] = int(a[1]) elif a[0] == "/d": signal["data"] = float(a[1]) + elif a[0] == "/e": + signal["enum"] = enums[a[1]] tmp[titel] = signal return message @@ -110,10 +139,15 @@ def readSym(symfile): def Sym2Code(symfile, adapter = "pcan"): mes = readSym(symfile) for i in mes.keys(): + if i == "ENUMS": + print { i : mes[i] } + continue print "%s.addMessage(CanMessage(%s, %s, %s, %s)" % (adapter, hex(mes[i]["ID"]), mes[i]["DLC"], mes[i]["CycleTime"], i) for sig in mes[i]: if isinstance(mes[i].get(sig), dict): print "%s.Messages[%s].addSignal(CanSignal(%s, %s, %s, %s, %s, %s)" % (adapter, i, mes[i][sig]["begin"], mes[i][sig]["length"], mes[i][sig]["offset"], mes[i][sig]["factor"], mes[i][sig]["data"], sig) + if "enum" in mes[i][sig].keys(): + pprint({ "enum" : mes[i][sig]["enum"]}) print "" def Add2Adapter(pcan, symfile): @@ -123,11 +157,14 @@ def Add2Adapter(pcan, symfile): mes = readSym(symfile) print "" for i in mes.keys(): + if i == "ENUMS": + continue pcan.addMessage(CanMessage(mes[i]["ID"], mes[i]["DLC"], mes[i]["CycleTime"], i)) - print "add %s - %s to pcan" % (i, hex(mes[i]["ID"])) + print "add - %s (%s) - to pcan" % (i, hex(mes[i]["ID"])) + signals = [] for sig in mes[i]: if isinstance(mes[i].get(sig), dict): pcan.Messages[i].addSignal(CanSignal(mes[i][sig]["begin"], @@ -136,6 +173,27 @@ def Add2Adapter(pcan, symfile): mes[i][sig]["factor"], mes[i][sig]["data"], sig)) - print "add sig %s to msg %s" % (sig, i) - print "" + if "enum" in mes[i][sig].keys(): + pcan.Messages[i].Signals[sig].SetEnum(mes[i][sig]["enum"]) + signals.append(sig) + print ' signals: %s\n' % ', '.join(signals) return pcan + +def _get_easy_Dict_(mes): + symDict = {} + for i in mes.keys(): + symDict[i] = [] + for sig in mes[i]: + if isinstance(mes[i].get(sig), dict): + symDict[i].append(sig) + return symDict + +def get_DataFrameDict(symfile): + mes = readSym(symfile) + symDict = _get_easy_Dict_(mes) + dfDict = {} + for i in symDict.keys(): + dfDict.update( { i : DataFrame(columns = symDict[i]) } ) + return dfDict + +Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym") From ed55c6c8776d9a4fb81dc21d6c77a50c0901a3d5 Mon Sep 17 00:00:00 2001 From: Christian Sueltrop Date: Fri, 21 Feb 2014 15:31:38 +0100 Subject: [PATCH 13/17] * Commented out functions that use "pandas" library --- .pydevproject | 8 ++++---- CANLibrary/Sym2Lib.py | 16 ++++++++-------- CANLibrary/example.py | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.pydevproject b/.pydevproject index 8e2b33d..2f1c7f7 100644 --- a/.pydevproject +++ b/.pydevproject @@ -1,10 +1,10 @@ -python +Default python 2.7 -/CANLibrary -/CANLibrary/PCANBasic -/CANLibrary/pycrc +/vonPhilipp.git +/vonPhilipp.git/PCANBasic +/vonPhilipp.git/pycrc diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 1d35dd2..03719d1 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -9,7 +9,7 @@ Created on 12.12.2013 ''' from CanMessage import CanMessage from CanSignal import CanSignal -from pandas import DataFrame +#from pandas import DataFrame from pprint import pprint def readSym(symfile): @@ -188,12 +188,12 @@ def _get_easy_Dict_(mes): symDict[i].append(sig) return symDict -def get_DataFrameDict(symfile): - mes = readSym(symfile) - symDict = _get_easy_Dict_(mes) - dfDict = {} - for i in symDict.keys(): - dfDict.update( { i : DataFrame(columns = symDict[i]) } ) - return dfDict +#def get_DataFrameDict(symfile): +# mes = readSym(symfile) +# symDict = _get_easy_Dict_(mes) +# dfDict = {} +# for i in symDict.keys(): +# dfDict.update( { i : DataFrame(columns = symDict[i]) } ) +# return dfDict Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym") diff --git a/CANLibrary/example.py b/CANLibrary/example.py index ad98d90..c6e2f02 100644 --- a/CANLibrary/example.py +++ b/CANLibrary/example.py @@ -9,7 +9,7 @@ Example for creating and sending CAN messages via PCAN using the CanMessage, Can from CanMessage import CanMessage from CanSignal import CanSignal from PCan import PcanAdapter -from Sym2Lib import addtoPCAN, printCode +#from Sym2Lib import addtoPCAN, printCode import time print '\nCreate a PCAN adapter' From 8766ff9d9663473d10c20e6b5311c0d91e99662e Mon Sep 17 00:00:00 2001 From: Christian Sueltrop Date: Fri, 21 Feb 2014 15:37:40 +0100 Subject: [PATCH 14/17] Added at least some comments. --- CANLibrary/Sym2Lib.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 03719d1..49c7bf8 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -9,10 +9,12 @@ Created on 12.12.2013 ''' from CanMessage import CanMessage from CanSignal import CanSignal -#from pandas import DataFrame from pprint import pprint def readSym(symfile): + ''' + Read in a .sym-file created with PEAK PCAN Symbol Editor containing CAN message and signal definitions. + ''' sym = open(symfile, "r") message = {} @@ -136,7 +138,11 @@ def readSym(symfile): tmp[titel] = signal return message -def Sym2Code(symfile, adapter = "pcan"): +def Sym2Code(symfile, adapter): + ''' + Create code for message configuration. + The code created can be used for static message defintions where the .sym-file shall not be included into the project. + ''' mes = readSym(symfile) for i in mes.keys(): if i == "ENUMS": @@ -152,7 +158,7 @@ def Sym2Code(symfile, adapter = "pcan"): def Add2Adapter(pcan, symfile): ''' - + Add message configuration to a pcan adapter instance. ''' mes = readSym(symfile) print "" @@ -188,12 +194,7 @@ def _get_easy_Dict_(mes): symDict[i].append(sig) return symDict -#def get_DataFrameDict(symfile): -# mes = readSym(symfile) -# symDict = _get_easy_Dict_(mes) -# dfDict = {} -# for i in symDict.keys(): -# dfDict.update( { i : DataFrame(columns = symDict[i]) } ) -# return dfDict -Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym") + + +Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym", "pcan") From c4c166ce746e4c81aee0877199999784b72408ad Mon Sep 17 00:00:00 2001 From: Christian Sueltrop Date: Fri, 21 Feb 2014 16:02:26 +0100 Subject: [PATCH 15/17] Bugfixes: * no negative or non-integer offsets where possible * colons were missing in function Sym2Code --- CANLibrary/Sym2Lib.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 49c7bf8..0fef639 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -26,6 +26,7 @@ def readSym(symfile): for line in sym: line = line.split("//")[0].strip() + #print line if line == "": if ignore: @@ -69,11 +70,11 @@ def readSym(symfile): enums_bool = True ignore = False elif modus == "SEND": - ignore = True + ignore = False elif modus == "RECEIVE": ignore = False elif modus == "SENDRECEIVE": - ignore = True + ignore = False elif modus == "VIRTUALVARS": ignore = True @@ -129,7 +130,7 @@ def readSym(symfile): elif a[0] == "/f": signal["factor"] = float(a[1]) elif a[0] == "/o": - signal["offset"] = int(a[1]) + signal["offset"] = float(a[1]) elif a[0] == "/d": signal["data"] = float(a[1]) elif a[0] == "/e": @@ -148,10 +149,10 @@ def Sym2Code(symfile, adapter): if i == "ENUMS": print { i : mes[i] } continue - print "%s.addMessage(CanMessage(%s, %s, %s, %s)" % (adapter, hex(mes[i]["ID"]), mes[i]["DLC"], mes[i]["CycleTime"], i) + print "%s.addMessage(CanMessage(%s, %s, %s, \'%s\')" % (adapter, hex(mes[i]["ID"]), mes[i]["DLC"], mes[i]["CycleTime"], i) for sig in mes[i]: if isinstance(mes[i].get(sig), dict): - print "%s.Messages[%s].addSignal(CanSignal(%s, %s, %s, %s, %s, %s)" % (adapter, i, mes[i][sig]["begin"], mes[i][sig]["length"], mes[i][sig]["offset"], mes[i][sig]["factor"], mes[i][sig]["data"], sig) + print "%s.Messages[\'%s\'].addSignal(CanSignal(%s, %s, %s, %s, %s, \'%s\')" % (adapter, i, mes[i][sig]["begin"], mes[i][sig]["length"], mes[i][sig]["offset"], mes[i][sig]["factor"], mes[i][sig]["data"], sig) if "enum" in mes[i][sig].keys(): pprint({ "enum" : mes[i][sig]["enum"]}) print "" @@ -197,4 +198,4 @@ def _get_easy_Dict_(mes): -Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym", "pcan") +Sym2Code("Test.sym", "pcan") From 950dbb787f1cf951ecae305a275d3334233306e7 Mon Sep 17 00:00:00 2001 From: Christian Sueltrop Date: Fri, 21 Feb 2014 16:26:41 +0100 Subject: [PATCH 16/17] * Enabled "Send" and "Receive" Message types. * Updated the example to also employ Sym2Lib library --- CANLibrary/Sym2Lib.py | 29 +++++++++++++++-------------- CANLibrary/example.py | 11 +++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CANLibrary/Sym2Lib.py b/CANLibrary/Sym2Lib.py index 0fef639..2aae65e 100644 --- a/CANLibrary/Sym2Lib.py +++ b/CANLibrary/Sym2Lib.py @@ -15,14 +15,14 @@ def readSym(symfile): ''' Read in a .sym-file created with PEAK PCAN Symbol Editor containing CAN message and signal definitions. ''' - sym = open(symfile, "r") + sym = open(symfile, "r") # File handle to the .sym-file - message = {} - tmp = {} - enums = {} - ignore = True - enums_bool = False - name = "" + message = {} # Decoded message descriptions + tmp = {} # + enums = {} # + ignore = True # temporary ignore flag for message types + enums_bool = False # + name = "" # for line in sym: line = line.split("//")[0].strip() @@ -68,15 +68,15 @@ def readSym(symfile): modus = line.strip("{} \n") if modus == "ENUMS": enums_bool = True - ignore = False - elif modus == "SEND": - ignore = False + ignore = False # do not ignore ENUM definitions + elif modus == "SEND": + ignore = False # do not ignore SEND type message definitions elif modus == "RECEIVE": - ignore = False + ignore = False # do not ignore RECEIVE type message definitions elif modus == "SENDRECEIVE": - ignore = False + ignore = False # do not ignore SENDRECEIVE type message definitions elif modus == "VIRTUALVARS": - ignore = True + ignore = True # ignore VIRTUALVARS definitions elif line[0] == "[": name = line.strip("[] \n") @@ -170,7 +170,8 @@ def Add2Adapter(pcan, symfile): mes[i]["DLC"], mes[i]["CycleTime"], i)) - print "add - %s (%s) - to pcan" % (i, hex(mes[i]["ID"])) + + print "adding message to pcan: ID \'%s\', Name \'%s\'" % (hex(mes[i]["ID"]), i) signals = [] for sig in mes[i]: if isinstance(mes[i].get(sig), dict): diff --git a/CANLibrary/example.py b/CANLibrary/example.py index c6e2f02..91a9dfa 100644 --- a/CANLibrary/example.py +++ b/CANLibrary/example.py @@ -10,6 +10,7 @@ from CanMessage import CanMessage from CanSignal import CanSignal from PCan import PcanAdapter #from Sym2Lib import addtoPCAN, printCode +from Sym2Lib import Add2Adapter import time print '\nCreate a PCAN adapter' @@ -59,6 +60,16 @@ pcan.Messages['mMotor_2'].composeData() print 'mMotor_2.Data', pcan.Messages['mMotor_2'].Data pcan.sendMessage(pcan.Messages['mMotor_2']) +# Test Sym2Lib +Add2Adapter(pcan, "Test.sym") + +pcan.Messages['Test'].Signals['Var1'].SetData( 30 ) +pcan.Messages['Test'].composeData() + +pcan.sendMessage(pcan.Messages['Test']) + + + # receive messages, if the signal MO1_Drehzahl has changed, print the new value while True: #print 'send' From 1021694998128427d682682c8d48e0e1ddffd52b Mon Sep 17 00:00:00 2001 From: Christian Sueltrop Date: Fri, 21 Feb 2014 17:00:40 +0100 Subject: [PATCH 17/17] Added test .sym-file to the repository. --- CANLibrary/Test.sym | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CANLibrary/Test.sym diff --git a/CANLibrary/Test.sym b/CANLibrary/Test.sym new file mode 100644 index 0000000..a0e346d --- /dev/null +++ b/CANLibrary/Test.sym @@ -0,0 +1,13 @@ +FormatVersion=5.0 // Do not edit! +Title="Test" + +{SEND} + +[Test] +ID=123h +DLC=8 +CycleTime=100 +Var=Var1 unsigned 0,8 /u:Volt /f:2 +Var=Var2 signed 8,21 /u:Ampere +Var=Var4 float 32,32 +