Go to the documentation of this file.00001
00036 #ifdef WIN32
00037 #ifndef WIN32_LEAN_AND_MEAN
00038 #define WIN32_LEAN_AND_MEAN 1
00039 #endif
00040
00041 #include <windows.h>
00042 #include <winsock2.h>
00043 #else
00044 #include <unistd.h>
00045 #include <netdb.h>
00046 #include <sys/socket.h>
00047 #include <netinet/in.h>
00048 #include <arpa/inet.h>
00049 #endif
00050
00051 #include <stdio.h>
00052 #include <stdlib.h>
00053 #include <string>
00054 #include <fstream>
00055 #include <iostream>
00056 #include <iomanip>
00057
00058 #include <errno.h>
00059 #include <string.h>
00060
00061 #include <LibMultiSense/details/utility/Portability.hh>
00062 #include <LibMultiSense/MultiSenseChannel.hh>
00063
00064 #include <LibMultiSense/details/utility/BufferStream.hh>
00065 #include <LibMultiSense/details/wire/Protocol.h>
00066 #include <LibMultiSense/details/wire/SysNetworkMessage.h>
00067
00068 #include <Utilities/portability/getopt/getopt.h>
00069
00070 namespace {
00071
00072 void usage(const char *programNameP)
00073 {
00074 fprintf(stderr, "USAGE: %s [<options>]\n", programNameP);
00075 fprintf(stderr, "Where <options> are:\n");
00076 fprintf(stderr, "\t-a address : MultiSense IP Address (default=10.66.171.21)\n");
00077 fprintf(stderr, "\t-h height : Imager width, in px (default=544)\n");
00078 fprintf(stderr, "\t-w width : Imager height, in px (default=1024)\n");
00079 fprintf(stderr, "\t-m mode : Imager crop mode, (default=0)\n");
00080 fprintf(stderr, "\t 0 = No change sent\n");
00081 fprintf(stderr, "\t 2000 = Switch to CMV2000 ROI\n");
00082 fprintf(stderr, "\t 4000 = Switch to CMV4000 ROI\n");
00083 fprintf(stderr, "\t-o offset : Position of cropped ROI, in px from bottom of image\n");
00084 fprintf(stderr, "\t -1 = No change sent\n");
00085 fprintf(stderr, "\t 0 = ROI is bottom of CMV4000 FOV\n");
00086 fprintf(stderr, "\t 480 = ROI is center of CMV4000 FOV, assuming full resolution\n");
00087 fprintf(stderr, "\t 960 = ROI is top of CMV4000 FOV, assuming full resolution\n");
00088
00089 exit(-1);
00090 }
00091
00092 };
00093
00094 using namespace crl::multisense;
00095
00096 int main(int argc,
00097 char **argvPP)
00098 {
00099 std::string currentAddress = "10.66.171.21";
00100 int32_t height = 544;
00101 uint32_t width = 1024;
00102 int mode = 0;
00103 int offset = -1;
00104
00105
00106
00107
00108 int c;
00109
00110 while(-1 != (c = getopt(argc, argvPP, "a:h:w:m:o:")))
00111 switch(c) {
00112 case 'a': currentAddress = std::string(optarg); break;
00113 case 'h': height = atoi(optarg); break;
00114 case 'w': width = atoi(optarg); break;
00115 case 'm': mode = atoi(optarg); break;
00116 case 'o': offset = atoi(optarg); break;
00117 default: usage(*argvPP); break;
00118 }
00119
00120
00121
00122
00123 Channel *channelP = Channel::Create(currentAddress);
00124 if (NULL == channelP) {
00125 std::cerr << "Failed to establish communications with \"" << currentAddress << "\"" << std::endl;
00126 return -1;
00127 }
00128
00129
00130
00131
00132 Status status;
00133 system::VersionInfo v;
00134
00135 status = channelP->getVersionInfo(v);
00136 if (Status_Ok != status) {
00137 std::cerr << "Failed to query sensor version: " << Channel::statusString(status) << std::endl;
00138 goto clean_out;
00139 }
00140
00141 std::cout << "API build date : " << v.apiBuildDate << "\n";
00142 std::cout << "API version : 0x" << std::hex << std::setw(4) << std::setfill('0') << v.apiVersion << "\n";
00143 std::cout << "Firmware build date : " << v.sensorFirmwareBuildDate << "\n";
00144 std::cout << "Firmware version : 0x" << std::hex << std::setw(4) << std::setfill('0') << v.sensorFirmwareVersion << "\n";
00145 std::cout << "Hardware version : 0x" << std::hex << v.sensorHardwareVersion << "\n";
00146 std::cout << "Hardware magic : 0x" << std::hex << v.sensorHardwareMagic << "\n";
00147 std::cout << "FPGA DNA : 0x" << std::hex << v.sensorFpgaDna << "\n";
00148 std::cout << std::dec;
00149
00150 if (v.sensorFirmwareVersion < 0x0305) {
00151 if (mode != 0 || offset >= 0) {
00152 std::cerr << "Changing crop mode of a CMV4000 imager requires v3.5 or greater, sensor is " <<
00153 "running v" << (v.sensorFirmwareVersion >> 8) << "." << (v.sensorFirmwareVersion & 0xff) << std::endl;
00154 goto clean_out;
00155 }
00156 }
00157
00158
00159
00160
00161 {
00162 image::Config cfg;
00163
00164 status = channelP->getImageConfig(cfg);
00165 if (Status_Ok != status) {
00166 std::cerr << "Failed to get image config: " << Channel::statusString(status) << std::endl;
00167 goto clean_out;
00168 } else {
00169 if (mode != 0) {
00170 cfg.setCamMode(mode);
00171 }
00172
00173 cfg.setResolution(width, height);
00174
00175 if (offset >= 0) {
00176 cfg.setOffset(offset);
00177 }
00178
00179 status = channelP->setImageConfig(cfg);
00180 if (Status_Ok != status) {
00181 std::cerr << "Failed to configure sensor: " << Channel::statusString(status) << std::endl;
00182 goto clean_out;
00183 }
00184 }
00185 }
00186
00187 clean_out:
00188
00189 Channel::Destroy(channelP);
00190 return 0;
00191 }