int main(int argc, char* argv[]) { // The exit code of the sample application. int exitCode = 0; // Automagically call PylonInitialize and PylonTerminate to ensure the pylon runtime system // is initialized during the lifetime of this object. Pylon::PylonAutoInitTerm autoInitTerm; try { // Declare a local counter used for waiting. int loopCount = 0; // Get the transport layer factory. CTlFactory& tlFactory = CTlFactory::GetInstance(); // Create an instant camera object with the camera device found first. CInstantCamera camera( tlFactory.CreateFirstDevice()); // Print the camera information. cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl; cout << "Friendly Name: " << camera.GetDeviceInfo().GetFriendlyName() << endl; cout << "Full Name : " << camera.GetDeviceInfo().GetFullName() << endl; cout << "SerialNumber : " << camera.GetDeviceInfo().GetSerialNumber() << endl; cout << endl; // For demonstration purposes only, register another configuration event handler that handles device removal. camera.RegisterConfiguration( new CSampleConfigurationEventHandler, RegistrationMode_Append, Cleanup_Delete); // For demonstration purposes only, add a sample configuration event handler to print out information // about camera use. camera.RegisterConfiguration( new CConfigurationEventPrinter, RegistrationMode_Append, Cleanup_Delete); // Open the camera. Camera device removal is only detected while the camera is open. camera.Open(); // Now, try to detect that the camera has been removed: // Ask the user to disconnect a device loopCount = c_loopCounterInitialValue; cout << endl << "Please disconnect the device (timeout " << loopCount / 4 << "s) " << endl; /////////////////////////////////////////////////// don't single step beyond this line (see comments above) // Before testing the callbacks, we manually set the heartbeat timeout to a short value when using GigE cameras. // Since for debug versions the heartbeat timeout has been set to 5 minutes, it would take up to 5 minutes // until detection of the device removal. CHearbeatHelper heartbeatHelper(camera); heartbeatHelper.SetValue(1000); // 1000 ms timeout try { // Get a camera parameter using generic parameter access. GenApi::CIntegerPtr width(camera.GetNodeMap().GetNode("Width")); // The following loop accesses the camera. It could also be a loop that is // grabbing images. The device removal is handled in the exception handler. while ( loopCount > 0) { // Print a "." every few seconds to tell the user we're waiting for the callback. if (--loopCount % 4 == 0) { cout << "."; cout.flush(); } WaitObject::Sleep(250); // Change the width value in the camera depending on the loop counter. // Any access to the camera like setting parameters or grabbing images // will fail throwing an exception if the camera has been disconnected. width->SetValue( width->GetMax() - (width->GetInc() * (loopCount % 2))); } } catch (GenICam::GenericException &e) { if ( camera.IsCameraDeviceRemoved()) { // The camera device has been removed. This caused the exception. cout << endl; cout << "The camera has been removed from the PC." << endl; cout << "The camera device removal triggered an exception:" << endl << e.GetDescription() << endl; } else { // An unexpected error has occurred. // In this example it is handled by exiting the program. throw; } } if ( !camera.IsCameraDeviceRemoved()) cout << endl << "Timeout expired" << endl; /////////////////////////////////////////////////// Safe to use single stepping (see comments above). // Now try to find the detached camera after it has been attached again: // Create a device info object for remembering the camera properties. CDeviceInfo info; // Remember the camera properties that allow detecting the same camera again. info.SetDeviceClass( camera.GetDeviceInfo().GetDeviceClass()); info.SetSerialNumber( camera.GetDeviceInfo().GetSerialNumber()); // Destroy the Pylon Device representing the detached camera device. // It cannot be used anymore. camera.DestroyDevice(); // Ask the user to connect the same device. loopCount = c_loopCounterInitialValue; cout << endl << "Please connect the same device to the PC again (timeout " << loopCount / 4 << "s) " << endl; // Create a filter containing the CDeviceInfo object info which describes the properties of the device we are looking for. DeviceInfoList_t filter; filter.push_back( info); for ( ; loopCount > 0; --loopCount) { // Print a . every few seconds to tell the user we're waiting for the camera to be attached if ( loopCount % 4 == 0) { cout << "."; cout.flush(); } // Try to find the camera we are looking for. DeviceInfoList_t devices; if ( tlFactory.EnumerateDevices(devices, filter) > 0 ) { // Print two new lines, just for improving printed output. cout << endl << endl; // The camera has been found. Create and attach it to the Instant Camera object. camera.Attach( tlFactory.CreateDevice( devices[0])); //Exit waiting break; } WaitObject::Sleep(250); } // If the camera has been found. if ( camera.IsPylonDeviceAttached()) { // Print the camera information. cout << endl; cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl; cout << "Friendly Name: " << camera.GetDeviceInfo().GetFriendlyName() << endl; cout << "Full Name : " << camera.GetDeviceInfo().GetFullName() << endl; cout << "SerialNumber : " << camera.GetDeviceInfo().GetSerialNumber() << endl; cout << endl; // All configuration objects and other event handler objects are still registered. // The configuration objects will parameterize the camera device and the instant // camera will be ready for operation again. // Open the camera. camera.Open(); // Now the Instant Camera object can be used as before. } else // Timeout { cout << endl << "Timeout expired." << endl; } } catch (GenICam::GenericException &e) { // Error handling. cerr << "An exception occurred." << endl << e.GetDescription() << endl; exitCode = 1; } // Comment the following two lines to disable waiting on exit. cerr << endl << "Press Enter to exit." << endl; while( cin.get() != '\n'); return exitCode; }
int main (int argc, char **argv) { if(argc < 2) { fprintf(stdout,"Usage:\n\t%s <conf_file>\n", argv[0]); return 1; } ConfigFile& cf = ConfigFile::GetInstance(); if(!cf.LoadConf(argv[1])) { fprintf(stdout,"load conf file %s error", argv[1]); return 2; } std::string logfile = cf.Value("Global", "LogFile", "./log"); std::string ip = cf.Value("CasdConfig", "Address", "127.0.0.1"); std::string port = cf.Value("CasdConfig", "Port", "12345"); int is_top_camara = atoi(cf.Value("Global", "IsTopCamara", "0").c_str()); int bottom_image_num = atoi(cf.Value("Global", "BottomImageNum", "1").c_str()); int side_image_num = atoi(cf.Value("Global", "SideImageNum", "4").c_str()); casd_client.AddProtocol(PROTOCOL_ID_CSETCAMARASEQREQ, new CSetCamaraSeqReq()); casd_client.AddProtocol(PROTOCOL_ID_CSENDIMAGEPROCESSDATAREQ, new CSendImageProcessDataReq()); if(is_top_camara > 0) { // 非顶部相机需要设置连接回调, 每个物品需要拍摄底部照片和侧边照片 casd_client.SetConnectCB(ConnectCasdCB, &casd_client); gImagesNumPerObj = bottom_image_num + side_image_num; } else { // 顶部相机每个物品只拍摄一张图片, 无需设置连接回调, 当前图片序号永远是固定的 gImagesNumPerObj = 1; gCurImageSeq = atoi(cf.Value("Global", "TopImageSeq", "5").c_str()); } // TODO: 居然还未在tcpclient中加入clog // UVNET::TCPServer::StartLog(LL_DEBUG, "casd", logfile.c_str()); if(!casd_client.Connect(ip.c_str(), atoi(port.c_str()))) { fprintf(stdout, "connect error:%s\n", casd_client.GetLastErrMsg()); } int exitcode = 0; // Before using any pylon methods, the pylon runtime must be initialized. PylonInitialize(); try { CTlFactory& TlFactory = CTlFactory::GetInstance(); CDeviceInfo di; di.SetSerialNumber( "20399956" ); di.SetDeviceClass( BaslerGigEDeviceClass ); IPylonDevice* device = TlFactory.CreateDevice( di ); // Create an instant camera object for the camera device found first. // CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice()); CInstantCamera camera( device ); // For demonstration purposes only, register another image event handler. camera.RegisterImageEventHandler( new CSampleImageEventHandler, RegistrationMode_Append, Cleanup_Delete); // Open the camera device. camera.Open(); // Can the camera device be queried whether it is ready to accept the next frame trigger? if (camera.CanWaitForFrameTriggerReady()) { // Start the grabbing using the grab loop thread, by setting the grabLoopType parameter // to GrabLoop_ProvidedByInstantCamera. The grab results are delivered to the image event handlers. // The GrabStrategy_OneByOne default grab strategy is used. camera.StartGrabbing( GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera); cerr << endl << "Enter \"t\" to trigger the camera or \"e\" to exit and press enter? (t/e)" << endl << endl; // Wait for user input to trigger the camera or exit the program. // The grabbing is stopped, the device is closed and destroyed automatically when the camera object goes out of scope. char key; do { cin.get(key); if ( (key == 't' || key == 'T')) { // Execute the software trigger. Wait up to 500 ms for the camera to be ready for trigger. if ( camera.WaitForFrameTriggerReady( 500, TimeoutHandling_ThrowException)) { camera.ExecuteSoftwareTrigger(); } } } while ( (key != 'e') && (key != 'E')); } else { // See the documentation of CInstantCamera::CanWaitForFrameTriggerReady() for more information. cout << endl; cout << "This sample can only be used with cameras that can be queried whether they are ready to accept the next frame trigger."; cout << endl; cout << endl; } } catch (const GenericException &e) { // Error handling. cerr << "An exception occurred." << endl << e.GetDescription() << endl; exitcode = 1; // Remove left over characters from input buffer. cin.ignore(cin.rdbuf()->in_avail()); } // Comment the following two lines to disable waiting on exit. cerr << endl << "Press Enter to exit." << endl; while( cin.get() != '\n'); // Releases all pylon resources. PylonTerminate(); return exitcode; }