#!/bin/sh
|
|
# -------------------------- 核心配置参数 --------------------------
|
CONFIG_FILE="/work/config.json" # 网口配置文件路径
|
SYS_CONFIG_FILE="/work/sysConfig.json" # 系统配置文件路径
|
SEND_CMD="/home/test/SendToM4" # 发送命令路径
|
IMAGE_SWITCH_INTERVAL=0.15 # 图片切换间隔(秒)
|
TEXT_SCENE_INTERVAL=10 # 文本场景切换间隔(秒)
|
TOTAL_IMAGE_IDS=3 # 图片ID:0、1、2循环
|
TOTAL_TEXT_SCENES=3 # 文本场景:0、1、2循环
|
REMOTEPROC_STATE_PATH="/sys/class/remoteproc/remoteproc0/state" # 显示程序状态路径
|
# ------------------------------------------------------------------
|
|
# 应用指定的中文十六进制编码
|
HEX_SYSTEM_RUN_TIME="CFB5CDB3D4CBD0D0CAB1BCE4" # “系统运行时间”
|
HEX_DAY="CCEC" # “天”
|
HEX_HOUR="D0A1CAB1" # “小时”
|
HEX_SPACE="20" # 空格的十六进制
|
# ------------------------------------------------------------------
|
|
# 1. 检查并启动显示程序
|
check_and_start_display() {
|
# 检查状态文件是否存在
|
if [ ! -f "$REMOTEPROC_STATE_PATH" ]; then
|
echo "【错误】显示程序状态文件 $REMOTEPROC_STATE_PATH 不存在"
|
exit 1
|
fi
|
|
# 读取当前状态
|
local state=$(cat "$REMOTEPROC_STATE_PATH" | tr -d '[:space:]') # 去除空格和换行
|
echo "【显示程序状态】当前状态: $state"
|
|
# 根据状态执行操作
|
if [ "$state" = "offline" ]; then
|
echo "【显示程序】未启用,尝试启动..."
|
# 执行启动命令
|
if ! echo "start" > "$REMOTEPROC_STATE_PATH"; then
|
echo "【错误】启动显示程序失败,请检查权限或设备状态"
|
exit 1
|
fi
|
|
# 等待启动完成(最多等待5秒)
|
local wait_count=0
|
while [ $wait_count -lt 5 ]; do
|
sleep 1
|
state=$(cat "$REMOTEPROC_STATE_PATH" | tr -d '[:space:]')
|
if [ "$state" = "running" ]; then
|
echo "【显示程序】启动成功"
|
return 0
|
fi
|
wait_count=$((wait_count + 1))
|
done
|
|
# 超时检查
|
if [ "$state" != "running" ]; then
|
echo "【错误】显示程序启动超时,当前状态: $state"
|
exit 1
|
fi
|
|
elif [ "$state" = "running" ]; then
|
echo "【显示程序】已启动,无需操作"
|
return 0
|
|
else
|
echo "【错误】显示程序处于未知状态: $state"
|
exit 1
|
fi
|
}
|
|
# 2. 依赖检查
|
check_dependencies() {
|
if ! command -v jsoner >/dev/null 2>&1; then
|
echo "【错误】未找到 jsoner 命令,请安装并配置到PATH"
|
exit 1
|
fi
|
|
if [ ! -f "$CONFIG_FILE" ]; then
|
echo "【错误】网口配置文件 $CONFIG_FILE 不存在"
|
exit 1
|
fi
|
|
if [ ! -f "$SYS_CONFIG_FILE" ]; then
|
echo "【错误】系统配置文件 $SYS_CONFIG_FILE 不存在"
|
exit 1
|
fi
|
|
if [ ! -x "$SEND_CMD" ]; then
|
echo "【错误】$SEND_CMD 不可执行,请检查路径或执行 chmod +x $SEND_CMD"
|
exit 1
|
fi
|
}
|
|
# 3. 获取并验证系统开始时间(YYYYMMDD)
|
get_start_time() {
|
start_time=$(jsoner -g "$SYS_CONFIG_FILE" usedTime)
|
|
if [ -z "$start_time" ]; then
|
echo "【错误】usedTime为空"
|
exit 1
|
elif [ ${#start_time} -ne 8 ]; then
|
echo "【错误】usedTime需8位数字,当前值:$start_time"
|
exit 1
|
elif ! echo "$start_time" | grep -q '^[0-9][0-9]*$'; then
|
echo "【错误】usedTime含非数字字符,当前值:$start_time"
|
exit 1
|
fi
|
|
echo "$start_time"
|
}
|
|
# 4. 计算运行时间(返回十六进制拼接结果,添加空格分隔)
|
calculate_run_time_hex() {
|
start_time="$1"
|
start_date="${start_time:0:4}-${start_time:4:2}-${start_time:6:2}"
|
|
# 转换开始时间为时间戳
|
start_timestamp=$(date -d "$start_date" +%s 2>/dev/null)
|
if [ $? -ne 0 ]; then
|
echo "CAE4BCFEB8F6CAAEDC8B1" # 时间格式错误的十六进制
|
return 1
|
fi
|
|
# 计算运行秒数
|
current_timestamp=$(date +%s)
|
run_seconds=$((current_timestamp - start_timestamp))
|
run_seconds=$((run_seconds < 0 ? 0 : run_seconds))
|
|
# 转换为天和小时
|
days=$((run_seconds / 86400))
|
remaining_seconds=$((run_seconds % 86400))
|
hours=$((remaining_seconds / 3600))
|
|
# 转换数字为十六进制
|
days_hex=$(echo -n "$days" | xxd -p | tr -d '\n')
|
hours_hex=$(echo -n "$hours" | xxd -p | tr -d '\n')
|
|
# 拼接格式:天数 + 空格 + 天 + 小时数 + 空格 + 小时
|
echo "${days_hex}${HEX_SPACE}${HEX_DAY}${HEX_SPACE}${hours_hex}${HEX_SPACE}${HEX_HOUR}"
|
}
|
|
# 5. 切换分区3的图片
|
switch_image() {
|
image_id="$1"
|
image_id_hex=$(echo -n "$image_id" | xxd -p | tr -d '\n')
|
cmd="5345545F42544E5F494D4728332C302C${image_id_hex}293B0D0A"
|
$SEND_CMD -x "$cmd" >/dev/null 2>&1
|
}
|
|
# 6. 发送文本到指定分区(支持直接使用十六进制或动态转换)
|
send_text() {
|
local zone="$1"
|
local is_hex="$2" # 1=直接使用十六进制内容, 0=动态转换文本
|
local content="$3"
|
|
# 转换分区号为十六进制
|
local zone_hex=$(echo -n "$zone" | xxd -p | tr -d '\n')
|
|
# 处理内容
|
local content_hex
|
if [ "$is_hex" -eq 1 ]; then
|
content_hex="$content" # 使用指定十六进制
|
else
|
content_hex=$(echo -n "$content" | xxd -p | tr -d '\n') # 动态转换
|
fi
|
|
# 发送命令
|
local cmd="5345545F54585428${zone_hex}2C27${content_hex}27293B0D0A"
|
$SEND_CMD -x "$cmd" >/dev/null 2>&1
|
}
|
|
# 7. 加载网络配置
|
load_network_config() {
|
IP1=$(jsoner -g "$CONFIG_FILE" eth0.ip)
|
MAC1=$(jsoner -g "$CONFIG_FILE" eth0.mac)
|
IP2=$(jsoner -g "$CONFIG_FILE" eth1.ip)
|
MAC2=$(jsoner -g "$CONFIG_FILE" eth1.mac)
|
}
|
|
# 8. 应用文本场景
|
apply_text_scene() {
|
local scene="$1"
|
local run_time_hex="$2"
|
|
case $scene in
|
0) # 场景一:Lan1信息
|
send_text 0 0 "Lan1"
|
send_text 1 0 "$IP1"
|
send_text 2 0 "$MAC1"
|
echo "【文本场景】Lan1 | IP: $IP1 | MAC: $MAC1"
|
;;
|
1) # 场景二:Lan2信息
|
send_text 0 0 "Lan2"
|
send_text 1 0 "$IP2"
|
send_text 2 0 "$MAC2"
|
echo "【文本场景】Lan2 | IP: $IP2 | MAC: $MAC2"
|
;;
|
2) # 场景三:系统时间信息(分区0显示^_^)
|
send_text 0 0 "^_^" # 分区0显示^_^
|
send_text 1 1 "$HEX_SYSTEM_RUN_TIME" # 系统运行时间(指定十六进制)
|
send_text 2 1 "$run_time_hex" # 运行时间(含空格分隔)
|
echo "【文本场景】分区0: ^_^ | 运行时间(十六进制): $run_time_hex"
|
;;
|
esac
|
}
|
|
# 9. 主函数
|
main() {
|
# 先检查并启动显示程序(在所有初始化操作之前)
|
check_and_start_display
|
|
# 其他初始化操作
|
check_dependencies
|
local start_time=$(get_start_time)
|
load_network_config
|
|
local image_id=0
|
local text_scene=0
|
local loop_count=0
|
local text_scene_interval_count=$(echo "scale=0; $TEXT_SCENE_INTERVAL / $IMAGE_SWITCH_INTERVAL" | bc)
|
|
echo "【启动成功】图片间隔: $IMAGE_SWITCH_INTERVAL秒 | 文本间隔: $TEXT_SCENE_INTERVAL秒"
|
echo "【系统开始时间】$start_time(来自 $SYS_CONFIG_FILE)"
|
echo "【场景三配置】分区0将显示: ^_^"
|
|
# 初始加载场景
|
local run_time_hex=$(calculate_run_time_hex "$start_time")
|
apply_text_scene $text_scene "$run_time_hex"
|
|
# 主循环
|
while true; do
|
# 切换图片
|
switch_image $image_id
|
image_id=$(( (image_id + 1) % TOTAL_IMAGE_IDS ))
|
|
# 切换文本场景
|
if [ $loop_count -ge $text_scene_interval_count ]; then
|
loop_count=0
|
run_time_hex=$(calculate_run_time_hex "$start_time")
|
text_scene=$(( (text_scene + 1) % TOTAL_TEXT_SCENES ))
|
apply_text_scene $text_scene "$run_time_hex"
|
else
|
loop_count=$((loop_count + 1))
|
fi
|
|
sleep $IMAGE_SWITCH_INTERVAL
|
done
|
}
|
|
# 启动程序
|
main
|