openarm_can/setup/set_zero.sh

163 lines
4.2 KiB
Bash
Raw Permalink Normal View History

2025-07-22 06:15:21 +00:00
#!/bin/bash
#
# Copyright 2025 Enactic, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -eu
2025-07-22 06:15:21 +00:00
# CAN Interface Script
# Usage: setup/set_zero.sh <CAN_IF> [CAN_ID] [--all]
2025-07-22 06:15:21 +00:00
# Function to display usage
usage() {
echo "Usage: $0 <CAN_IF> [CAN_ID] [--all]"
2025-07-22 06:15:21 +00:00
echo " CAN_IF: CAN interface name (e.g., can0)"
echo " CAN_ID: CAN ID in hex format (e.g., 00x) - not needed with --all"
echo " --all: Send to all IDs from 001 to 008"
2025-07-22 06:15:21 +00:00
echo ""
echo "Examples:"
echo " $0 can0 001"
echo " $0 can0 --all"
2025-07-22 06:15:21 +00:00
exit 1
}
# Function to check if CAN interface is up and get baudrate
check_can_interface() {
local interface=$1
# Check if interface exists and is up
if ! ip link show "$interface" &>/dev/null; then
echo "Error: CAN interface $interface does not exist"
return 1
fi
# Check if interface is up
local state
state=$(ip link show "$interface" | grep -o "state [A-Z]*" | cut -d' ' -f2)
2025-07-22 06:15:21 +00:00
if [ "$state" != "UP" ]; then
echo "Error: CAN interface $interface is not UP (current state: $state)"
return 1
fi
echo "CAN interface $interface is UP"
# Try to get baudrate information
if command -v ethtool &>/dev/null; then
local baudrate
baudrate=$(ethtool "$interface" 2>/dev/null | grep -i speed | cut -d: -f2 | tr -d ' ')
2025-07-22 06:15:21 +00:00
if [ -n "$baudrate" ]; then
echo "Baudrate: $baudrate"
fi
fi
# Alternative method using ip command
local bitrate
bitrate=$(ip -details link show "$interface" 2>/dev/null | grep -o "bitrate [0-9]*" | cut -d' ' -f2)
2025-07-22 06:15:21 +00:00
if [ -n "$bitrate" ]; then
echo "Bitrate: ${bitrate} bps"
fi
return 0
}
# Function to send CAN messages for a single ID
send_can_messages() {
local CAN_ID=$1
local CAN_IF=$2
echo "Sending CAN messages for ID: $CAN_ID on interface: $CAN_IF"
# Send first disablemessage
echo "Sending: cansend $CAN_IF ${CAN_ID}#FFFFFFFFFFFFFFFD"
cansend "$CAN_IF" "${CAN_ID}#FFFFFFFFFFFFFFFD"
sleep 0.1
# Send second set zero message
echo "Sending: cansend $CAN_IF ${CAN_ID}#FFFFFFFFFFFFFFFE"
cansend "$CAN_IF" "${CAN_ID}#FFFFFFFFFFFFFFFE"
sleep 0.1
# Send third disable message
echo "Sending: cansend $CAN_IF ${CAN_ID}#FFFFFFFFFFFFFFFD"
cansend "$CAN_IF" "${CAN_ID}#FFFFFFFFFFFFFFFD"
sleep 0.1
echo "Messages sent for ID: $CAN_ID"
echo ""
}
# Main script logic
main() {
# Check for minimum arguments
if [ $# -lt 1 ]; then
usage
fi
local CAN_IF=$1
local CAN_ID=""
local all_flag=false
# Check for --all flag
if [ "$2" = "--all" ]; then
2025-07-22 06:15:21 +00:00
all_flag=true
else
CAN_ID=$2
fi
# Validate CAN_IF
if [ -z "$CAN_IF" ]; then
usage
fi
# Validate CAN_ID only if --all flag is not set
2025-07-22 06:15:21 +00:00
if [ "$all_flag" = false ] && [ -z "$CAN_ID" ]; then
echo "Error: CAN_ID is required when -all flag is not used"
usage
fi
# Check if cansend command is available
if ! command -v cansend &>/dev/null; then
echo "Error: cansend command not found. Please install can-utils package."
exit 1
fi
# Check CAN interface status
if ! check_can_interface "$CAN_IF"; then
exit 1
fi
echo ""
# Execute based on flags
if [ "$all_flag" = true ]; then
echo "Sending set zero messages to all motor with CAN IDs from 001 to 008"
echo "=========================================="
2026-03-26 06:30:43 +00:00
for i in {1..9}; do
local padded_id
padded_id=$(printf "%03d" "$i")
2025-07-22 06:15:21 +00:00
send_can_messages "$padded_id" "$CAN_IF"
done
else
send_can_messages "$CAN_ID" "$CAN_IF"
fi
echo "Set zero completed."
}
# Run main function with all arguments
main "$@"