38 #ifndef WIN32_LEAN_AND_MEAN 39 #define WIN32_LEAN_AND_MEAN 1 46 #include <arpa/inet.h> 69 volatile bool doneG =
false;
79 void usage(
const char *programNameP)
81 std::cerr <<
"USAGE: " << programNameP <<
" [<options>]" << std::endl;
82 std::cerr <<
"Where <options> are:" << std::endl;
83 std::cerr <<
"\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
84 std::cerr <<
"\t-m <mtu> : MTU to set the camera to (default=7200)" << std::endl;
85 std::cerr <<
"\t-r <head_id> : remote head ID (default=0)" << std::endl;
91 BOOL WINAPI signalHandler(DWORD dwCtrlType)
98 void signalHandler(
int sig)
107 if (head_str ==
"VPB")
111 else if (head_str ==
"0")
115 else if (head_str ==
"1")
119 else if (head_str ==
"2")
123 else if (head_str ==
"3")
128 fprintf(stderr,
"Error: Unrecognized remote head\n");
129 fprintf(stderr,
"Please use one of the following:\n");
130 fprintf(stderr,
"\tVPB\n");
131 fprintf(stderr,
"\t0'\n");
132 fprintf(stderr,
"\t1\n");
133 fprintf(stderr,
"\t2\n");
134 fprintf(stderr,
"\t3\n");
144 for (
size_t i = 0 ; i < modes.size() ; ++i)
147 if (mode.
width >= best_mode.width && mode.
height >= best_mode.height && mode.
disparities >= best_mode.disparities) {
155 system::DeviceMode target_mode(best_mode.width / 2, best_mode.height / 2, 0, best_mode.disparities);
157 for (
size_t i = 0 ; i < modes.size() ; ++i)
160 if (mode.
width == target_mode.width && mode.
height == target_mode.height && mode.
disparities >= target_mode.disparities) {
168 if (target_mode.supportedDataSources == 0) {
176 std::string
writeMatrix(
const float* data,
size_t width,
size_t height)
178 std::stringstream ss;
179 ss << std::fixed << std::setprecision(6);
181 for (
size_t h = 0 ; h < height ; ++h) {
182 for (
size_t w = 0 ; w < width ; ++w) {
183 ss << data[w + width * h] <<
",";
195 std::stringstream ss;
203 ss <<
"APIVersion," << version.
apiVersion <<
",";
207 ss <<
"exposure," << header.
exposure <<
",";
208 ss <<
"gain," << header.
gain <<
",";
228 bool savePgm(
const std::string& fileName,
231 uint32_t bitsPerPixel,
232 const std::string& comment,
235 std::ofstream outputStream(fileName.c_str(), std::ios::binary | std::ios::out);
237 if (
false == outputStream.good()) {
238 std::cerr <<
"Failed to open \"" << fileName <<
"\"" << std::endl;
242 const uint32_t imageSize = height * width;
244 switch(bitsPerPixel) {
248 outputStream <<
"P5\n" 249 <<
"#" << comment <<
"\n" 250 << width <<
" " << height <<
"\n" 253 outputStream.write(reinterpret_cast<const char*>(dataP), imageSize);
259 outputStream <<
"P5\n" 260 <<
"#" << comment <<
"\n" 261 << width <<
" " << height <<
"\n" 264 const uint16_t *imageP =
reinterpret_cast<const uint16_t*
>(dataP);
266 for (uint32_t i=0; i<imageSize; ++i) {
267 uint16_t o = htons(imageP[i]);
268 outputStream.write(reinterpret_cast<const char*>(&o),
sizeof(uint16_t));
275 outputStream.close();
279 bool savePgm(
const std::string& fileName,
285 const std::string comment = assembledInfoString(header, info, version, calibration);
287 return savePgm(fileName,
299 std::cerr <<
"PPS: " << header.
sensorTime <<
" ns" << std::endl;
306 std::cerr <<
"lidar: " << header.
pointCount << std::endl;
312 UserData *userData =
reinterpret_cast<UserData*
>(userDataP);
314 static int64_t lastFrameId = -1;
316 if (-1 == lastFrameId)
320 userData->deviceInfo,
322 userData->calibration);
329 if (
Status_Ok != userData->channelP->getImageHistogram(header.
frameId, histogram))
330 std::cerr <<
"failed to get histogram for frame " << header.
frameId << std::endl;
338 std::string currentAddress =
"10.66.171.21";
343 SetConsoleCtrlHandler (signalHandler, TRUE);
345 signal(SIGINT, signalHandler);
353 while(-1 != (c =
getopt(argc, argvPP,
"a:m:r:")))
355 case 'a': currentAddress = std::string(
optarg);
break;
356 case 'm': mtu = atoi(
optarg);
break;
357 case 'r': head_id = getRemoteHeadIdFromString(
optarg);
break;
358 default:
usage(*argvPP);
break;
365 if (NULL == channelP) {
366 std::cerr <<
"Failed to establish communications with \"" << currentAddress <<
"\"" << std::endl;
376 std::vector<system::DeviceMode> deviceModes;
390 std::cout <<
"API build date : " << v.
apiBuildDate <<
"\n";
391 std::cout <<
"API version : 0x" << std::hex << std::setw(4) << std::setfill(
'0') << v.
apiVersion <<
"\n";
393 std::cout <<
"Firmware version : 0x" << std::hex << std::setw(4) << std::setfill(
'0') << v.
sensorFirmwareVersion <<
"\n";
396 std::cout <<
"FPGA DNA : 0x" << std::hex << v.
sensorFpgaDna <<
"\n";
397 std::cout << std::dec;
405 operatingMode = getOperatingMode(deviceModes);
419 std::cout <<
"Setting resolution to: " << operatingMode.
width <<
"x" <<
420 operatingMode.
height <<
"x" <<
438 status = channelP->
setMtu(mtu);
471 userData.channelP = channelP;
472 userData.version = v;
473 userData.deviceInfo = info;
474 userData.calibration = calibration;
499 std::cout <<
"Uptime: " << statusMessage.
uptime <<
", " <<
500 "SystemOk: " << statusMessage.
systemOk <<
", " <<
504 "Input Voltage: " << statusMessage.
inputVoltage <<
", " <<
505 "Input Current: " << statusMessage.
inputCurrent <<
", " <<
506 "FPGA Power: " << statusMessage.
fpgaPower <<
", " <<
507 "Logic Power: " << statusMessage.
logicPower <<
", " <<
508 "Imager Power: " << statusMessage.
imagerPower << std::endl;
virtual Status startStreams(DataSource mask)=0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
static const char * statusString(Status status)
static CRL_CONSTEXPR TriggerSource Trigger_Internal
virtual Status stopStreams(DataSource mask)=0
uint64_t sensorHardwareMagic
static Channel * Create(const std::string &sensorAddress)
int main(int argc, char **argvPP)
void setResolution(uint32_t w, uint32_t h)
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
std::string sensorFirmwareBuildDate
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_0
virtual Status getVersionInfo(system::VersionInfo &v)=0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_2
int getopt(int argc, char **argv, char *opts)
int16_t RemoteHeadChannel
static CRL_CONSTEXPR DataSource Source_Lidar_Scan
virtual Status addIsolatedCallback(image::Callback callback, DataSource imageSourceMask, void *userDataP=NULL)=0
float leftImagerTemperature
virtual Status setTriggerSource(TriggerSource s)=0
virtual Status getImageCalibration(image::Calibration &c)=0
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
uint32_t hardwareRevision
virtual Status getDeviceModes(std::vector< system::DeviceMode > &m)=0
static CRL_CONSTEXPR Status Status_Ok
void setDisparities(uint32_t d)
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_1
virtual Status setMtu(int32_t mtu)=0
virtual Status setImageConfig(const image::Config &c)=0
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
VersionType sensorFirmwareVersion
virtual Status getDeviceStatus(system::StatusMessage &status)=0
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
static void Destroy(Channel *instanceP)
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_3
float rightImagerTemperature
uint64_t sensorHardwareVersion
virtual Status getImageConfig(image::Config &c)=0
DataSource supportedDataSources
virtual Status getSensorVersion(VersionType &version)=0
static CRL_CONSTEXPR DataSource Source_All
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Left