123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- #include <QCoreApplication>
- #include <QFile>
- #include <iostream>
- #include <memory>
- #include <getopt.h>
- #include "carmakercvt.h"
- static char gstr_inputpath[256];
- static char gstr_outputpath[256];
- static char gstr_grpcserver[256];
- void print_useage()
- {
- std::cout<<" -i --input $xodrfile : set input file path. eq. -i d:/lk.xodr"<<std::endl;
- std::cout<<" -o --output $outputfile : set output file. eq. -o d:/test.rd5"<<std::endl;
- std::cout<<" -s --grpcserver set server grpc ip & port. eq. -s 111.33.136.149:50091"<<std::endl;
- std::cout<<" -h --help print help"<<std::endl;
- }
- int GetOptLong(int argc, char *argv[]) {
- int nRtn = 0;
- int opt; // getopt_long() 的返回值
- int digit_optind = 0; // 设置短参数类型及是否需要参数
- (void)digit_optind;
- // 如果option_index非空,它指向的变量将记录当前找到参数符合long_opts里的
- // 第几个元素的描述,即是long_opts的下标值
- int option_index = 0;
- // 设置短参数类型及是否需要参数
- const char *optstring = "i:o:s:h";
- // 设置长参数类型及其简写,比如 --reqarg <==>-r
- /*
- struct option {
- const char * name; // 参数的名称
- int has_arg; // 是否带参数值,有三种:no_argument, required_argument,optional_argument
- int * flag; // 为空时,函数直接将 val 的数值从getopt_long的返回值返回出去,
- // 当非空时,val的值会被赋到 flag 指向的整型数中,而函数返回值为0
- int val; // 用于指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值
- };
- 其中:
- no_argument(即0),表明这个长参数不带参数(即不带数值,如:--name)
- required_argument(即1),表明这个长参数必须带参数(即必须带数值,如:--name Bob)
- optional_argument(即2),表明这个长参数后面带的参数是可选的,(即--name和--name Bob均可)
- */
- static struct option long_options[] = {
- {"input", required_argument, NULL, 'i'},
- {"output", required_argument, NULL, 'o'},
- {"grpcserver", required_argument, NULL, 's'},
- {"help", no_argument, NULL, 'h'},
- // {"optarg", optional_argument, NULL, 'o'},
- {0, 0, 0, 0} // 添加 {0, 0, 0, 0} 是为了防止输入空值
- };
- while ( (opt = getopt_long(argc,
- argv,
- optstring,
- long_options,
- &option_index)) != -1) {
- // printf("opt = %c\n", opt); // 命令参数,亦即 -a -b -n -r
- // printf("optarg = %s\n", optarg); // 参数内容
- // printf("optind = %d\n", optind); // 下一个被处理的下标值
- // printf("argv[optind - 1] = %s\n", argv[optind - 1]); // 参数内容
- // printf("option_index = %d\n", option_index); // 当前打印参数的下标值
- // printf("\n");
- switch(opt)
- {
- case 'i':
- strncpy(gstr_inputpath,optarg,255);
- break;
- case 'o':
- strncpy(gstr_outputpath,optarg,255);
- break;
- case 's':
- strncpy(gstr_grpcserver,optarg,255);
- break;
- case 'h':
- print_useage();
- nRtn = 1; //because use -h
- break;
- default:
- break;
- }
- }
- return nRtn;
- }
- std::string GetFileName(char * strpath)
- {
- int npos = -1;
- int nsize = static_cast<int>(strnlen(strpath,256));
- int i;
- for(i=(nsize-2);i>=0;i--)
- {
- if((strpath[i] == '/')||(strpath[i] == '\\'))
- {
- npos = i+1;
- break;
- }
- }
- std::string strrtn;
- if(npos == -1)
- {
- strrtn = strpath;
- }
- else
- {
- char strname[256];
- strncpy(strname,strpath+npos,256);
- strrtn = strname;
- }
- return strrtn;
- }
- std::string GetServerstr()
- {
- std::string strserverstr = "111.33.136.149:50091";
- QFile xFile;
- xFile.setFileName("carmakerservice.txt");
- if(xFile.open(QIODevice::ReadOnly))
- {
- char str[256];
- xFile.readLine(str,256);
- std::cout<<" open file. server : "<<str<<std::endl;
- strserverstr = str;
- xFile.close();
- }
- return strserverstr;
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- snprintf(gstr_inputpath,256," ");
- snprintf(gstr_outputpath,256," ");
- snprintf(gstr_grpcserver,256," ");
- int nRtn = GetOptLong(argc,argv);
- if(nRtn == 1) //show help,so exit.
- {
- return 0;
- }
- #ifdef TESTC
- snprintf(gstr_inputpath,255,"/home/yuchuli/demodata/lk.xodr");
- snprintf(gstr_outputpath,255,"/home/yuchuli/demodata/lk1.rd5");
- #endif
- if(strncmp(gstr_inputpath , " ",255) == 0)
- {
- std::cout<<"Please use -i set input file path."<<std::endl;
- print_useage();
- return 0;
- }
- char strout[1000];
- snprintf(strout,1000,"Input File Path: %s",gstr_inputpath);
- std::cout<<strout<<std::endl;
- if(strncmp(gstr_outputpath , " ",255) == 0)
- {
- std::cout<<"Please use -o set output file path."<<std::endl;
- print_useage();
- return 0;
- }
- snprintf(strout,1000,"Output File Path: %s",gstr_outputpath);
- std::cout<<strout<<std::endl;
- std::string strinputname = GetFileName(gstr_inputpath);
- std::string stroutputname = GetFileName(gstr_outputpath);
- std::cout<<"input name: "<<strinputname<<std::endl;
- std::string strcmd = "xodr2rd5.exe ";
- strcmd = strcmd + "-i "+strinputname + " -o "+stroutputname;
- std::cout<<"cmd: "<<strcmd<<std::endl;
- std::shared_ptr<char> pstr_ptr = nullptr;
- int ninputsize = 0;
- QFile xFile;
- xFile.setFileName(gstr_inputpath);
- if(xFile.open(QIODevice::ReadOnly))
- {
- QByteArray ba= xFile.readAll();
- ninputsize = ba.size();
- if(ninputsize > 0)
- {
- pstr_ptr = std::shared_ptr<char>(new char[ninputsize]);
- memcpy(pstr_ptr.get(),ba.data(),static_cast<size_t>(ninputsize));
- }
- xFile.close();
- }
- else
- {
- std::cout<<"FATAL Errror. Can't Open input File. Please Check Input File."<<std::endl;
- return -1;
- }
- if(ninputsize == 0)
- {
- std::cout<<"FATAL Error. Input File is empty."<<std::endl;
- return -2;
- }
- std::shared_ptr<char> pout_ptr;
- int noutputsize = 0;
- int nres;
- std::string strserverstr = GetServerstr();
- if(strncmp(gstr_grpcserver , " ",255) != 0)
- {
- strserverstr = gstr_grpcserver;
- }
- std::cout<<" grpcserver: "<<strserverstr<<std::endl;
- carmakercvt * pcvt = new carmakercvt(strserverstr);
- nres = pcvt->GetRes(strinputname,stroutputname,strcmd,pstr_ptr,ninputsize,pout_ptr,noutputsize);
- if(nres != 1)
- {
- std::cout<<" GetRes Fail.Fail Code is: "<<nres<<std::endl;
- if(nres == -1)
- {
- std::cout<<" Convert Fail. Please Check Input File"<<std::endl;
- }
- if(nres == -2)
- {
- std::cout<<" NO Carmaker Service."<<std::endl;
- }
- if(nres == -3)
- {
- std::cout<<" Server Can't Connect."<<std::endl;
- }
- return -3;
- }
- if(noutputsize == 0)
- {
- std::cout<<" Get File size is 0,please check"<<std::endl;
- return -4;
- }
- QFile xFileOut;
- xFileOut.setFileName(gstr_outputpath);
- if(xFileOut.open(QIODevice::ReadWrite))
- {
- xFileOut.write(pout_ptr.get(),noutputsize);
- xFileOut.close();
- }
- else
- {
- std::cout<<" Can't Output data to File. "<<" Output Path: "<<gstr_outputpath<<std::endl;
- return -5;
- }
- return 0;
- return a.exec();
- }
|