#include #include #include #include #include #include #include #include #include using namespace std; static void signalHandler(int sig) { cerr << endl << "=== SEGFAULT (signal " << sig << ") ===" << endl; exit(1); } static void printNode(Cvb::NodeMapPtr nodeMap, const char* name) { auto node = nodeMap->Node(name); if (!node) { cout << " " << name << " = (not found)" << endl; return; } auto e = std::dynamic_pointer_cast(node); if (e) { cout << " " << name << " = " << e->Value() << endl; return; } auto i = std::dynamic_pointer_cast(node); if (i) { cout << " " << name << " = " << i->Value() << endl; return; } auto b = std::dynamic_pointer_cast(node); if (b) { cout << " " << name << " = " << (b->Value() ? "true" : "false") << endl; return; } cout << " " << name << " = (unknown type)" << endl; } int main() { signal(SIGSEGV, signalHandler); signal(SIGBUS, signalHandler); cout << "=== MechMind CVB Acquisition Test ===" << endl; cout << "CVB: /opt/cvb (14.01.007)" << endl; cout << "Stream type: CompositeStream" << endl; // [1] Discover cout << "\n[1] Discovering..." << endl; auto cameras = Cvb::DeviceFactory::Discover(Cvb::DiscoverFlags::IgnoreVins); if (cameras.empty()) { cerr << "No devices" << endl; return 1; } for (size_t i = 0; i < cameras.size(); i++) { Cvb::String serial{"?"}, model{"?"}; cameras[i].TryGetProperty(Cvb::Driver::DiscoveryProperties::DeviceSerialNumber, serial); cameras[i].TryGetProperty(Cvb::Driver::DiscoveryProperties::DeviceModel, model); cout << " [" << i << "] " << model << " serial=" << serial << endl; } // [2] Open cout << "\n[2] Opening..." << endl; Cvb::DevicePtr device; try { device = Cvb::DeviceFactory::Open( cameras[0].AccessToken(), Cvb::AcquisitionStack::GenTL); } catch (const std::exception& e) { cerr << "Open error: " << e.what() << endl; return 1; } cout << " Opened OK" << endl; auto genDevice = std::dynamic_pointer_cast(device); if (!genDevice) { cerr << "Not GenICamDevice" << endl; return 1; } auto nodeMap = device->NodeMaps()["Device"]; if (!nodeMap) { cerr << "No Device NodeMap" << endl; return 1; } // [3] Read parameters cout << "\n[3] Device parameters:" << endl; printNode(nodeMap, "DeviceScanType"); printNode(nodeMap, "ComponentSelector"); printNode(nodeMap, "PixelFormat"); printNode(nodeMap, "AcquisitionMode"); printNode(nodeMap, "DataAcquisitionMethod"); printNode(nodeMap, "DataAcquisitionTriggerSource"); printNode(nodeMap, "LineScanTriggerSource"); printNode(nodeMap, "TriggerMode"); printNode(nodeMap, "Width"); printNode(nodeMap, "Height"); printNode(nodeMap, "PayloadSize"); printNode(nodeMap, "AcquisitionStatus"); // [4] Get stream cout << "\n[4] Getting stream..." << endl; auto compositeStream = genDevice->Stream(0); if (!compositeStream) { cerr << "No stream" << endl; return 1; } cout << " CompositeStream(0): OK" << endl; // [5] FlowSet info cout << "\n[5] FlowSet info:" << endl; cout << " MinRequiredFlowSetCount = " << compositeStream->MinRequiredFlowSetCount() << endl; auto flowInfo = compositeStream->FlowSetInfo(); cout << " Flows: " << flowInfo.size() << endl; for (size_t i = 0; i < flowInfo.size(); i++) cout << " flow[" << i << "] size=" << flowInfo[i].Size << " alignment=" << flowInfo[i].Alignment << endl; // [6] Pool + Start cout << "\n[6] Starting..." << endl; compositeStream->RegisterManagedFlowSetPool(8); compositeStream->Start(); cout << " Start() OK" << endl; cout << " AcquisitionState = " << static_cast(compositeStream->AcquisitionState()) << endl; // [7] WaitFor loop cout << "\n[7] Waiting for frames (5s max)..." << endl; auto startTime = chrono::steady_clock::now(); int frameCount = 0, timeoutCount = 0; bool gotData = false; while (true) { auto elapsed = chrono::duration_cast( chrono::steady_clock::now() - startTime).count(); if (elapsed >= 5) break; try { Cvb::CompositePtr composite; Cvb::NodeMapEnumerator enumerator; Cvb::WaitStatus waitStatus; std::tie(composite, waitStatus, enumerator) = compositeStream->WaitFor(chrono::milliseconds(500)); if (waitStatus == Cvb::WaitStatus::Ok && composite) { cout << " FRAME #" << ++frameCount << " items=" << composite->ItemCount() << endl; gotData = true; } else if (waitStatus == Cvb::WaitStatus::Timeout) { if (++timeoutCount <= 3) cout << " Timeout #" << timeoutCount << endl; } else if (waitStatus == Cvb::WaitStatus::Abort) { cout << " Abort" << endl; break; } if (frameCount >= 3) break; } catch (const std::exception& e) { cerr << " WaitFor error: " << e.what() << endl; break; } } // [8] Stop cout << "\n[8] Stopping..." << endl; compositeStream->Stop(); cout << " Stopped" << endl; cout << "\n=== Summary ===" << endl; cout << " Frames: " << frameCount << endl; cout << " Timeouts: " << timeoutCount << endl; cout << " Got data: " << (gotData ? "yes" : "no") << endl; cout << "===============" << endl; return 0; }