
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1330__canpy/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1330__canpy/transport.py |
# -*- coding: utf-8 -*-
import os
import re
import sys
import time
import random
#************************************************************************
class CAN (object):
def __init__ (self,communication_matrix={}):
"""
The communication matrix is a dictionary which maps message id s
to lists of signals, example:
{ "7a3": "SIGNAL_A,7,SIGNAL_B,1,SIGNAL_C,17",
"e41": "SIGNAL_D,3,SIGNAL_E,1",
....
}
Sending of Signals then shall be translated into a list of messages
"""
self.signals = 1
#communication_matrix
self.communication_matrix = communication_matrix
#***#*********************************************************************
def open_canusb(self,serial_port,can_speed):
"""
Opens the CAN Port via a CANUSB-Device
"""
try:
can_speed = { "10" : 0,
"20" : 1,
"50" : 2,
"100" : 3,
"125" : 4,
"250" : 5,
"500" : 6,
"800" : 7,
"1000" : 8 }[str(can_speed)]
except:
pass
self.port = serial_port
self.port.write("O\r") # open the can port
self.port.write("S"+str(can_speed)+"\r") # open the can port
#*************************************************************************
def msg_to_sig (self,msg):
"""
Transforms a message into a dicitionary of consisting signals
which point to their values.
"""
# "t123e34f123"
#msg = msg.split(",")
message_id = msg[1:4]
#message_id = msg[1:4]
message_len = msg[4]
data_field = eval("0x" + msg[5:]) # generates an int example: 0xe3f123
data_field = format(data_field,"0"+str(int(message_len)*8)+"b") # transforms it to a string of the form 0b1010010101001.....
# print "data field after binary conversion:",data_field
#exit()
sig_message = self.communication_matrix[message_id].split(",")
result = {}
zaehler = 0
while (0 == 0):
try:
signal_bez = sig_message[zaehler]
signal_len = int(sig_message[zaehler+1])
except:
break
# print signal_bez
# print signal_len
#exit()
signal_val = data_field[0:signal_len] # extract the leading bits for the content of the signal value "1011010[0:3] -> 101, 1010
data_field = data_field[signal_len:] # remove that bits in the data_field
signal_val = eval("0b" + signal_val) # interpret the signal_val as a number in binary format
#exit()
if signal_val > 0:
result[signal_bez] = signal_val
# print "result:", result
#exit()
zaehler = zaehler + 2
return(result)
#*************************************************************************
def sig_to_msg (self,signals):
"""
Takes a dictionary of signals to be transmitted and translates it
into one or more messages so that all signals are contained.
"""
messages = []
for sig_message_key in self.communication_matrix.keys(): # run the entire communication matrix
sig_message = self.communication_matrix[sig_message_key].split(",")
data_field = ""
zaehler = 0
sig_message_needed = False
while (0 == 0):
try:
signal_bez = sig_message[zaehler]
signal_len =sig_message[zaehler+1]
except:
break
signal_val = 0 # default value
if signal_bez in signals:
signal_val = signals[signal_bez] # read out the overhanded signal value given from the origary signal dict
sig_message_needed = True # this sig_message is needed because a signal in it has to be transmitted
signal_val = format(signal_val,"0"+signal_len+"b") # transforms it to a string of the form 0b1010010101001.....
data_field = data_field + signal_val
zaehler = zaehler + 2
else:
signal_val = 0 # read out the overhanded signal value given from the origary signal dict
signal_val = format(signal_val,"0"+signal_len+"b") # transforms it to a string of the form 0b1010010101001.....
data_field = data_field + signal_val
zaehler = zaehler + 2 # added code
if not sig_message_needed:
continue
data_field = data_field + "0000000" # padding the datafield with 0 to make string of data bits multiple of 8
data_len = int(len(data_field)/8)*8 # data length in number of bits
data_field = data_field[0:data_len] # cut to a multple of 8 - so now we have a list of bytes
data_field = int(data_field,2)
data_field = hex(data_field) # convert it to hex
data_field = data_field[2:] # strp off '0x'
# print "data field :", data_field
#exit()
#print "signal message key:", sig_message_key
#print "data length", str(data_len)
#print "data field", data_field
messages.append("t"+sig_message_key+str(data_len/8)+data_field)
return(messages)
#****************************************************************
# Test Modes:
def t_make_communication_matrix (self,msgcount=10):
self.communication_matrix = {}
rand = random.Random()
zaehler = 0
while zaehler < msgcount:
msg_signals = ""
msg_bits = 0
msg_bytes = rand.randint(1,8)
msg_name = "%03x" % rand.randint(1,2047)
while (0 == 0):
signal_name = rand.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
zaehler1 = 0
zaehlmax = rand.randint(3,7)
while (zaehler1 < zaehlmax):
signal_name = signal_name + rand.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789______")
zaehler1 = zaehler1 + 1
signal_len = rand.choice([1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,28,19,20])
msg_bits = msg_bits + signal_len
if msg_bits > msg_bytes * 8:
break
msg_signals = msg_signals + "," + signal_name + "," + str(signal_len)
if not msg_signals == "":
self.communication_matrix[msg_name] = msg_signals[1:]
zaehler = zaehler + 1
#****************************************************************
def t_get_signals (self):
signal_list = {}
for msg in self.communication_matrix.keys():
sig_str = self.communication_matrix[msg].split(",")
zaehler = 0
while (0 == 0):
try:
signal_list[sig_str[zaehler]] = sig_str[zaehler+1]
except:
break
zaehler = zaehler + 2
return(signal_list)