#include "header/strategies/ScanConversion.h" #include "MainWindow.h" #include #include ScanConversion::ScanConversion(const Context context, const QString kernelPath) : IProcessStrategy(context, kernelPath, "ScanConversion"), _kernelFunctor(KernelFunctor(_kernel)) { _gridPixelXPos = Q_NULLPTR; _gridPixelZPos = Q_NULLPTR; _scanXPos = Q_NULLPTR; _scanZPos = Q_NULLPTR; _gridX = Q_NULLPTR; _gridZ = Q_NULLPTR; _queryX = Q_NULLPTR; _queryZ = Q_NULLPTR; } void ScanConversion::cpuProcess(ScenGenOutput_t parameters) { auto context = _CLContext; auto queue = MainWindow::getInstance()->CLQueue; if(parameters.outputWidth.isUpdated || parameters.outputHeight.isUpdated) { if(_gridPixelXPos) delete[] _gridPixelXPos; if(_gridPixelZPos) delete[] _gridPixelZPos; _gridPixelXPos = new myflt[parameters.outputWidth.value * parameters.outputHeight.value]; _gridPixelZPos = new myflt[parameters.outputWidth.value * parameters.outputHeight.value]; if(_queryX) delete _queryX; if(_queryZ) delete _queryZ; _queryX = _openCLHelper.array2CLBuffer(context, parameters.outputWidth.value * parameters.outputHeight.value * sizeof (myflt)); _queryZ = _openCLHelper.array2CLBuffer(context, parameters.outputWidth.value * parameters.outputHeight.value * sizeof (myflt)); _width = parameters.outputWidth.value; _height = parameters.outputHeight.value; _kernelParameters.width = _width; } if(parameters.depth.isUpdated || parameters.startDepth.isUpdated || parameters.fieldOfView.isUpdated || parameters.steering.isUpdated || parameters.outputWidth.isUpdated || parameters.outputHeight.isUpdated) { auto maxZ = parameters.depth.value; auto minZ = parameters.startDepth.value; auto maxX = parameters.fieldOfView.value / 2; auto minX = -1 * maxX; auto baseZ = (maxZ - minZ) / (parameters.outputHeight.value - 1); auto baseX = (maxX - minX) / (parameters.outputWidth.value - 1); for(auto i = 0; i < parameters.outputHeight.value; i++) { auto temp = i * baseZ; auto tan_result = temp * tan(parameters.steering.value); for(auto j = 0; j < parameters.outputWidth.value; j++) { _gridPixelZPos[i * parameters.outputHeight.value + j] = minZ + temp; _gridPixelXPos[i * parameters.outputHeight.value + j] = minX + (baseX * j) - tan_result; } } queue.enqueueWriteBuffer(*_queryX, CL_TRUE, 0, parameters.outputWidth.value * parameters.outputHeight.value * sizeof (myflt), _gridPixelXPos); queue.enqueueWriteBuffer(*_queryZ, CL_TRUE, 0, parameters.outputWidth.value * parameters.outputHeight.value * sizeof (myflt), _gridPixelZPos); } if(parameters.fieldOfView.isUpdated || parameters.rxLineNo.isUpdated || parameters.rxLineDaz.isUpdated) { if(_scanXPos) delete [] _scanXPos; if(_gridX) delete _gridX; _scanXPos = new myflt[parameters.rxLineNo.value]; for(auto i = 0; i < parameters.rxLineNo.value; i++) { _scanXPos[i] = -parameters.fieldOfView.value / 2 + i * parameters.rxLineDaz.value; } _gridX = _openCLHelper.array2CLBuffer(context, static_cast(parameters.rxLineNo.value) * sizeof (myflt)); queue.enqueueWriteBuffer(*_gridX, CL_TRUE, 0, static_cast(parameters.rxLineNo.value) * sizeof (myflt), _scanXPos); _kernelParameters.gridXSize = parameters.rxLineNo.value; } if(parameters.rxFocusPointNo.isUpdated || parameters.rxPointDax.isUpdated) { if(_scanZPos) delete[] _scanZPos; if(_gridZ) delete _gridZ; _scanZPos = new myflt [parameters.rxFocusPointNo.value]; for(auto i = 0; i < parameters.rxFocusPointNo.value; i++) { _scanZPos[i] = parameters.startDepth.value + i * parameters.rxPointDax.value; } _gridZ = _openCLHelper.array2CLBuffer(context, static_cast(parameters.rxFocusPointNo.value) * sizeof (myflt)); queue.enqueueWriteBuffer(*_gridZ, CL_TRUE, 0, static_cast(parameters.rxFocusPointNo.value) * sizeof (myflt), _scanZPos); _kernelParameters.gridZSize = parameters.rxFocusPointNo.value; } } void ScanConversion::finalize() { delete _gridPixelXPos; delete _gridPixelZPos; delete _scanXPos; delete _scanZPos; delete _gridX; delete _gridZ; delete _queryX; delete _queryZ; _gridPixelXPos = Q_NULLPTR; _gridPixelZPos = Q_NULLPTR; _scanXPos = Q_NULLPTR; _scanZPos = Q_NULLPTR; _gridX = Q_NULLPTR; _gridZ = Q_NULLPTR; _queryX = Q_NULLPTR; _queryZ = Q_NULLPTR; } void ScanConversion::ReadParams(QString path, ScenGenOutput_t *params) { QFile file(path); file.open(QIODevice::ReadOnly); char data[8192]; //first line is extra file.readLine(data, 8192); QString str(data); str = str.remove(str.length() - 1, 1); auto sl = str.split(","); //decode here /***scenario specific code***/ int index = 0; auto temp = sl[index++].PARSE; update_field(¶ms->linear, INP2MYFLT(temp) == 0); temp = sl[index++].PARSE; update_field(¶ms->depth, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->probeRadius, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->fieldOfView, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->startDepth, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->steering, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->rxLineNo, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->rxFocusPointNo, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->rxLineDaz, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->rxPointDax, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->virtualConvex, INP2MYFLT(temp) != 0); temp = sl[index++].PARSE; update_field(¶ms->vcMaxTheta, INP2MYFLT(temp)); temp = sl[index++].PARSE; update_field(¶ms->angle, INP2MYFLT(temp)); /***End of scenario specific code***/ } Image* ScanConversion::processKernel(Image *frames) { Context context = _openCLHelper.getContext(); auto format = frames->getImageInfo(); auto imageOutput = new Image2D(context, CL_MEM_READ_WRITE, ImageFormat(format.image_channel_order, format.image_channel_data_type), _width, _height); cl::EnqueueArgs eargs(MainWindow::getInstance()->CLQueue, cl::NDRange(_width, _height)); _openCLHelper.runKernelFunctor(_kernelFunctor, eargs, *static_cast(frames), *imageOutput, *_gridX, *_gridZ, *_queryX, *_queryZ, _kernelParameters); delete frames; return imageOutput; }