Subversion Repositories seema-scanner

Rev

Rev 20 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "SMCaptureWorker.h"

#include <QCoreApplication>
#include <QTime>
#include <QSettings>

void SMCaptureWorker::setup(){

    // Create cameras
    QSettings settings;
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
    if(iNum0 != -1)
        camera0 = Camera::NewCamera(iNum0,cNum0);

    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
    if(iNum1 != -1)
        camera1 = Camera::NewCamera(iNum1,cNum1);

    // Set camera settings
    CameraSettings cameraSettings;
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
    cameraSettings.gain = 0.0;

    camera0->setCameraSettings(cameraSettings);
    camera1->setCameraSettings(cameraSettings);

    // Read trigger configuration
    QString sTriggerMode = settings.value("trigger/mode", "Hardware").toString();
    if(sTriggerMode == "hardware")
        triggerMode = triggerModeHardware;
    else if(sTriggerMode == "software")
        triggerMode = triggerModeSoftware;
    else
        std::cerr << "SLScanWorker: invalid trigger mode " << sTriggerMode.toStdString() << std::endl;
}


void SMCaptureWorker::doWork(){

    unsigned int k=0;

    QTime time; time.start();

    isWorking = true;

    if(triggerMode == triggerModeHardware){
        camera0->startCapture();
        camera1->startCapture();
    }

    std::vector<Camera*> cameras;
    cameras.push_back(camera0);
    cameras.push_back(camera1);

    // Processing loop
    while(isWorking){

        std::vector<cv::Mat> frameSet;

        CameraFrame frame;

        for(int c=0; c<2; c++){
            if(triggerMode == triggerModeHardware)
                frame = cameras[c]->lockFrame();
            else
                frame = cameras[c]->getSingleFrame();
            cv::Mat frameCV(frame.height, frame.width, CV_8U, frame.memory);
            frameCV = frameCV.clone();
            frameSet.push_back(frameCV);
        }

        //QTest::qSleep(50);

        // Pass frame sequence to decoder
        emit newFrameSet(frameSet);

        // Increase iteration counter
        k += 1;

        std::cout << "Capture worker " << time.restart() << "ms" << std::endl;

//        cv::imwrite("frameSet0.png",frameSet[0]);
//        cv::imwrite("frameSet1.png",frameSet[1]);

        // Process events e.g. check for exit flag
        QCoreApplication::processEvents();

    }

    if(triggerMode == triggerModeHardware){
        for(unsigned int i=0; i<cameras.size(); i++){
            cameras[i]->stopCapture();
        }
    }

    // Emit message to e.g. initiate thread break down
    emit finished();

}

void SMCaptureWorker::stopWorking(){
    isWorking = false;
}


SMCaptureWorker::~SMCaptureWorker(){
    delete camera0;
    delete camera1;
}