foreach (const QSerialPortInfo &info, BlinkyTape::findBlinkyTapeBootloaders()) {
     report.append("  " + info.portName() + "\r");
     report.append("    Manufacturer: " + info.manufacturer() + "\r");
     report.append("    Description: " + info.description() + "\r");
     report.append("    VID: 0x" + QString::number(info.vendorIdentifier(),16) + "\r");
     report.append("    PID: 0x" + QString::number(info.productIdentifier(),16) + "\r");
 }
 //  Found the available ports, associated vendor id and product id
 foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()){
     if(serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier()){
         if(serialPortInfo.vendorIdentifier() == found_vendorID){
             if(serialPortInfo.productIdentifier() == found_productID){
                 arm_portname = serialPortInfo.portName();
                 arm_port_is_available = true;
             }
         }
     }
 }
Esempio n. 3
0
void StatusBar::setToolTip(const QSerialPort *port)
{

    QSerialPortInfo info = QSerialPortInfo(*port);
    if (info.isValid()) {
        QString deviceInfo = QString("%1 %2\n%3:%4 "
#if QT_VERSION < QT_VERSION_CHECK(5, 3, 0)
                                     )
#else
                                     "# %5")
#endif
                                 .arg(info.manufacturer())
                                 .arg(info.description())
                                 .arg(info.vendorIdentifier())
                                 .arg(info.productIdentifier())
#if QT_VERSION < QT_VERSION_CHECK(5, 3, 0)
                ;
#else
                                 .arg(info.serialNumber());
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // Get list of all serial ports
    QList<QSerialPortInfo> serialInfoList = QSerialPortInfo::availablePorts();
    qDebug();
    if (!serialInfoList.size() > 0)
    {
        qDebug() << "no serial ports found";
        return app.exec();
    }
    else
    {
        qDebug() << "List all serial ports";
        qDebug() << "---------------------";
        for (int i=0; i<serialInfoList.size(); i++)
        {
            QSerialPortInfo serialInfo = serialInfoList.at(i);
            qDebug() << "port: " << i;
            qDebug() << "  name:          " << serialInfo.portName();
            qDebug() << "  description:   " << serialInfo.description();
            qDebug() << "  manufacturer:  " << serialInfo.manufacturer();
            //qDebug() << "  serial Number: " << serialInfo.serialNumber();
            if (serialInfo.hasVendorIdentifier())
            {
                qDebug() << "  vendorId:     " << serialInfo.vendorIdentifier();
            }
            if (serialInfo.hasProductIdentifier())
            {
                qDebug() << "  producId:     " << serialInfo.productIdentifier();
            }
            qDebug();
        }
    }

    qDebug() << "opening panels controller";
    QSerialPortInfo serialInfo = serialInfoList.at(0);
    bias::PanelsController pcontrol(serialInfo);
    bool isOpen = pcontrol.open();
    if (!isOpen)
    {
        qDebug() << "  unable to open device";
        return app.exec();
    }
    qDebug() << "  device opened";

     if (true)
    {
        qDebug() << "  blink led";
        pcontrol.blinkLED();
        QThread::msleep(4000);
    }

    // Test allOn, allOff 
     if (true)
    {
        for (int i=0; i<5; i++)
        {
            qDebug() << "  all on";
            pcontrol.allOn();
            QThread::msleep(500);
            qDebug() << "  all off";
            pcontrol.allOff();
            QThread::msleep(500);
        }
    }

    // Test setToGrayLevel
     if (true)
    {
        for (int i=0; i<2; i++)
        {
            for (int j=1; j<bias::PanelsController::NUM_GRAY_LEVEL; j++)
            {
                qDebug() << "  set to gray level = " << j;
                pcontrol.setToGrayLevel(j);
                QThread::msleep(100);
            }
            for (int j=bias::PanelsController::NUM_GRAY_LEVEL-1; j>=0; j--) 
            {
                qDebug() << "  set to gray level = " << j;
                pcontrol.setToGrayLevel(j);
                QThread::msleep(100);
            }
        }
    }

    // Test setConfigID
     if (true)
    {
        int id = 1;
        qDebug() << "  set config id = " << id;
        pcontrol.setConfigID(id);
        QThread::msleep(1000);
    }


    // Test setPatternID 
    if (true)
    {
        int id = 1;
        qDebug() << "  set pattern id = " << id;
        pcontrol.setPatternID(id);
        QThread::msleep(1000);
    }

    // Test start/stop
     if (true)
    {
        qDebug() << "  start";
        pcontrol.start();
        QThread::msleep(5000);

        qDebug() << "  stop";
        pcontrol.stop();
        QThread::msleep(1000);
    }

    // Test controller reset
     if (true)
    {
        qDebug() << "  reset controller";
        pcontrol.reset(true);

        qDebug() << "  allOn";
        pcontrol.allOn();
        QThread::msleep(1000);
        qDebug() << "  allOff";
        pcontrol.allOff();
        QThread::msleep(1000);
    }

    // Test show bus number
     if (true)
    {
        qDebug() << "  show bus number";
        pcontrol.showBusNumber();
        QThread::msleep(1000);
    }


    // Test set position (not sure how this works??)
     if (false)
    {
        qDebug() << "  test set position";
        pcontrol.stop();
        for (int i=0;i<100;i++)
        {
            qDebug() << "  i = " << i;
            pcontrol.setPosition(i,0);
            pcontrol.start();
            QThread::msleep(500);
            pcontrol.stop();
        }
        pcontrol.stop();
    }

    // Test set gainAndOffset
     if (true)
    {
        qDebug() << "  test set gain and offset";
        pcontrol.setPatternID(1);
        pcontrol.start();
        pcontrol.setGainAndBias(0,0,0,0);

        qDebug() << "  test x gain";
        QThread::msleep(2000);
        pcontrol.setGainAndBias(10,0,0,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(-10,0,0,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,0,0);
        QThread::msleep(500);

        qDebug() << "  test y gain";
        pcontrol.setGainAndBias(0,0,10,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,-10,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,0,0);
        QThread::msleep(500);

        qDebug() << "  test x offset";
        pcontrol.setGainAndBias(0,10,0,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,-10,0,0);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,0,0);
        QThread::msleep(500);

        qDebug() << "  test y offset";
        pcontrol.setGainAndBias(0,0,0,10);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,0,-10);
        QThread::msleep(2000);
        pcontrol.setGainAndBias(0,0,0,0);
        QThread::msleep(500);

        pcontrol.stop();
    }

    // Test set offsets again
    if (true)
    {
        pcontrol.setPatternID(1);
        qDebug() << "  testing y offset";
        int8_t n = 30;
        for (int8_t i=0; i<n; i++)
        {
            pcontrol.stop();
            pcontrol.setGainAndBias(0,0,0,i);
            pcontrol.start();
            QThread::msleep(200);
        }
        for (int8_t i=n; i>-n; i--)
        {
            pcontrol.stop();
            pcontrol.setGainAndBias(0,0,0,i);
            pcontrol.start();
            QThread::msleep(200);
        }
        for (int8_t i=-n; i<1; i++)
        {
            pcontrol.stop();
            pcontrol.setGainAndBias(0,0,0,i);
            pcontrol.start();
            QThread::msleep(200);
        }
        pcontrol.stop();
    }

    pcontrol.close();
    qDebug() << "Press Ctl-C to exit";
    return app.exec();
}
bool BlinkyPendantUploader::startUpload(BlinkyController &controller,
                                        QList<PatternWriter> &patternWriters)
{
    // TODO: push the image conversions into here so they are less awkward.
    #define PIXEL_COUNT 10

    // Probe for the blinkypendant version
    // TODO: Update the firmware first!
    QSerialPortInfo portInfo;
    if (!controller.getPortInfo(portInfo)) {
        errorString = "Couln't get port information!";
        return false;
    }

    int version = getVersionForDevice(portInfo.vendorIdentifier(),
                                      portInfo.productIdentifier());

    QByteArray data;
    if (version == BLINKY_PENDANT_VERSION_1) {
        qDebug() << "Using version 1 upload mechanism, please update firmware!";

        // Make sure we have an image compatible with the BlinkyPendant
        if (patternWriters.front().getLedCount() != 10) {
            errorString = "Wrong pattern size- must be 10 pixels high!";
            return false;
        }
        if (patternWriters.front().getEncoding() != PatternWriter::RGB24) {
            errorString = "Wrong encoding type- must be RGB24!";
            return false;
        }

        if(patternWriters.front().getFrameCount() > 255) {
            errorString = "Pattern too long, must be < 256 frames";
            return false;
        }

        // Create the data structure to write to the device memory
        data.append((char)0x13);    // header
        data.append((char)0x37);
        data.append((char)patternWriters.front().getFrameCount());  // frame count
        data += patternWriters.front().getData();       // image data (RGB24, uncompressed)
    } else {
        // Create the data structure to write to the device memory
        // Animation table

        QByteArray patternData;

        data.append((char)0x31);    // header
        data.append((char)0x23);
        data.append((char)patternWriters.size()); // Number of patterns in the table
        data.append((char)PIXEL_COUNT);     // Number of LEDs in the pattern

        foreach (PatternWriter pattern, patternWriters) {
            // Make sure we have an image compatible with the BlinkyPendant
            if (pattern.getLedCount() != 10) {
                errorString = "Wrong pattern size- must be 10 pixels high!";
                return false;
            }
            if (pattern.getEncoding() != PatternWriter::RGB24) {
                errorString = "Wrong encoding type- must be RGB24!";
                return false;
            }

            if(pattern.getFrameCount() > 65535) {
                errorString = "Pattern too long, must be < 65535 frames";
                return false;
            }

            // Animation entry
            data.append((char)0);             // Encoding type (1 byte) (RGB24, uncompressed) (TODO)
            data += encodeInt(patternData.length());        // Data offset (4 bytes)
            data += encodeWord(pattern.getFrameCount());   // Frame count (2 bytes)
            data += encodeWord(0);                          // Frame delay (2 bytes) TODO

            // Make sure we have an image compatible with the BlinkyPendant
            patternData += pattern.getData();       // image data (RGB24, uncompressed)
        }

        data += patternData;
    }

    // TODO: Check if the data can fit in the device memory

    // Set up the commandQueue using the serial descriptor, and close the tape connection
    controller.close();
    commandQueue.open(portInfo);

    setProgress(0);

    // Queue the following commands:
    // 1. start write
    commandQueue.enqueue(BlinkyPendantCommands::startWrite());

    // 2-n. write data (aligned to 1024-byte sectors, 64 bytes at a time)
    commandQueue.enqueue(BlinkyPendantCommands::writeData(data));

    // n+1 stop write
    commandQueue.enqueue(BlinkyPendantCommands::stopWrite());

    return true;
}