Update for v1.0.5

This commit is contained in:
James Deng 2024-06-29 09:30:51 +08:00
parent 95d4322ff9
commit a2c1d15e40
6 changed files with 137 additions and 21 deletions

View file

@ -16,6 +16,8 @@
"poweroff_button": "关机", "poweroff_button": "关机",
"camera": "摄像头", "camera": "摄像头",
"audio": "音频", "audio": "音频",
"others": "其他项",
"sn": "序列号",
"test_table_head": ["模块", "测试项", "结果"], "test_table_head": ["模块", "测试项", "结果"],
"test_step": "测试步骤", "test_step": "测试步骤",
"start_button": "开始", "start_button": "开始",
@ -43,6 +45,8 @@
"poweroff_button": "Shutdown", "poweroff_button": "Shutdown",
"camera": "Camera", "camera": "Camera",
"audio": "Microphone", "audio": "Microphone",
"others": "Others",
"sn": "Serial number",
"test_table_head": ["Module", "Test Item", "Result"], "test_table_head": ["Module", "Test Item", "Result"],
"test_step": "Test Step", "test_step": "Test Step",
"start_button": "Start", "start_button": "Start",

View file

@ -4,16 +4,18 @@ This is the "View" of the MVC world.
""" """
from PyQt5.QtCore import Qt, QTimer, QUrl from PyQt5.QtCore import Qt, QTimer, QUrl
from PyQt5.QtGui import QColor from PyQt5.QtGui import QColor, QPixmap, QImage
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QMainWindow, QMainWindow,
QFrame, QFrame,
QHBoxLayout,
QVBoxLayout, QVBoxLayout,
QGridLayout, QGridLayout,
QLabel, QLabel,
QPushButton, QPushButton,
QGroupBox, QGroupBox,
QTableWidget, QTableWidget,
QAbstractItemView,
QStatusBar, QStatusBar,
QTableWidgetItem, QTableWidgetItem,
QHeaderView QHeaderView
@ -21,6 +23,9 @@ from PyQt5.QtWidgets import (
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimediaWidgets import QVideoWidget from PyQt5.QtMultimediaWidgets import QVideoWidget
import qrcode
from PIL.ImageQt import ImageQt
import os import os
import time import time
import threading import threading
@ -184,7 +189,7 @@ class MainWindow(QMainWindow, SimpleLang):
# | auto | camera | # | auto | camera |
# | | | # | | |
# ------------------- # -------------------
# | manual | audio | # | manual | others |
# | | | # | | |
# ------------------- # -------------------
self.tests = QFrame(self.content) self.tests = QFrame(self.content)
@ -200,11 +205,21 @@ class MainWindow(QMainWindow, SimpleLang):
self.media_player.setVideoOutput(video_widget) self.media_player.setVideoOutput(video_widget)
camera_box_layout.addWidget(video_widget) camera_box_layout.addWidget(video_widget)
audio_box = QGroupBox(self.get_text('audio'), self.tests) # others
audio_box_layout = QVBoxLayout(audio_box) self.others_box = QGroupBox(self.get_text('others'), self.tests)
others_box_layout = QVBoxLayout(self.others_box)
# item
self.others_item = QFrame(self.others_box)
self.others_item_layout = QHBoxLayout(self.others_item)
others_box_layout.addWidget(self.others_item)
sn = self._get_sn()
if sn:
self._setup_sn_qrcode(sn)
self.tests_layout.addWidget(camera_box, 0, 1, 4, 1) self.tests_layout.addWidget(camera_box, 0, 1, 4, 1)
self.tests_layout.addWidget(audio_box, 4, 1, 3, 1) self.tests_layout.addWidget(self.others_box, 4, 1, 3, 1)
self.tests_layout.setRowStretch(0, 4) self.tests_layout.setRowStretch(0, 4)
self.tests_layout.setRowStretch(1, 4) self.tests_layout.setRowStretch(1, 4)
@ -234,6 +249,7 @@ class MainWindow(QMainWindow, SimpleLang):
table = QTableWidget(box) table = QTableWidget(box)
table.setStyleSheet('QTableWidget { background-color: black; color: white; }') table.setStyleSheet('QTableWidget { background-color: black; color: white; }')
table.setEditTriggers(QAbstractItemView.NoEditTriggers)
table.setColumnCount(len(columns)) table.setColumnCount(len(columns))
table.setHorizontalHeaderLabels(columns) table.setHorizontalHeaderLabels(columns)
for i in range(len(columns)): for i in range(len(columns)):
@ -251,6 +267,35 @@ class MainWindow(QMainWindow, SimpleLang):
self.tests_layout.addWidget(box, row, column, row_span, column_span) self.tests_layout.addWidget(box, row, column, row_span, column_span)
def _create_qrcode(self, data):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=8,
border=0,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
qt_image = ImageQt(img).convertToFormat(QImage.Format_RGB32)
return QPixmap.fromImage(qt_image)
def _setup_sn_qrcode(self, sn):
sn_qrcode = QFrame(self.others_item)
sn_qrcode_layout = QVBoxLayout(sn_qrcode)
qr_label = QLabel(sn_qrcode)
qr_label.setAlignment(Qt.AlignCenter)
qr_label.setPixmap(self._create_qrcode(sn))
sn_qrcode_layout.addWidget(qr_label)
sn_label = QLabel(f'{self.get_text("sn")}: {sn}', sn_qrcode)
sn_qrcode_layout.addWidget(sn_label)
self.others_item_layout.addWidget(sn_qrcode)
###################################################### ######################################################
# Handlers for setting a new project # Handlers for setting a new project
###################################################### ######################################################
@ -433,6 +478,12 @@ class MainWindow(QMainWindow, SimpleLang):
# update "run selected" button enabled state # update "run selected" button enabled state
self.set_selected_button_state() self.set_selected_button_state()
def _get_sn(self):
path = '/proc/device-tree/serial-number'
if os.path.exists(path):
with open(path, 'r') as f:
return f.readline().strip()
def _get_fw_version(self): def _get_fw_version(self):
path = '/etc/bianbu_version' path = '/etc/bianbu_version'
if os.path.exists(path): if os.path.exists(path):

13
gpu.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
while true
do
glmark2-es2-wayland --off-screen --run-forever > /tmp/glmark2.log
if [ $? -eq 0 ]; then
echo "gpu test completed successfully."
else
echo "gpu test encountered an error or exited prematurely."
echo none > /sys/class/leds/sys-led/trigger
break
fi
done

View file

@ -1,21 +1,17 @@
#!/bin/bash #!/bin/bash
test_size=100M test_size=100M
test_loop=1000 test_loop=1
echo "Starting memtester..." while true
memtester $test_size $test_loop & do
memtester $test_size $test_loop > /dev/null
# Get the process ID of the memtester instance
memtester_pid=$!
# Wait for the process to finish
wait $memtester_pid
# Check the exit status of memtester process
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "memtester test completed successfully." echo "memtester test completed successfully."
else else
echo "memtester test encountered an error or exited prematurely." echo "memtester test encountered an error or exited prematurely."
echo none > /sys/class/leds/sys-led/trigger echo none > /sys/class/leds/sys-led/trigger
break
fi fi
done

View file

@ -5,4 +5,6 @@ ROOT=$(dirname "$(readlink -f "$0")")
pushd $ROOT > /dev/null pushd $ROOT > /dev/null
./stress-ng.sh & ./stress-ng.sh &
./memtester.sh & ./memtester.sh &
./gpu.sh &
./vpu.sh &
popd > /dev/null popd > /dev/null

50
vpu.sh Executable file
View file

@ -0,0 +1,50 @@
#!/bin/bash -e
log="/tmp/vpu-test.log"
h264="h264_w1920_h1080_f25_r4_p1_8bit_54f_11mb_high_cabac.264"
decode_yuv="/tmp/decode.yuv"
decode_md5="e59c9318e3f733d016ebfcdec98a95fb"
yuv="yuv420p_w1280_h720_30f.yuv"
encode_264="/tmp/encode.264"
encode_md5="55ceae7750bdc3906dd427e221c0317b"
while true
do
rm -f $log
# decode routine
echo "`date`" >> $log
rm -f $decode_yuv
mvx_decoder -f raw /opt/factorytest/res/h264_w1920_h1080_f25_r4_p1_8bit_54f_11mb_high_cabac.264 $decode_yuv >> $log
if [ ! -f $decode_yuv ]
then
echo "vpu decode encountered an error"
echo none > /sys/class/leds/sys-led/trigger
break
fi
md5=`md5sum $decode_yuv | awk '{ print $1 }'`
if [ "$md5" != "$decode_md5" ]
then
echo "vpu decode data md5 unmatch"
echo none > /sys/class/leds/sys-led/trigger
break
fi
# encode routine
echo "`date`" >> $log
rm -f $encode_264
mvx_encoder -f raw -w 1280 -h 720 /opt/factorytest/res/yuv420p_w1280_h720_30f.yuv $encode_264 >> $log
if [ ! -f $encode_264 ]
then
echo "vpu encode encountered an error"
echo none > /sys/class/leds/sys-led/trigger
break
fi
md5=`md5sum $encode_264 | awk '{ print $1 }'`
if [ "$md5" != "$encode_md5" ]
then
echo "vpu encode data md5 unmatch"
echo none > /sys/class/leds/sys-led/trigger
break
fi
done