Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 #!/bin/bash
RuslanUrya 0:dfe6edabb8ec 2 #
RuslanUrya 0:dfe6edabb8ec 3 # Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@zubax.com>
RuslanUrya 0:dfe6edabb8ec 4 #
RuslanUrya 0:dfe6edabb8ec 5
RuslanUrya 0:dfe6edabb8ec 6 HELP="Register slcan-enabled Serial-to-CAN adapters as network interfaces.
RuslanUrya 0:dfe6edabb8ec 7 Usage:
RuslanUrya 0:dfe6edabb8ec 8 `basename $0` [options] <tty0> [[options] <tty1> ...]
RuslanUrya 0:dfe6edabb8ec 9
RuslanUrya 0:dfe6edabb8ec 10 Interface indexes will be assigned automatically in ascending order, i.e.
RuslanUrya 0:dfe6edabb8ec 11 first device will be mapped to the interface slcan0, second will be mapped to
RuslanUrya 0:dfe6edabb8ec 12 slcan1, and so on. Each added option affects only the interfaces that follow
RuslanUrya 0:dfe6edabb8ec 13 it, which means that options must be properly ordered (see examples below).
RuslanUrya 0:dfe6edabb8ec 14 This tool requires superuser priveleges.
RuslanUrya 0:dfe6edabb8ec 15
RuslanUrya 0:dfe6edabb8ec 16 The package 'can-utils' must be installed. On Debian/Ubuntu-based systems it
RuslanUrya 0:dfe6edabb8ec 17 can be installed via APT: apt-get install can-utils
RuslanUrya 0:dfe6edabb8ec 18
RuslanUrya 0:dfe6edabb8ec 19 Options:
RuslanUrya 0:dfe6edabb8ec 20 --speed-code <X> (where X is a number in range [0, 8]; default: 8)
RuslanUrya 0:dfe6edabb8ec 21 -s<X>
RuslanUrya 0:dfe6edabb8ec 22 Set CAN speed to:
RuslanUrya 0:dfe6edabb8ec 23 0 - 10 Kbps
RuslanUrya 0:dfe6edabb8ec 24 1 - 20 Kbps
RuslanUrya 0:dfe6edabb8ec 25 2 - 50 Kbps
RuslanUrya 0:dfe6edabb8ec 26 3 - 100 Kbps
RuslanUrya 0:dfe6edabb8ec 27 4 - 125 Kbps (UAVCAN recommended)
RuslanUrya 0:dfe6edabb8ec 28 5 - 250 Kbps (UAVCAN recommended)
RuslanUrya 0:dfe6edabb8ec 29 6 - 500 Kbps (UAVCAN recommended)
RuslanUrya 0:dfe6edabb8ec 30 7 - 800 Kbps
RuslanUrya 0:dfe6edabb8ec 31 8 - 1 Mbps (UAVCAN recommended, default)
RuslanUrya 0:dfe6edabb8ec 32
RuslanUrya 0:dfe6edabb8ec 33 --remove-all
RuslanUrya 0:dfe6edabb8ec 34 -r
RuslanUrya 0:dfe6edabb8ec 35 Remove all SLCAN interfaces.
RuslanUrya 0:dfe6edabb8ec 36 If this option is used, it MUST be provided FIRST, otherwise it
RuslanUrya 0:dfe6edabb8ec 37 will remove the interfaces added earlier.
RuslanUrya 0:dfe6edabb8ec 38
RuslanUrya 0:dfe6edabb8ec 39 --basename <X> (where X is a string containing [a-z], default: slcan)
RuslanUrya 0:dfe6edabb8ec 40 -b<X>
RuslanUrya 0:dfe6edabb8ec 41 Base name to use for the interfaces that follow this option.
RuslanUrya 0:dfe6edabb8ec 42 Default value is 'slcan'. This option can be provided multiple times,
RuslanUrya 0:dfe6edabb8ec 43 it will only affect the interfaces that were provided after it. If you
RuslanUrya 0:dfe6edabb8ec 44 want to affect all added interfaces, provide this option first (see
RuslanUrya 0:dfe6edabb8ec 45 examples below).
RuslanUrya 0:dfe6edabb8ec 46
RuslanUrya 0:dfe6edabb8ec 47 --baudrate <X> (where X is an integer, default: 921600)
RuslanUrya 0:dfe6edabb8ec 48 -S<X>
RuslanUrya 0:dfe6edabb8ec 49 Configure baud rate to use on the interface.
RuslanUrya 0:dfe6edabb8ec 50 This option is mostly irrelevant for USB to CAN adapters.
RuslanUrya 0:dfe6edabb8ec 51
RuslanUrya 0:dfe6edabb8ec 52 Example 1:
RuslanUrya 0:dfe6edabb8ec 53 `basename $0` --remove-all /dev/ttyUSB3 --basename can --baudrate 115200 \\
RuslanUrya 0:dfe6edabb8ec 54 /dev/ttyUSB0 --speed-code 4 /dev/ttyACM0
RuslanUrya 0:dfe6edabb8ec 55 The example above initializes the interfaces as follows:
RuslanUrya 0:dfe6edabb8ec 56 /dev/ttyUSB3 --> slcan0 1 Mbps baudrate 921600
RuslanUrya 0:dfe6edabb8ec 57 /dev/ttyUSB0 --> can0 1 Mbps baudrate 115200
RuslanUrya 0:dfe6edabb8ec 58 /dev/ttyACM0 --> can1 125 kbps baudrate 115200
RuslanUrya 0:dfe6edabb8ec 59
RuslanUrya 0:dfe6edabb8ec 60 Example 2:
RuslanUrya 0:dfe6edabb8ec 61 `basename $0` --remove-all
RuslanUrya 0:dfe6edabb8ec 62 The example above only removes all SLCAN interfaces without adding new ones."
RuslanUrya 0:dfe6edabb8ec 63
RuslanUrya 0:dfe6edabb8ec 64 function die() { echo $@ >&2; exit 1; }
RuslanUrya 0:dfe6edabb8ec 65
RuslanUrya 0:dfe6edabb8ec 66 if [ "$1" == '--help' ] || [ "$1" == '-h' ]; then echo "$HELP"; exit; fi
RuslanUrya 0:dfe6edabb8ec 67
RuslanUrya 0:dfe6edabb8ec 68 [ -n "$1" ] || die "Invalid usage. Use --help to get help."
RuslanUrya 0:dfe6edabb8ec 69
RuslanUrya 0:dfe6edabb8ec 70 [ "$(id -u)" == "0" ] || die "Must be root."
RuslanUrya 0:dfe6edabb8ec 71
RuslanUrya 0:dfe6edabb8ec 72 which slcan_attach > /dev/null || die "Please install can-utils first."
RuslanUrya 0:dfe6edabb8ec 73
RuslanUrya 0:dfe6edabb8ec 74 # ---------------------------------------------------------
RuslanUrya 0:dfe6edabb8ec 75
RuslanUrya 0:dfe6edabb8ec 76 function deinitialize() {
RuslanUrya 0:dfe6edabb8ec 77 echo "Stopping slcand..." >&2
RuslanUrya 0:dfe6edabb8ec 78 # Trying SIGINT first
RuslanUrya 0:dfe6edabb8ec 79 killall -INT slcand &> /dev/null
RuslanUrya 0:dfe6edabb8ec 80 sleep 0.3
RuslanUrya 0:dfe6edabb8ec 81 # Then trying the default signal, which is SIGTERM, if SIGINT didn't help
RuslanUrya 0:dfe6edabb8ec 82 slcand_kill_retries=10
RuslanUrya 0:dfe6edabb8ec 83 while killall slcand &> /dev/null
RuslanUrya 0:dfe6edabb8ec 84 do
RuslanUrya 0:dfe6edabb8ec 85 (( slcand_kill_retries -= 1 ))
RuslanUrya 0:dfe6edabb8ec 86 [[ "$slcand_kill_retries" > 0 ]] || die "Failed to stop slcand"
RuslanUrya 0:dfe6edabb8ec 87 sleep 1
RuslanUrya 0:dfe6edabb8ec 88 done
RuslanUrya 0:dfe6edabb8ec 89 }
RuslanUrya 0:dfe6edabb8ec 90
RuslanUrya 0:dfe6edabb8ec 91 function handle_tty() {
RuslanUrya 0:dfe6edabb8ec 92 tty=$(readlink -f $1)
RuslanUrya 0:dfe6edabb8ec 93 tty=${tty/'/dev/'}
RuslanUrya 0:dfe6edabb8ec 94
RuslanUrya 0:dfe6edabb8ec 95 iface_index=0
RuslanUrya 0:dfe6edabb8ec 96 while ifconfig "$IFACE_BASENAME$iface_index" &> /dev/null
RuslanUrya 0:dfe6edabb8ec 97 do
RuslanUrya 0:dfe6edabb8ec 98 iface_index=$((iface_index + 1))
RuslanUrya 0:dfe6edabb8ec 99 done
RuslanUrya 0:dfe6edabb8ec 100
RuslanUrya 0:dfe6edabb8ec 101 slcan_iface_index=0
RuslanUrya 0:dfe6edabb8ec 102 while ifconfig "slcan$slcan_iface_index" &> /dev/null
RuslanUrya 0:dfe6edabb8ec 103 do
RuslanUrya 0:dfe6edabb8ec 104 slcan_iface_index=$((slcan_iface_index + 1))
RuslanUrya 0:dfe6edabb8ec 105 done
RuslanUrya 0:dfe6edabb8ec 106
RuslanUrya 0:dfe6edabb8ec 107 iface="$IFACE_BASENAME$iface_index"
RuslanUrya 0:dfe6edabb8ec 108 slcan_iface="slcan$slcan_iface_index"
RuslanUrya 0:dfe6edabb8ec 109
RuslanUrya 0:dfe6edabb8ec 110 echo "Attaching $tty to $iface speed code $SPEED_CODE baudrate $BAUDRATE" >&2
RuslanUrya 0:dfe6edabb8ec 111
RuslanUrya 0:dfe6edabb8ec 112 # Configuring the baudrate
RuslanUrya 0:dfe6edabb8ec 113 stty -F /dev/$tty ispeed $BAUDRATE ospeed $BAUDRATE || return 1
RuslanUrya 0:dfe6edabb8ec 114
RuslanUrya 0:dfe6edabb8ec 115 # Attaching the line discipline. Note that slcan_attach has option -n but it doesn't work.
RuslanUrya 0:dfe6edabb8ec 116 slcan_attach -f -o -s$SPEED_CODE /dev/$tty > /dev/null || return 2
RuslanUrya 0:dfe6edabb8ec 117 slcand $tty || return 3
RuslanUrya 0:dfe6edabb8ec 118 sleep 1 # FIXME
RuslanUrya 0:dfe6edabb8ec 119
RuslanUrya 0:dfe6edabb8ec 120 # ...therefore we need to rename the interface manually
RuslanUrya 0:dfe6edabb8ec 121 ip link set $slcan_iface name $iface
RuslanUrya 0:dfe6edabb8ec 122
RuslanUrya 0:dfe6edabb8ec 123 ifconfig $iface up || return 4
RuslanUrya 0:dfe6edabb8ec 124 }
RuslanUrya 0:dfe6edabb8ec 125
RuslanUrya 0:dfe6edabb8ec 126 IFACE_BASENAME='slcan'
RuslanUrya 0:dfe6edabb8ec 127 SPEED_CODE=8
RuslanUrya 0:dfe6edabb8ec 128 BAUDRATE=921600
RuslanUrya 0:dfe6edabb8ec 129
RuslanUrya 0:dfe6edabb8ec 130 next_option=''
RuslanUrya 0:dfe6edabb8ec 131 while [ -n "$1" ]; do
RuslanUrya 0:dfe6edabb8ec 132 case $1 in
RuslanUrya 0:dfe6edabb8ec 133 -r | --remove-all)
RuslanUrya 0:dfe6edabb8ec 134 deinitialize
RuslanUrya 0:dfe6edabb8ec 135 ;;
RuslanUrya 0:dfe6edabb8ec 136
RuslanUrya 0:dfe6edabb8ec 137 -b*)
RuslanUrya 0:dfe6edabb8ec 138 IFACE_BASENAME=${1:2}
RuslanUrya 0:dfe6edabb8ec 139 ;;
RuslanUrya 0:dfe6edabb8ec 140
RuslanUrya 0:dfe6edabb8ec 141 -S*)
RuslanUrya 0:dfe6edabb8ec 142 BAUDRATE=${1:2}
RuslanUrya 0:dfe6edabb8ec 143 ;;
RuslanUrya 0:dfe6edabb8ec 144
RuslanUrya 0:dfe6edabb8ec 145 -s[0-8])
RuslanUrya 0:dfe6edabb8ec 146 SPEED_CODE=${1:2}
RuslanUrya 0:dfe6edabb8ec 147 ;;
RuslanUrya 0:dfe6edabb8ec 148
RuslanUrya 0:dfe6edabb8ec 149 --*)
RuslanUrya 0:dfe6edabb8ec 150 next_option=${1:2}
RuslanUrya 0:dfe6edabb8ec 151 ;;
RuslanUrya 0:dfe6edabb8ec 152
RuslanUrya 0:dfe6edabb8ec 153 -*)
RuslanUrya 0:dfe6edabb8ec 154 die "Invalid option: $1"
RuslanUrya 0:dfe6edabb8ec 155 ;;
RuslanUrya 0:dfe6edabb8ec 156
RuslanUrya 0:dfe6edabb8ec 157 *)
RuslanUrya 0:dfe6edabb8ec 158 if [ "$next_option" = 'basename' ]; then IFACE_BASENAME=$1
RuslanUrya 0:dfe6edabb8ec 159 elif [ "$next_option" = 'speed-code' ]; then SPEED_CODE=$1
RuslanUrya 0:dfe6edabb8ec 160 elif [ "$next_option" = 'baudrate' ]; then BAUDRATE=$1
RuslanUrya 0:dfe6edabb8ec 161 elif [ "$next_option" = '' ]
RuslanUrya 0:dfe6edabb8ec 162 then
RuslanUrya 0:dfe6edabb8ec 163 handle_tty $1 || die "Failed to configure the interface $1"
RuslanUrya 0:dfe6edabb8ec 164 else
RuslanUrya 0:dfe6edabb8ec 165 die "Invalid option '$next_option'"
RuslanUrya 0:dfe6edabb8ec 166 fi
RuslanUrya 0:dfe6edabb8ec 167 next_option=''
RuslanUrya 0:dfe6edabb8ec 168 ;;
RuslanUrya 0:dfe6edabb8ec 169 esac
RuslanUrya 0:dfe6edabb8ec 170 shift
RuslanUrya 0:dfe6edabb8ec 171 done
RuslanUrya 0:dfe6edabb8ec 172
RuslanUrya 0:dfe6edabb8ec 173 [ "$next_option" = '' ] || die "Expected argument for option '$next_option'"