Qt DeviceTestT113

本系列调试说明记录了Linux在全志T113-S3/S4平台上的移植过程,说明过程中可能会技术瑕疵,希望大家提供宝贵意见。
本文移植的硬件平台来自于盈鹏飞嵌入式的SBC-T113S(处理器是T113-S3)主板。

SBC-T113S产品特性:

  • 采用Allwinner公司Cortex-A7双核T113-S3/S4处理器,运行最高速度为1.2GHZ;
  • 内置64-bit XuanTie C906 RISC-V协处理器(仅T113-S4支持);
  • 支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);
  • 支持RGB666/LVDS/MIPI-DSI,分辨率最高1920x1080;
  • 支持128-256M Bytes DDR3 SDRAM,其中T113-S3内置128MB;T113-S4内置256MB;
  • 支持SPI NAND存储和启动(默认:256MB;最大1GB)或者EMMC启动(默认:4GB,最大32GB);
  • 支持一路USB2.0 OTG(设计为TYPE-A接口);支持二路USB2.0 HOST;
  • 支持七路RS232通信或者6路RS232和1路RS485(隔离);
  • 支持一路CAN BUS通信(隔离);
  • 支持一路10/100M以太网;
  • 稳定的操作系统的支持,可预装LINUX 5.4或者OpenWRT;
  • 经典尺寸主板,尺寸为120*100MM; 

产品功能评估图:

产品尺寸:

以下为Qt DeviceTestT113说明:

命令行测试硬件

sh-4.4# ls -al rp_test/

total 55668

drwxrwxr-x    3 root     root          4096 Jan  1 00:16 .

drwxr-xr-x   22 root     root          4096 Jan  1 00:00 ..

-rwxrwxr-x    1 root     root          5212 Nov  3  2023 comtest

drwxrwxr-x    2 root     root          4096 Nov  3  2023 input

-rwxrwxrwx    1 root     root      46329002 Oct 20  2023 test.wav

-rwxrwxrwx    1 root     root      10557420 Oct 20  2023 test48000.wav

-rwxrwxr-x    1 root     root           357 Nov  3  2023 test_4G.sh

-rwxrwxr-x    1 root     root            46 Nov  3  2023 test_audio.sh

-rwxrwxr-x    1 root     root            96 Nov  3  2023 test_bt.sh

-rwxrwxr-x    1 root     root           606 Nov  3  2023 test_can.sh

-rwxrwxr-x    1 root     root            99 Nov  3  2023 test_ethernet.sh

-rwxrwxr-x    1 root     root            33 Nov  3  2023 test_uart.sh

-rwxrwxr-x    1 root     root           189 Nov  3  2023 test_watchdog.sh

-rwxrwxr-x    1 root     root           530 Nov  3  2023 test_wifi.sh

-rwxrwxr-x    1 root     root           311 Nov  3  2023 test_wifi_ap.sh

-rwxrwxr-x    1 root     root          2407 Nov  3  2023 watchdogd.cpp

-rwxrwxr-x    1 root     root          3928 Nov  3  2023 watchdogd.out

命令行测试wifi

1. iw dev wlan0 scan | grep SSID

2. wpa_passphrase kefu xintian888 >> /etc/wpa_supplicant.conf

3. wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

4. iw wlan0 link

test_wifi.sh

sh-4.4# cat rp_test/test_wifi.sh

#!/bin/sh

read -p "Enter your wifi-ssid, please: " WIFISSID

read -p "Enter your wifi-pwd, please: " WIFIPWD

#WIFISSID=$1

#WIFIPWD=$2

CONF=/tmp/wpa_supplicant.conf

cp /etc/wpa_supplicant.conf /tmp/

echo "connect to WiFi ssid: $WIFISSID, Passwd: $WIFIPWD"

#sed -i "s/SSID/$WIFISSID/g" $CONF

#sed -i "s/PASSWORD/$WIFIPWD/g" $CONF

wpa_passphrase $WIFISSID $WIFIPWD > $CONF

killall wpa_supplicant

sleep 1

wpa_supplicant -B -i wlan0 -c $CONF

# auto get ipaddress

udhcpc -i wlan0

ifconfig wlan0

ping -I wlan0 -c 4 www.rpdzkj.com

DeviceTest

t113_linux/platform/framework/auto/qt_demo/DeviceTest$ tree -L 1

.

├── 4G

├── adc

├── bluetooth

├── camera

├── common

├── device

├── DeviceTest.pro

├── DeviceTest.pro.user

├── ethernet

├── led

├── main.cpp

├── mainUI

├── makeDeviceTest

├── pwm

├── qrc_res.cpp

├── res

├── res.qrc

├── rgb

├── rtc

├── sound

├── test.test

├── tfcard

├── touch

├── uart

├── usb

└── wifi

工程文件pro

QT       += core gui serialport network multimedia multimediawidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 

SOURCES += \

    4G/mobilenet.cpp \

    4G/mobilenetthread.cpp \

    adc/adckey.cpp \

    adc/adcthread.cpp \

    bluetooth/bluetooth.cpp \

    bluetooth/bluetooththread.cpp \

    camera/camera.cpp \

    camera/thread/camerathread1.cpp \

    camera/thread/camerathread2.cpp \

    camera/v4l2/v4l2.c \

    common/common.cpp \

    device/deviceinfo.cpp \

    device/devicethread.cpp \

    ethernet/ethernet.cpp \

    ethernet/ethnetautotest.cpp \

    ethernet/eththread.cpp \

    led/led.cpp \

    main.cpp \

    mainUI/mainwindow.cpp \

    pwm/pwm.cpp \

    pwm/pwmthread.cpp \

    rgb/lcdrgb.cpp \

    rtc/rtc.cpp \

    rtc/rtcthread.cpp \

    sound/playtimethread.cpp \

    sound/recortTimeThread.cpp \

    sound/sound.cpp \

    tfcard/tfcard.cpp \

    tfcard/tfcardthread.cpp \

    touch/touch.cpp \

    uart/uart.cpp \

    usb/usbdevices.cpp \

    usb/usbthread.cpp \

    wifi/connectthread.cpp \

    wifi/wifi.cpp \

    wifi/wifithread.cpp

HEADERS += \

    4G/mobilenet.h \

    4G/mobilenetthread.h \

    adc/adckey.h \

    adc/adcthread.h \

    bluetooth/bluetooth.h \

    bluetooth/bluetooththread.h \

    camera/camera.h \

    camera/thread/camerathread1.h \

    camera/thread/camerathread2.h \

    camera/v4l2/config.h \

    camera/v4l2/v4l2.h \

    common/common.h \

    device/deviceinfo.h \

    device/devicethread.h \

    ethernet/ethernet.h \

    ethernet/ethnetautotest.h \

    ethernet/eththread.h \

    led/led.h \

    mainUI/mainwindow.h \

    pwm/pwm.h \

    pwm/pwmthread.h \

    rgb/lcdrgb.h \

    rtc/rtc.h \

    rtc/rtcthread.h \

    sound/playtimethread.h \

    sound/recortTimeThread.h \

    sound/sound.h \

    tfcard/tfcard.h \

    tfcard/tfcardthread.h \

    touch/touch.h \

    uart/uart.h \

    usb/usbdevices.h \

    usb/usbthread.h \

    wifi/connectthread.h \

    wifi/wifi.h \

    wifi/wifithread.h

# Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin

else: unix:!android: target.path = /opt/$${TARGET}/bin

!isEmpty(target.path): INSTALLS += target

RESOURCES += \

    res.qrc

main.cpp

#include "mainUI/mainwindow.h" 

#include <QApplication> 

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

    return a.exec();

}

main_window.cpp

#include "mainwindow.h" #include "rtc/rtc.h" #include "uart/uart.h" #include "device/deviceinfo.h" #include "touch/touch.h" #include "adc/adckey.h" #include "pwm/pwm.h" #include "ethernet/ethernet.h" #include "wifi/wifi.h" #include "bluetooth/bluetooth.h" #include "camera/camera.h" #include "led/led.h" #include "sound/sound.h" #include "4G/mobilenet.h" #include "tfcard/tfcard.h" #include "rgb/lcdrgb.h" #include "usb/usbdevices.h" 

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

{

    QScreen *screen = QGuiApplication::primaryScreen();

    windSize = screen->virtualGeometry();

    //default full screen

    resize(windSize.width(), windSize.height());

    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); // 去掉标题栏,去掉任务栏显示,窗口置顶

    this->initWindow();

}

void MainWindow::initWindow()

{

    QGridLayout *mainLayout = new QGridLayout;

    widget = new QWidget();

    QSettings  *setting = new QSettings(CONFIG_FILE_PATH,QSettings::IniFormat);

    setting->setIniCodec("UTF-8");

    QStringList groups = setting->childGroups();

    int row = 1;

    int index = 0;

    for(int i = 0;i < groups.length(); i++){

        QString enable = setting->value("/"+groups.at(i)+"/enable").toString();

        QString name = setting->value("/"+groups.at(i)+"/name").toString();

        QString state = setting->value("/"+groups.at(i)+"/state").toString();

        if(enable == "1"){

            QPushButton *funBtn = common.getButton(name);

            funBtn->setStyleSheet(funBtn->styleSheet()+"QPushButton{width:200;height:40}");

            if(state == "1")

                funBtn->setStyleSheet(funBtn->styleSheet()+"QPushButton{border-image:url(:/icon/pass.png)}");

            if(state == "0")

                funBtn->setStyleSheet(funBtn->styleSheet()+"QPushButton{border-image:url(:/icon/faild.png)}");

            connect(funBtn, &QPushButton::clicked, [=] { handleClick(funBtn->text()); });

            if(index % 2 == 0){

                mainLayout->addWidget(funBtn, row, 1, Qt::AlignRight);

            }else{

                mainLayout->addWidget(funBtn, row, 2, Qt::AlignLeft);

                row++;

            }

            index++;

        }

    }

    QPushButton *auTestBtn = common.getButton("自动测试");

    connect(auTestBtn, &QPushButton::clicked, [=] { handleAutoTest(); });

    auTestBtn->setStyleSheet(auTestBtn->styleSheet()+"QPushButton{width:460;height:40}");

    mainLayout->addWidget(auTestBtn, ++row, 1, 1, 2, Qt::AlignHCenter);

    mainLayout->setHorizontalSpacing(60);

    widget->resize(windSize.width(), windSize.height());

    widget->setLayout(mainLayout);

    this->setCentralWidget(widget);

}

void MainWindow::updateBtnStyle(QString btnTxt, bool result)

{

    QList<QPushButton *> buttons = centralWidget()->findChildren<QPushButton *>();

    for (QPushButton *btn : buttons) {

        if(btn->text() == btnTxt){

            if (result)

                btn->setStyleSheet(btn->styleSheet()+"QPushButton{border-image:url(:/icon/pass.png)}");

            else

                btn->setStyleSheet(btn->styleSheet()+"QPushButton{border-image:url(:/icon/faild.png)}");

        }

        btn->update();

    }

    // for auto test

    if(autoTest){

        if(queue.isEmpty()){

            autoTest = 0;

            timer->stop();

            return;

        }

        timer->start();

    }

}

void MainWindow::handleAutoTest()

{

    qDebug()<<autoTest;

    autoTest = 1;

    qDebug()<<autoTest;

    QSettings  *setting = new QSettings(CONFIG_FILE_PATH,QSettings::NativeFormat);

    QStringList groups = setting->childGroups();

    for(int i = 0; i < groups.length(); i++){

        for(int j = 0; j < groups.length(); j++){

            int id = setting->value("/"+groups.at(j)+"/id").toInt();

            if ((id - 1) == i){

                QString enable = setting->value("/"+groups.at(j)+"/enable").toString();

                if(enable == "1"){

                    QString name = setting->value("/"+groups.at(j)+"/name").toString();

                    queue.enqueue(name);

                }

            }

        }

    }

    timer = new QTimer(this);

    timer->setInterval(100);

    connect(timer, &QTimer::timeout, [=] {handleClick(queue.dequeue());});

    timer->start();

}

void MainWindow::handleClick(QString str)

{

    if(autoTest){

        timer->stop();

    }

    if(str == "RTC"){

        RTC *rtc = new RTC(this);

        connect(rtc, &RTC::testFinish, [=] { updateBtnStyle(str,rtc->testResult); });

        rtc->initWindow(windSize.width(),windSize.height());

        rtc->showFullScreen();

    }else if (str == "串口") {

        Uart *uart = new Uart(this);

        connect(uart, &Uart::testFinish, [=] { updateBtnStyle(str,uart->testResult); });

        uart->initWindow(windSize.width(),windSize.height());

    }else if (str == "设备信息"){

        DeviceInfo *dev = new DeviceInfo(this);

        connect(dev, &DeviceInfo::testFinish, [=] { updateBtnStyle(str,dev->testResult); });

        dev->initWindow(windSize.width(),windSize.height());

    }else if (str == "触摸"){

        Touch *touch = new Touch(this);

        touch->initWindow(windSize.width(),windSize.height());

        touch->showFullScreen();

        connect(touch, &Touch::testFinish, [=] { updateBtnStyle(str,touch->testResult); });

    }else if(str == "ADC按键"){

        AdcKey *adc = new AdcKey(this);

        adc->initWindow(windSize.width(),windSize.height());

        adc->showFullScreen();

        connect(adc, &AdcKey::testFinish, [=] { updateBtnStyle(str,adc->testResult); });

    }else if(str == "PWM/背光"){

        Pwm *pwm = new Pwm(this);

        pwm->initWindow(windSize.width(),windSize.height());

        pwm->showFullScreen();

        connect(pwm, &Pwm::testFinish, [=] { updateBtnStyle(str,pwm->testResult); });

    }else if(str == "以太网"){

        EtherNet *etherNet = new EtherNet(this);

        etherNet->initWindow(windSize.width(),windSize.height());

        etherNet->showFullScreen();

        connect(etherNet, &EtherNet::testFinish, [=] { updateBtnStyle(str,etherNet->testResult); });

    }else if(str == "WIFI"){

        Wifi *wifi = new Wifi(this);

        wifi->initWindow(windSize.width(),windSize.height());

        wifi->showFullScreen();

        connect(wifi, &Wifi::testFinish, [=] { updateBtnStyle(str,wifi->testResult); });

    }else if(str == "蓝牙"){

        Bluetooth *bt = new Bluetooth(this);

        bt->initWindow(windSize.width(),windSize.height());

        bt->showFullScreen();

        connect(bt, &Bluetooth::testFinish, [=] { updateBtnStyle(str,bt->testResult); });

    }else if(str == "摄像头"){

        Camera *cam = new Camera(this);

        cam->initWindow(windSize.width(),windSize.height());

        connect(cam, &Camera::testFinish, [=] { updateBtnStyle(str,cam->testResult); });

        cam->showFullScreen();

    }else if(str == "补光灯"){

        Led *led = new Led(this);

        led->initWindow(windSize.width(),windSize.height());

        connect(led, &Led::testFinish, [=] { updateBtnStyle(str,led->testResult); });

        led->showFullScreen();

    }else if(str == "声卡"){

        Sound *sound = new Sound(this);

        sound->initWindow(windSize.width(),windSize.height());

        connect(sound, &Sound::testFinish, [=] { updateBtnStyle(str,sound->testResult); });

        sound->showFullScreen();

    }else if(str == "4G"){

        MobileNet *mobileNet = new MobileNet(this);

        mobileNet->initWindow(windSize.width(),windSize.height());

        connect(mobileNet, &MobileNet::testFinish, [=] { updateBtnStyle(str,mobileNet->testResult); });

        mobileNet->showFullScreen();

    }else if(str == "TF"){

        TFCard *tfcard = new TFCard(this);

        tfcard->initWindow(windSize.width(),windSize.height());

        connect(tfcard, &TFCard::testFinish, [=] { updateBtnStyle(str,tfcard->testResult); });

        tfcard->showFullScreen();

    }else if(str == "RGB"){

        LcdRGB *rgb = new LcdRGB(this);

        rgb->initWindow(windSize.width(),windSize.height());

        connect(rgb, &LcdRGB::testFinish, [=] { updateBtnStyle(str,rgb->testResult); });

        rgb->showFullScreen();

    }else if(str == "USB"){

        USBDevices *usb = new USBDevices(this);

        usb->initWindow(windSize.width(),windSize.height());

        connect(usb, &USBDevices::testFinish, [=] { updateBtnStyle(str,usb->testResult); });

        usb->showFullScreen();

    }

}

MainWindow::~MainWindow()

{

}

4G

MobileNet *mobileNet = new MobileNet(this);

        mobileNet->initWindow(windSize.width(),windSize.height());

        connect(mobileNet, &MobileNet::testFinish, [=] { updateBtnStyle(str,mobileNet->testResult); });

        mobileNet->showFullScreen();

MobileNet

#ifndef MOBILENET_H #define MOBILENET_H 

#include <QObject> #include <QWidget> #include "common/common.h" #include "mobilenetthread.h" 

class MobileNet : public QWidget

{

    Q_OBJECT

public:

    explicit MobileNet(QWidget *parent = nullptr);

    void initWindow(int w, int h);

    bool testResult=false;

protected:

    Common common;

    QLineEdit *pppIp;

    void showDialog(int row);

    void pingTest(QString ip);

    void closeWindow();

    MobileNetThread *mobleNetThread;

    QPushButton *title;

    QTextEdit *detial;

    QTimer *timer;

    int timeoutTimes = 0;

    QTimer *closeTimer;

public slots:

    void setPppIp(QString ip);

    void dealReturnStr(QString txt);

    void readLog();

signals:

    void testFinish();

};

#endif // MOBILENET_H 

测试实际的实现方法

bool MobileNetThread::checkMobileNet()

{

    QList<QNetworkInterface> ifaceList=QNetworkInterface::allInterfaces();

    foreach (QNetworkInterface interface, ifaceList) {

        QString interfaceName = interface.humanReadableName();

#ifndef USE_GOBINET         if(!interfaceName.startsWith("ppp"))

#else         if(!interfaceName.startsWith("usb"))

#endif             continue;

        QList<QNetworkAddressEntry> addresses = interface.addressEntries();

        foreach (QNetworkAddressEntry address, addresses) {

            qDebug()<<address.ip();

            pppIp = address.ip().toString();

            // qDebug()<<pppIp;

            break;

        }

    }

    emit getPppIP(pppIp);

    return pppIp != "";

}

蓝牙

BluetoothThread

#include "bluetooththread.h" 

BluetoothThread::BluetoothThread()

{

}

void BluetoothThread::run()

{

// qDebug()<<"run";

    openBluetooth();

    while (leScan) {

        scanBluetooth();

        msleep(5000);

    }

}

void BluetoothThread::openBluetooth()

{

    QFile hci("/sys/class/bluetooth/hci0");

    if(hci.exists()){

        ::system("hciconfig hci0 up ");

        return;

    }else{

        ::system("bt_init.sh");

        msleep(2000);

        ::system("hciconfig hci0 up ");

    }

}

void BluetoothThread::scanBluetooth()

{

    QFile fiel("/sys/class/bluetooth/hci0");

    if(!fiel.exists()){

        emit getLeScanResult("");

        return;

    }

    QProcess *p = new QProcess;

    connect(p, &QProcess::readyRead, this, [=] {this->dealReturn(p->readAll());});

    //ping -I eth0 192.168.1.1 -c 4

    QString testCmd = "hcitool scan";

    p->start("bash", QStringList() <<"-c" << testCmd);

    p->waitForFinished();

}

void BluetoothThread::dealReturn(QString returnTxt)

{

    qDebug() << returnTxt;

    emit getLeScanResult(returnTxt);

}

USB

#include "usbthread.h" 

#define USB_DEVICE_PATH "/sys/bus/usb/devices/" UsbThread::UsbThread()

{

}

void UsbThread::run()

{

    qDebug()<<"run";

    while(checkState){

        checkUsbDevices();

        msleep(500);

    }

}

void UsbThread::checkUsbDevices()

{

    usbHubCnt = 0;

    usbDevCnt = 0;

    QDir dir(USB_DEVICE_PATH);

    for(QFileInfo info : dir.entryInfoList()){

        if(info.fileName() == "." || info.fileName() == "..")

            continue;

        QFile file(QString(info.filePath() + "/product"));

        if(file.exists()){

            file.open(QIODevice::ReadOnly);

            QString product = file.readAll();

            if(product.indexOf("Controller") >= 0 || product.indexOf("controller") >= 0)

                continue;

            if(product.indexOf("Hub") >= 0)

                usbHubCnt ++;

            else

                usbDevCnt ++;

        }

    }

    emit getUsbDevices(usbHubCnt, usbDevCnt);

}

USB 设备数量

cat /sys/bus/usb/devices/**/product

sh-4.4# ls -al  /sys/bus/usb/devices/

total 0

drwxr-xr-x    2 root     root             0 Jan  1 00:07 .

drwxr-xr-x    4 root     root             0 Jan  1 00:07 ..

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-0:1.0 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-0:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1                                 // USB2.0 Hub

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1                         // Android

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.0 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.1 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.1

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.2 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.2

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.3 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.3

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.4 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.4

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.1:1.6 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.6

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.2 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.2                         // USB Optical Mouse

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.2:1.0 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.2/1-1.2:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.4 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.4                         // 802.11n WLAN Adapter

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.4:1.0 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.4/1-1.4:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.4:1.1 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.4/1-1.4:1.1

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1.4:1.2 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1.4/1-1.4:1.2

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 1-1:1.0 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1/1-1/1-1:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 2-0:1.0 -> ../../../devices/platform/soc@3000000/4200400.ohci1-controller/usb2/2-0:1.0

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 usb1 -> ../../../devices/platform/soc@3000000/4200000.ehci1-controller/usb1                                    // EHCI Host Controller

lrwxrwxrwx    1 root     root             0 Jan  1 00:07 usb2 -> ../../../devices/platform/soc@3000000/4200400.ohci1-controller/usb2                                    // OHCI Host Controller

WIFI

#include "wifithread.h" 

WifiThread::WifiThread()

{

}

void WifiThread::run()

{

    qDebug()<<"run";

    openWifi();

    while(scanFlg){

        scanAp();

        msleep(5000);

    }

}

void WifiThread::openWifi()

{

    ::system("echo 1 > /sys/class/rfkill/rfkill1/state");

    ::system("ifconfig wlan0 up");

}

void WifiThread::scanAp()

{

    QMap<QString,QString> infoMap;

    QList<QMap<QString, QString>> infoList;

    QString apList = common.execLinuxCmd("iwlist wlan0 scan");

    QList<QString> resultList = apList.replace(" ","").split("Cell");

    infoList.clear();

    foreach (QString str, resultList) {

        //qDebug()<<str;

        infoMap.clear();

        QStringList wifiInfoList = str.split("\n");

        foreach (QString wifiInfo, wifiInfoList) {

            if(wifiInfo.startsWith("ESSID")){

                QString ssid = wifiInfo.replace("ESSID:", "").replace("\"","");

                if(ssid == "")

                    break;

                infoMap.insert("SSID",ssid);

                    //qDebug()<<ssid;

            }

            if(wifiInfo.startsWith("Frequency")){

                QString freq = wifiInfo.replace("Frequency:", "").replace("\"","");

                infoMap.insert("Frequency",freq);

            }

        }

        if(!infoMap.isEmpty())

            infoList.append(infoMap);

    }

    emit getApMap(infoList);

}

设备信息

#include "devicethread.h" 

DeviceThread::DeviceThread()

{

}

void DeviceThread::run()

{

    getCpuModle();

    getCoreNum();

    getDDRSize();

    getEMMCSIze();

}

void DeviceThread::getCpuModle()

{

    QString detial = common.execLinuxCmd("cat /proc/device-tree/compatible");

    emit endGetCpuModle(detial, detial);

}

void DeviceThread::getCoreNum()

{

    QString detial = common.execLinuxCmd("cat /proc/cpuinfo");

    QStringList strlist = detial.split("\n");

    int coreNum = 0;

    foreach (QString str, strlist) {

        if (str.startsWith("processor"))

            coreNum ++;

    }

    emit endGeCoreNum(QString::number(coreNum), detial);

}

void DeviceThread::getDDRSize()

{

    QString detial = common.execLinuxCmd("cat /proc/meminfo");

    QStringList strlist = detial.split("\n");

    QString DDRSize;

    foreach (QString str, strlist){

        if (str.startsWith("MemTotal")){

            DDRSize = str.replace(QRegExp("\\s{1,}"), " ").split(" ").at(1);

            break;

        }

    }

    long size = DDRSize.toLong();

    if(size <= 512*1024){

        size = size / 1024;

        emit endGetDDRSize(QString::number(size) + "M", detial);

    }else{

        size = size / 1048576 + 1; //1024*1024

        emit endGetDDRSize(QString::number(size) + "G", detial);

    }

}

void DeviceThread::getEMMCSIze()

{

    QString sizeStr;

    long totalSize = 0;

    QString detial = common.execLinuxCmd("fdisk -l");

    // cat /sys/block/mmcblk0/device/type get MMC type

    // cat /sys/block/mmcblk0/size get MMC Size

    for(int i=0; i <= 5; i++){

        QString mmcTypePath = QString("/sys/block/mmcblk%1/device/type").arg(QString::number(i));

        QString mmcSizePath = QString("/sys/block/mmcblk%1/size").arg(QString::number(i));

        QFile mmcTypeFile(mmcTypePath);

        if(mmcTypeFile.exists()){

            mmcTypeFile.open(QIODevice::ReadOnly);

            QString type = mmcTypeFile.readAll();

            qDebug()<<type;

            mmcTypeFile.close();

            if(type == "MMC\n"){

                QFile mmcSizeFile(mmcSizePath);

                mmcSizeFile.open(QIODevice::ReadOnly);

                sizeStr = mmcSizeFile.readAll();

                qDebug()<<sizeStr;

                mmcSizeFile.close();

                break;

            }

        }

    }

    totalSize = sizeStr.toLong()*512/1024/1024/1024 + 1;

    if (totalSize <= 8 && totalSize >=7)

        totalSize = 8;

    if (totalSize <= 16 && totalSize >=15)

        totalSize = 16;

    if (totalSize <= 32 && totalSize >=28)

        totalSize = 32;

    if (totalSize <= 64 && totalSize >=56)

        totalSize = 64;

    if (totalSize <= 128 && totalSize >=110)

        totalSize = 128;

    emit endGetEMMCSize(QString::number(totalSize)+"G", detial);

}

以太网

#include "eththread.h" 

EthThread::EthThread()

{

}

void EthThread::run()

{

    while(readFlag){

        //检测网线插拔

        this->getReticleStat();

        if(pingTestFlag){

            pingTest();

            pingTestFlag = false;

        }

        if(iperfTestFlag){

            iperfTestFlag = false;

        }

        msleep(200);

    }

}

void EthThread::pingTest()

{

    result = false;

    QString str;

    if(targetIp.startsWith("www")){

        str = eth +"测试开始\n开始测试域名解析,目的地址:" +targetIp;

    }else{

        str = eth +"测试开始\n开始测试IP通信,目的地址:" +targetIp;

    }

    emit pingTestFinish(str);

    QProcess *p = new QProcess;

    connect(p, &QProcess::readyRead, this, [=] {this->dealReturn(p->readAll());});

    //ping -I eth0 192.168.1.1 -c 4 -i 0.4

    QString testCmd = "ping -I " + eth + " " + targetIp + " -c 4" + " -i 0.4";

    p->start("bash", QStringList() <<"-c" << testCmd);

    p->waitForFinished();

}

void EthThread::dealReturn(QString returnTxt){

    emit pingTestFinish(returnTxt);

    //test finish

    if(targetIp.startsWith("www")){

        if(returnTxt.indexOf("transmitted") >= 0){

            emit setResult(result, eth, targetIp);

            return;

        }

    }

    //test finish

    if(returnTxt.indexOf("transmitted") >= 0){

        emit setResult(result, eth, targetIp);

        // targetIp = targetAddr;

        // pingTestFlag = true;

    }

    if(returnTxt.indexOf("ttl") >= 0) {

        //qDebug("test success");

        result = true;

    }

}

void EthThread::getReticleStat()

{

    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();//获取所有网卡接口信息到list

    //遍历接口信息

    foreach(QNetworkInterface interface,list){

        QNetworkInterface::InterfaceFlags flags = interface.flags();//获取flag

        if(QNetworkInterface::Ethernet == interface.type()){

            //lixiaogang add start

            if (interface.name().startsWith("usb")) {

                break;

            }

            //lixiaogang add end

            if(flags.testFlag(QNetworkInterface::IsUp)){ //判断活动状态,可以此检测网线插拔

                // qDebug()<<interface.name()<<"is up";

                QList<QNetworkAddressEntry> iplist = interface.addressEntries();//获取当前ip

                ip = getIp(iplist);

                if(ip == ""){

                    QString cmd = QString("timeout 2 udhcpc -i %1").arg(interface.name());

                    system(cmd.toLocal8Bit());

                }

                ip = getIp(iplist);

                if(ip == "")

                    emit setIp(interface.name(), "");

                else

                    emit setIp(interface.name(), ip);

            }else{

                //qDebug()<<interface.name()<<"is down";

            }

        }

    }

}

QString EthThread::getIp(QList<QNetworkAddressEntry> ettry)

{

    QString ip;

    foreach (QNetworkAddressEntry address, ettry) {

        //qDebug()<<address.ip().toString();

        ip = address.ip().toString();

        break;

    }

    return ip;

}

串口

485 串口需要外接串口小板测试

#include "uart.h" 

static QString testText = "Netflix IoT Technology";

Uart::Uart(QWidget *parent) : QWidget(parent)

{

}

void Uart::initWindow(int w, int h)

{

    uartNum = 0;

    timer = new QTimer(this);

    QString ignoreTTY = common.getConfig("serial", "ignore_tty");

    QHBoxLayout *boxLayout_h = new QHBoxLayout();

    QVBoxLayout *boxLayout_v = new QVBoxLayout(); //垂直

    QHBoxLayout *btnLayout_h = new QHBoxLayout();

    QGridLayout *uartLayout = new QGridLayout();

    QLabel *reciveLabel = common.getLabel("接收端:");

    QLabel *sendLabel = common.getLabel("发送端:");

    reciveMessage = common.getTextEdit();

// reciveMessage->setDisabled(true);

    reciveMessage->setText("短接txrx,自动收发!");

    sendMessage = common.getTextEdit();

    sendMessage->setText(testText);

    QLabel *serial = common.getLabel("串口:");

    QLabel *baudSel = common.getLabel("波特率:");

    QLabel *dataBitSel = common.getLabel("数据位:");

    QLabel *stopBitSel = common.getLabel("停止位:");

    QLabel *flowContrlSel = common.getLabel("流控:");

    QGridLayout *serialLayout = new QGridLayout();

    QLineEdit *baudRate = common.getLineEdit();

    baudRate->setText("115200");

    baudRate->setDisabled(true);

    QLineEdit *dataBit = common.getLineEdit();

    dataBit->setText("8");

    dataBit->setDisabled(true);

    QLineEdit *stopBit = common.getLineEdit();

    stopBit->setText("1");

    stopBit->setDisabled(true);

    QLineEdit *flowContrl = common.getLineEdit();

    flowContrl->setText("0");

    flowContrl->setDisabled(true);

    QPushButton *closeWindow = common.getButton("关闭窗口");

    closeWindow->setStyleSheet(closeWindow->styleSheet()+"QPushButton{background-color:#f56c6c}");

    connect(closeWindow, &QPushButton::clicked, [=](){this->getTestResult();});

    QPushButton *cleanBtn = common.getButton("清空数据");

    connect(cleanBtn, &QPushButton::clicked, reciveMessage, &QTextEdit::clear);

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

    {

        QSerialPort serial;

        serial.setPort(info);

        if(serial.open(QIODevice::ReadWrite))

        {

            if(serial.portName().indexOf("ttyUSB") < 0 && ignoreTTY.indexOf(serial.portName()) < 0)

            {

                uartNum++;

                QPushButton *serialBtn = common.getButton(serial.portName());

                QSerialPort *testSerial = new QSerialPort(this);

                testSerial->setPortName(serial.portName());

                testSerial->open(QIODevice::ReadWrite);

                testSerial->setBaudRate(QSerialPort::Baud115200);

                testSerial->setDataBits(QSerialPort::Data8);

                testSerial->setParity(QSerialPort::NoParity);

                testSerial->setStopBits(QSerialPort::OneStop);

                testSerial->setFlowControl(QSerialPort::NoFlowControl);

                serialLayout->addWidget(serialBtn, uartNum, 1);

                connect(testSerial, &QSerialPort::readyRead, [=] { reciveData(testSerial); });

                connect(timer, &QTimer::timeout, [=] {

                    this->sendSerialData(sendMessage->toPlainText().toLatin1(),testSerial);

                });

            }

        }

    }

    //------------------------------------------------------------------------------------------------

    boxLayout_v->addWidget(reciveLabel);

    boxLayout_v->addWidget(reciveMessage);

    boxLayout_v->addWidget(sendLabel);

    boxLayout_v->addWidget(sendMessage);

    btnLayout_h->addWidget(cleanBtn);

    boxLayout_v->addLayout(btnLayout_h);

    uartLayout->addWidget(serial, 1, 1, Qt::AlignRight);

    uartLayout->addLayout(serialLayout, 1, 2);

    uartLayout->addWidget(baudSel, 2, 1, Qt::AlignRight);

    uartLayout->addWidget(baudRate, 2, 2);

    uartLayout->addWidget(dataBitSel, 3, 1, Qt::AlignRight);

    uartLayout->addWidget(dataBit, 3, 2);

    uartLayout->addWidget(stopBitSel, 4, 1, Qt::AlignRight);

    uartLayout->addWidget(stopBit, 4, 2);

    uartLayout->addWidget(flowContrlSel, 5, 1, Qt::AlignRight);

    uartLayout->addWidget(flowContrl, 5, 2);

    uartLayout->addWidget(closeWindow, 6, 2);

    boxLayout_h->addLayout(boxLayout_v);

    boxLayout_h->addLayout(uartLayout);

    this->setLayout(boxLayout_h);

    this->resize(w,h);

    this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::CustomizeWindowHint);

    this->showFullScreen();

    timer->start(200);

}

void Uart::reciveData(QSerialPort *testSerial)

{

    QByteArray buf;

    buf = testSerial->readAll();

    qDebug() << testSerial->portName() << buf;

    if(!buf.isEmpty()){

        QString dis = buf;

        // delete by lixiaogang

        //if (dis == testText){

            reciveMessage->append(testSerial->portName() + ":" + dis);

            reciveMessage->moveCursor(QTextCursor::End);

        //} else {

        // return;

        //}

        QList<QPushButton *> buttons = this->findChildren<QPushButton *>();

        for (QPushButton *btn : buttons) {

            if(btn->text() == testSerial->portName()){

                btn->setStyleSheet(btn->styleSheet()+"QPushButton{border-image:url(:/icon/pass.png)}");

            }

             btn->update();

        }

    }

    buf.clear();

}

喇叭

void Sound::playAudio(QAudioDeviceInfo device, QString btnTxt){

    QPushButton *btn = this->findChild<QPushButton *>(device.deviceName());

    if(btnTxt == "播放"){

        btn->setText("停止");

        if (device.isFormatSupported(format)){

            outputFile.setFileName(RECORD_PATH);

            if(!outputFile.exists() || outputFile.size() == 0)

                outputFile.setFileName(AUDIO_PATH);

            if(outputFile.open( QIODevice::ReadOnly)){

                outputDev = new QAudioOutput(device, format, this);

// outputDev->setVolume(0.1f);

                int duration = (outputFile.size()-44) / dateRate;//get wav file time

                if(outputDev){

                    playTimeThread->playTime = duration;

                    playTimeThread->playStart = true;

                    outputDev->start(&outputFile);

                    playTimeThread->start();

                    connect(outputDev, &QAudioOutput::stateChanged, [=] {

                        this->handleOutDevState(outputDev->state(), device);

                    });

                }

            }else{

                qDebug()<<"File not exits!";

                btn->setText("播放");

            }

        }else{

            btn->setText("播放");

            if(!reFormatOutputDev){

                format.setChannelCount(SINGLE_CHANNEL);

                dateRate = (SAMPLE_RATE * SINGLE_CHANNEL * SAMPLE_SIZE / 8);

                reFormatOutputDev = true;

                emit btn->clicked();  //call playAudio();

            }else{

                showDialog();

            }

        }

    }else{

        btn->setText("播放");

        closeOutDev();

    }

}

触摸

命令查看坐标 hexdump dev/input/event6

#include "touch.h" 

Touch::Touch(QWidget *parent): QWidget(parent)

{

}

void Touch::initWindow(int w, int h)

{

    point = common.getLabel("当前坐标:");

    point->setAlignment(Qt::AlignCenter);

    passBtn = common.getButton("测试通过");

    failBtn = common.getButton("测试失败");

    failBtn->setStyleSheet(failBtn->styleSheet()+"QPushButton{background-color:#f56c6c}");

    connect(passBtn, &QPushButton::clicked, [=] {this->handleClick(true);});

    connect(failBtn, &QPushButton::clicked, [=] {this->handleClick(false);});

    QVBoxLayout *layout = new QVBoxLayout;

    layout->setMargin(0);

    layout->setSpacing(0);

    QHBoxLayout *hlayout = new QHBoxLayout;

    hlayout->setMargin(0);

    layout->addWidget(point, Qt::AlignCenter);

    hlayout->addWidget(passBtn, Qt::AlignBottom);

    hlayout->addWidget(failBtn, Qt::AlignBottom);

    layout->addLayout(hlayout);

    this->setLayout(layout);

    this->resize(w, h);

    point->setAttribute(Qt::WA_AcceptTouchEvents);

    point->installEventFilter(this);

    point->resize(w,h);

    this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::CustomizeWindowHint);

    point->setStyleSheet("QLabel{border: 1px solid #07a5ff; border-radius: 1px; padding:0px}");

}

bool Touch::eventFilter(QObject *watched, QEvent *event)

{

    if(watched == point){

        switch (event->type()){

            case QEvent::TouchBegin:

                return handleTouchBegin(event);

            case QEvent::TouchUpdate:

                return handleTouchUpdate(event);

            case QEvent::TouchEnd:

                return handleTouchEnd(event);

            default:

                return false;

            }

    }

    return false;

}

bool Touch::handleTouchBegin(QEvent *event)

{

    QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);

    QList<QTouchEvent::TouchPoint> touchStartPoints = touchEvent->touchPoints();

    QPoint startPoint = touchStartPoints.at(0).screenPos().toPoint();

    x = startPoint.x();

    y = startPoint.y();

    point->setText("当前坐标:"+QString::number(x)+","+QString::number(y));

    point->update();

    path.moveTo(x,y);

    return true;

}

bool Touch::handleTouchUpdate(QEvent *event)

{

    QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);

    QList<QTouchEvent::TouchPoint> touchStartPoints = touchEvent->touchPoints();

    QPoint startPoint = touchStartPoints.at(0).screenPos().toPoint();

    x1 = startPoint.x();

    y1 = startPoint.y();

    point->setText("当前坐标:"+QString::number(x1)+","+QString::number(y1));

    point->update();

    path.lineTo(x1,y1);

    return true;

}

bool Touch::handleTouchEnd(QEvent *event)

{

    point->setText("当前坐标:");

    //clean old path

    //path.clear();

    return true;

}

void Touch::paintEvent(QPaintEvent *)

{

    QPainter painter(this);

    painter.setPen(Qt::blue);

    painter.drawPath(path);

}

void Touch::handleClick(bool result)

{

    testResult = result;

    //update config file state

    common.setConfig("tp", "state", QString::number(result));

    this->close();

    emit testFinish();

}

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值