//Camera_FirewireClass::~Camera_FirewireClass () { // ; //} bool Camera_FirewireClass::Connect(const wxString& camId) { int CamNum, ModeNum; bool retval; wxArrayString Names; std::string str; bool debug = false; wxTextFile *debugfile; int debugstep = 0; if (debug) { debugfile = new wxTextFile(Debug.GetLogDir() + PATHSEPSTR + wxString::Format("PHD_debug_%ld.txt",wxGetLocalTime())); if (debugfile->Exists()) debugfile->Open(); else debugfile->Create(); wxDateTime now = wxDateTime::Now(); debugfile->AddLine(wxString::Format("DEBUG %s %s -- ", APPNAME, FULLVER) + now.FormatDate() + now.FormatTime()); } try { if (debug) { debugfile->AddLine(wxString::Format("1: Init library")); debugfile->Write(); } // Init the TIS library if( ! DShowLib::InitLibrary( "ISB3200016679" ) ) { // license key check wxMessageBox(_T("Cannot initialize ImageCapture library"),_("Error"),wxOK | wxICON_ERROR); return true; } if (debug) { debugfile->AddLine(wxString::Format("2: Create grabber")); debugfile->Write(); } m_pGrabber = new DShowLib::Grabber(); if (debug) { debugfile->AddLine(wxString::Format("3: Find cameras")); debugfile->Write(); } Grabber::tVidCapDevListPtr pVidCapDevList = m_pGrabber->getAvailableVideoCaptureDevices(); if( pVidCapDevList == 0 || pVidCapDevList->empty() ) { wxMessageBox(_("No camera found")); return true; } int NCams = (int) pVidCapDevList->size(); if (debug) { debugfile->AddLine(wxString::Format("4: Found %d cams",NCams)); debugfile->Write(); } // deal with > 1 cam CamNum = 0; if (NCams > 1) { for( Grabber::tVidCapDevList::iterator it = pVidCapDevList->begin(); it != pVidCapDevList->end(); ++it ) { Names.Add(it->toString()); } CamNum = wxGetSingleChoiceIndex(_("Select Camera"),_("Camera"),Names); if (CamNum == -1) return true; } if (debug) { debugfile->AddLine(wxString::Format("5: Open Camera")); debugfile->Write(); } // Open camera retval = m_pGrabber->openDev( pVidCapDevList->at( CamNum ) ); if (!retval) { wxMessageBox(_("Cannot open camera")); return true; } if (debug) { debugfile->AddLine(wxString(pVidCapDevList->at(CamNum).toString())); debugfile->Write(); } if (debug) { debugfile->AddLine(wxString::Format("6: Get Video formats")); debugfile->Write(); } // Get video formats Grabber::tVidFmtListPtr pVidFmtList = m_pGrabber->getAvailableVideoFormats(); if ((pVidFmtList == 0) || pVidFmtList->empty()) { wxMessageBox(_("Cannot get list of video modes")); m_pGrabber->closeDev(); return true; } int NModes = pVidFmtList->size(); if (debug) { debugfile->AddLine(wxString::Format("7: Found %d formats",NModes)); debugfile->Write(); } // Names.Clear(); // ModeNum = 0; wxString Name; // if (NModes > 1) { ModeNum = -1; int i = 0; for( Grabber::tVidFmtList::iterator it = pVidFmtList->begin(); it != pVidFmtList->end(); ++it, i++ ) { // Names.Add(it->toString()); Name = wxString(it->toString()); if (debug) {debugfile->AddLine(wxString(it->toString())); debugfile->Write(); } if (Name.Find("Y800") != wxNOT_FOUND) { ModeNum = i; break; } } //ModeNum = wxGetSingleChoiceIndex(_T("Select Mode"),_T("Mode"),Names); if (ModeNum == -1) { wxMessageBox(_T("Cannot find a Y800 mode")); return true; } // } if (debug) { debugfile->AddLine(wxString::Format("8: Set format %d",ModeNum)); debugfile->Write(); } // Set the video format m_pGrabber->setVideoFormat(pVidFmtList->at(ModeNum)); // Set some more format things if (debug) { debugfile->AddLine(wxString::Format("9: Set FPS")); debugfile->Write(); } // retval = m_pGrabber->setFPS(7.5); // No need to run higher than this // if (!retval) wxMessageBox (_T("Could not set to 7.5 FPS")); if (debug) { debugfile->AddLine(wxString::Format("10: Turn off auto-exposure")); debugfile->Write(); } retval = m_pGrabber->setProperty(CameraControl_Exposure,false); if (!retval) wxMessageBox (_T("Could not turn off auto-exposure")); // Setup the frame handler if (debug) { debugfile->AddLine(wxString::Format("11: Setup frame handler")); debugfile->Write(); } pSink = FrameHandlerSink::create(eY800, 4 ); // not sure why I even need 4... if (pSink == 0) wxMessageBox(_T("Cannot setup frame handler")); if (debug) { debugstep = 1; debugfile->AddLine(wxString::Format("12: Set snap mode")); debugfile->Write(); } pSink->setSnapMode( true ); if (debug) { debugstep = 2; debugfile->AddLine(wxString::Format("12a: Setting SinkType")); debugfile->Write(); } retval = m_pGrabber->setSinkType(pSink); if (!retval) { wxMessageBox("Could not set sink type"); } // Get info I need if (debug) { debugstep = 3; debugfile->AddLine(wxString::Format("12b: Getting name for mode %d",ModeNum)); debugfile->Write(); } Name = wxString(pVidCapDevList->at(CamNum).toString()); if (debug) { debugstep = 4; debugfile->AddLine(_T(" Name: " + Name)); debugfile->Write(); } if (debug) { debugstep = 5; debugfile->AddLine(wxString::Format("12c: Getting size for mode %d",ModeNum)); debugfile->Write(); } SIZE sz = pVidFmtList->at(ModeNum).getSize(); if (debug) {debugstep = 6; debugfile->AddLine(_T("Size found - setting FullSize")); debugfile->Write(); } FullSize = wxSize((int)sz.cx, (int)sz.cy); if (debug) { debugstep = 7; debugfile->AddLine(wxString::Format("Image: %d %d Camera: ",FullSize.GetWidth(),FullSize.GetHeight()) + Name); debugfile->Write(); } // Get the stream prepared, but don't start yet - going to start/stop on each frame grab if (debug) { debugstep = 8; debugfile->AddLine(wxString::Format("13: Prepare Live")); debugfile->Write(); } retval = m_pGrabber->prepareLive(false); // not using their renderer if (!retval) { wxMessageBox("Could not start Live view"); } // Get pointer to the exposure duration functin needed if (debug) { debugfile->AddLine(wxString::Format("14: Get VCD properties")); debugfile->Write(); } tIVCDPropertyItemsPtr pItems = m_pGrabber->getAvailableVCDProperties(); if( pItems != 0 ) { tIVCDPropertyItemPtr pExposureItem = pItems->findItem( VCDID_Exposure ); tIVCDPropertyElementPtr pExposureValueElement = pExposureItem->findElement( VCDElement_Value ); if (pExposureValueElement != 0) { pExposureValueElement->getInterfacePtr(m_pExposureAbs); if (m_pExposureAbs == 0) { wxMessageBox(_("Warning - cannot directly control exposure duration - running in auto-exposure")); m_pGrabber->setProperty(CameraControl_Exposure,true); } else m_pExposureAbs->setValue(0.2); } tIVCDPropertyItemPtr pGainItem = pItems->findItem( VCDID_Gain ); tIVCDPropertyElementPtr pGainValueElement = pGainItem->findElement( VCDElement_Value ); if (pGainValueElement != 0) { pGainValueElement->getInterfacePtr(m_pGain); if (m_pGain == 0) { wxMessageBox(_T("Warning - cannot directly control gain - running in auto-gain")); // m_pGrabber->setProperty(CameraControl_Exposure,true); } else { GainMax = m_pGain->getRangeMax(); long lval = (long) GuideCameraGain * GainMax / 100; if (lval > m_pGain->getRangeMax()) lval = m_pGain->getRangeMax(); else if (lval < m_pGain->getRangeMin()) lval = m_pGain->getRangeMin(); m_pGain->setValue(lval); } } } } // try catch (...) { wxMessageBox(wxString::Format("Fatal error at step %d connecting to TIS camera",debugstep)); if (debug) { debugfile->AddLine(wxString::Format("Failed at %d",debugstep)); debugfile->Write(); debugfile->Close(); } return true; } if (debug) {debugfile->Write(); debugfile->Close(); delete debugfile; } Connected=true; return false; }
unsigned long ICCam::PrintCameraInformation() { if (!isOpen()) { return (RET_FAILED | RET_CAMERA_NOT_OPEN); } // Print device name std::cout << "Device name: " << m_grabber->getDev().toString() << std::endl; std::cout << "Current video format: " << m_grabber->getVideoFormat().toString() << ".\n"; std::cout << "Current frame rate: " << m_grabber->getFrameRate() << std::endl; // Print available video formats if( m_grabber->isVideoNormAvailableWithCurDev() ) { std::cout << "\nSupported Video Norms and Formats: \n"; Grabber::tVidNrmListPtr pVidNrmList = m_grabber->getAvailableVideoNorms(); // List the available video formats for each video norm (PAL, NTSC,...) unsigned int nrmCounter = 0; for( Grabber::tVidNrmList::iterator itNrm = pVidNrmList->begin(); itNrm != pVidNrmList->end(); ++itNrm ) { std::cout << "Video Norm [" << nrmCounter++ << "]: " << itNrm->toString() << std::endl; m_grabber->setVideoNorm( pVidNrmList->at( nrmCounter ) ); // Now retrieve the video formats. Grabber::tVidFmtListPtr pVidFmtList = m_grabber->getAvailableVideoFormats(); if( pVidFmtList == 0 ) { std::cerr << "ICCam::PrintCameraInformation: " << m_grabber->getLastError().toString() << std::endl; return RET_FAILED; } unsigned int fmtCounter = 0; // List the available video formats. for( Grabber::tVidFmtList::iterator itFmt = pVidFmtList->begin(); itFmt != pVidFmtList->end(); ++itFmt ) { std::cout << "\t[" << fmtCounter++ << "] " << itFmt->toString() << std::endl; } std::cout << std::endl << std::endl; } } else { // If the current video capture device does not support video norms, // the available video formats can be retrieved immediately. std::cout << "\nSupported Video Formats: \n"; Grabber::tVidFmtListPtr pVidFmtList = m_grabber->getAvailableVideoFormats(); if( pVidFmtList == 0 ) // No video formats available? { std::cerr << "ICCam::PrintCameraInformation: " << m_grabber->getLastError().toString() << std::endl; return RET_FAILED; } else { unsigned int fmtCounter = 0; // List the available video formats. for( Grabber::tVidFmtList::iterator itFmd = pVidFmtList->begin(); itFmd != pVidFmtList->end(); ++itFmd ) { std::cout << "\t[" << fmtCounter++ << "] " << itFmd->toString() << std::endl; } } } return RET_OK; }