38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
46 #include <arpa/inet.h>
66 #include <MultiSense/MultiSenseChannel.hh>
72 volatile bool doneG =
false;
74 void usage(
const char* programNameP)
76 std::cerr <<
"USAGE: " << programNameP <<
" [<options>]" << std::endl;
77 std::cerr <<
"Where <options> are:" << std::endl;
78 std::cerr <<
"\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
79 std::cerr <<
"\t-m <mtu> : CURRENT MTU (default=1500)" << std::endl;
80 std::cerr <<
"\t-s <color_source> : LEFT,RIGHT,AUX (default=aux)" << std::endl;
86 BOOL WINAPI signalHandler(DWORD dwCtrlType)
93 void signalHandler(
int sig)
103 std::shared_ptr<const ImageBufferWrapper> chroma =
nullptr;
104 std::shared_ptr<const ImageBufferWrapper> luma =
nullptr;
107 std::pair<DataSource, DataSource> colorSource;
110 bool saveColor(
const std::string& fileName,
111 std::shared_ptr<const ImageBufferWrapper> leftRect,
112 std::shared_ptr<const ImageBufferWrapper> leftChromaRect)
114 std::vector<uint8_t> output(leftRect->data().width * leftRect->data().height * 3);
115 ycbcrToBgr(leftRect->data(), leftChromaRect->data(), output.data());
117 io::savePpm(fileName, leftRect->data().width, leftRect->data().height, output.data());
124 UserData* userData =
reinterpret_cast<UserData*
>(userDataP);
127 if (!userData->driver) {
128 std::cerr <<
"Invalid MultiSense channel" << std::endl;
132 if (
header.source == userData->colorSource.first)
134 userData->chroma = std::make_shared<ImageBufferWrapper>(userData->driver, header);
135 if (userData->luma && userData->luma->data().frameId ==
header.frameId)
144 if (
header.source == userData->colorSource.second)
146 userData->luma = std::make_shared<ImageBufferWrapper>(userData->driver, header);
147 if (userData->chroma && userData->chroma->data().frameId ==
header.frameId)
157 if (userData->luma !=
nullptr && userData->chroma !=
nullptr)
164 std::pair<DataSource, DataSource> colorSourceFromArg(
const std::string &srcStr)
170 else if (srcStr ==
"left")
174 else if (srcStr ==
"right")
180 throw std::runtime_error(
"Invalid color source given");
189 std::string currentAddress =
"10.66.171.21";
194 SetConsoleCtrlHandler(signalHandler, TRUE);
196 signal(SIGINT, signalHandler);
204 while (-1 != (c =
getopt(argc, argvPP,
"a:m:s:")))
206 case 'a': currentAddress = std::string(
optarg);
break;
207 case 'm': mtu = atoi(
optarg);
break;
208 case 's': userSource = colorSourceFromArg(
optarg);
break;
209 default:
usage(*argvPP);
break;
217 auto channelP = std::make_unique<ChannelWrapper>(currentAddress);
218 if (
nullptr == channelP ||
nullptr == channelP->ptr()) {
219 std::cerr <<
"Failed to establish communications with \"" << currentAddress <<
"\"" << std::endl;
226 status = channelP->ptr()->setMtu(mtu);
228 status = channelP->ptr()->setBestMtu();
238 status = channelP->ptr()->getImageCalibration(calibration);
248 status = channelP->ptr()->getDeviceInfo(deviceInfo);
259 status = channelP->ptr()->getImageConfig(cfg);
270 status = channelP->ptr()->setImageConfig(cfg);
280 UserData userData{ channelP->ptr(),
nullptr,
nullptr, calibration, deviceInfo, userSource };
285 channelP->ptr()->addIsolatedCallback(imageCallback, userSource.first | userSource.second, &userData);
290 status = channelP->ptr()->startStreams(userSource.first | userSource.second);
300 status = channelP->ptr()->stopStreams(
Source_All);