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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#!/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