-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvirtualbms.sh
111 lines (86 loc) · 2.05 KB
/
virtualbms.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
# /data/dbus-virtualbms/virtualbms.sh
SoC=50
# Set up vitual CANBus Interface:
if [ ! -d "/proc/sys/net/ipv4/conf/vcan0" ]; then
/sbin/modprobe vcan
/sbin/ip link add dev vcan0 type vcan
/sbin/ip link set up vcan0
fi
# Config file with BMS Settings
sysconfdir="/data/dbus-virtualbms"
if test -f ${sysconfdir}/config.ini ; then
. ${sysconfdir}/config.ini
else
echo "Error: Config file config.ini does not exist."
exit 1
fi
REPLACE_BYTES () {
LEFT=`echo $DATA|cut -b0-$FIRST`
RIGHT=`echo $DATA|cut -b$LAST-`
DATEN=$LEFT$VALUE$RIGHT
}
DEC2HEX () {
HEX=`printf '%x\n' $DEC_VALUE`
ANZAHL=`echo $HEX|wc -L`
if [ $ANZAHL = 1 ]; then
LINKS=`echo 00`
RECHTS=`echo $HEX|cut -b1-2`
HEX_VALUE=`echo "0$RECHTS""$LINKS"`
fi
if [ $ANZAHL = 2 ]; then
LINKS=`echo 00`
RECHTS=`echo $HEX|cut -b1-2`
HEX_VALUE=`echo "$RECHTS""$LINKS"`
fi
if [ $ANZAHL = 3 ]; then
RECHTS=`echo $HEX|cut -b2-3`
LINKS=`echo $HEX|cut -b1`
HEX_VALUE=`echo "$RECHTS"0"$LINKS"`
fi
if [ $ANZAHL = 4 ]; then
RECHTS=`echo $HEX|cut -b3-4`
LINKS=`echo $HEX|cut -b1-2`
HEX_VALUE=`echo "$RECHTS""$LINKS"`
fi
}
#Dump the present CAN-Interface
candump $INTERFACE|
while read line
do
# Prepare data from config.ini file
. ${sysconfdir}/config.ini
DEC_VALUE=$MAX_VOLTAGE
DEC2HEX
VOLTAGE=$HEX_VALUE
DEC_VALUE=$UPPER_CURRENT
DEC2HEX
CURRENT=$HEX_VALUE
# Save data from Stream and inject new setpoints
# Save CANBUS ID
ID=`echo $line|cut -b6-8`
# Save CANBUS Data
DATEN=`echo $line|cut -b5-|tr -d " "|sed 's/\[8\]/#/g'`
# SoC auslesen und ggf reagieren
if [ $ID = 355 ]; then
SoC=$((16#`echo $line|cut -b14-15`))
fi
if [ $ID = 351 ]; then
VALUE=$VOLTAGE
DATA=$DATEN
FIRST=4
LAST=9
REPLACE_BYTES
if [ $SoC -ge $SOC_DEGRADE_LIMIT ]; then
VALUE=$CURRENT
DATA=$DATEN
FIRST=8
LAST=13
REPLACE_BYTES
fi
cansend vcan0 $DATEN
else
# Send unchanged data which does not match our CANBUS ID 351
cansend vcan0 $DATEN
fi
done