#include #include #include #include "ap_utils.h" #include #include "convolve.h" #include "../../globals/tbGlobals.h" Luma_frameInfo readParaFile(const char* file) { std::ifstream inputFile(file); Luma_frameInfo frameInfo; std::string strLineTxt; int data; getline(inputFile, strLineTxt); //XL sscanf(strLineTxt.c_str(), "XL:%d", &data); frameInfo.L = (uint16_t)data; getline(inputFile, strLineTxt); //XR getline(inputFile, strLineTxt); //TL sscanf(strLineTxt.c_str(), "TL:%d", &data); frameInfo.T = (uint16_t)data; getline(inputFile, strLineTxt); //TR getline(inputFile, strLineTxt); //W sscanf(strLineTxt.c_str(), "W:%d", &data); frameInfo.W = (uint16_t)data; getline(inputFile, strLineTxt); //H sscanf(strLineTxt.c_str(), "H:%d", &data); frameInfo.H = (uint16_t)data; getline(inputFile, strLineTxt); //FrmNO sscanf(strLineTxt.c_str(), "FrmNO:%x", &data); frameInfo.FrmNo = (uint32_t)data; getline(inputFile, strLineTxt); //TimStp sscanf(strLineTxt.c_str(), "TimStp:%x", &data); frameInfo.TimeStamp = (uint32_t)data; getline(inputFile, strLineTxt); //EncInfo sscanf(strLineTxt.c_str(), "EncInfo:%x", &data); frameInfo.encInfo = (uint32_t)data; inputFile.close(); return frameInfo; } std::vector readTestFile( const char* file, int* winSize) { std::ifstream inputFile(file); int winW = 0; std::string strLineTxt; getline(inputFile, strLineTxt); sscanf(strLineTxt.c_str(), "%x", &winW); int size = 0; std::vector testData; Luma_rgnData a_line; while(getline(inputFile, strLineTxt)) { if (strLineTxt.empty()) continue; if(size == 0) { int winRdx, y, Rid, Flag, PeakRltvRdx; sscanf(strLineTxt.c_str(), "%04x %04x %04x %01x %02x", &winRdx, &y, &Rid, &Flag, &PeakRltvRdx); a_line.WinRdx = (uint16_t)winRdx; a_line.y = (uint16_t)y; a_line.Rid = (uint16_t)Rid; a_line.Flag = (uint8_t)Flag; a_line.PeakRltvRdx = (uint8_t)PeakRltvRdx; for(int n = 0; n < RGN_DATA_WIN_SIZE; n ++) a_line.data[n] = 0; size = 1 ; } else //receive Data { int data; sscanf(strLineTxt.c_str(), "%02x", &data); a_line.data[size -1] = (uint8_t)data; if(size >= 16) { testData.push_back(a_line); size = 0; } else size ++; } } inputFile.close(); return testData; } void genTestSream( std::vector& srcData, hls::stream& inStream, const Luma_frameInfo FrmInfo) { RgnPix VSync = {0,0,0,0,0,0,0}; ap_uint<32> data_32; //1st:FrmNo data_32 = FrmInfo.FrmNo; VSync.Sync = 0b10; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinRid(7,0) = data_32.range(31,24); inStream.write(VSync); //2nd:FrmNo data_32 = FrmInfo.TimeStamp; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinRid(7,0) = data_32.range(31,24); inStream.write(VSync); //3rd:encInfo data_32 = FrmInfo.encInfo; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinRid(7,0) = data_32.range(31,24); inStream.write(VSync); //4th:frmW(12bit), frmH(12bit) ap_uint<16> data16_1, data16_2; data16_1 = FrmInfo.W; data16_2 = FrmInfo.H; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0); inStream.write(VSync); //5th: frmX, WinNum int winNum = (int)srcData.size() + 12; data16_1 = FrmInfo.L; data16_2 = (uint16_t)winNum; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0); inStream.write(VSync); //6th: frmY data16_1 = FrmInfo.T; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = 0; inStream.write(VSync); //output data for(int i = 0, i_max= (int)srcData.size(); i < i_max; i ++) { Luma_rgnData* a_line = &srcData[i]; RgnPix Hsync; Hsync.LazerWinX = (ap_uint<12>)a_line->WinRdx; Hsync.LazerWinY = (ap_uint<12>)a_line->y; Hsync.LazerWinRid = (ap_uint<11>)a_line->Rid; Hsync.LazerWinFlag = (ap_uint<4>)a_line->Flag; Hsync.LazerWinRsv = 0; Hsync.RltvRdx = (ap_uint<8>)a_line->PeakRltvRdx; Hsync.Sync = 0b01; inStream.write(Hsync); for(int j = 0; j < RGN_DATA_WIN_SIZE/2; j ++) { RgnPix a_data = {0,0,0,0,0,0,0}; ap_uint<8> data8_1, data8_2; data8_1 = (ap_uint<8>)a_line->data[j * 2]; data8_2 = (ap_uint<8>)a_line->data[j * 2 + 1]; a_data.LazerWinX(7,0) = data8_1.range(7,0); a_data.LazerWinY(7,0) = data8_2.range(7,0); a_data.Sync = 0b00; inStream.write(a_data); } } //add Last sync data VSync.LazerWinFlag = 0; VSync.LazerWinRid = 0; VSync.LazerWinRsv = 0; VSync.LazerWinX = 0; VSync.LazerWinY = 0; VSync.RltvRdx = 0; VSync.Sync = 0b11; inStream.write(VSync); return; } void convertConvolveStreamToArray( hls::stream& streamData, std::vector& arrayData, uint32_t* FrmNo, uint32_t* timeStamp, uint32_t* encInfo, uint16_t* frameROI_w, uint16_t* frameROI_h, uint16_t* frameROI_x, uint16_t* frameROI_y) { //1st:FrmNo RgnPixConvolve VSync = streamData.read(); ap_uint<32> data_32; data_32(11,0) = VSync.LazerWinX.range(11,0); data_32.range(23,12) = VSync.LazerWinY.range(11,0); data_32.range(31,24) = VSync.LazerWinRid.range(7,0); *FrmNo = (int)data_32; //2nd:timeStamp VSync = streamData.read(); data_32(11,0) = VSync.LazerWinX.range(11,0); data_32.range(23,12) = VSync.LazerWinY.range(11,0); data_32.range(31,24) = VSync.LazerWinRid.range(7,0); *timeStamp = (int)data_32; //3rd:encInfo VSync = streamData.read(); data_32(11,0) = VSync.LazerWinX.range(11,0); data_32.range(23,12) = VSync.LazerWinY.range(11,0); data_32.range(31,24) = VSync.LazerWinRid.range(7,0); *encInfo = (int)data_32; //4th:frmW(12bit), frmH(12bit) VSync = streamData.read(); ap_uint<16> data16_1, data16_2; data16_1 = VSync.LazerWinX; data16_2 = VSync.LazerWinY; *frameROI_w = data16_1; *frameROI_h = data16_2; //5th: frmX, WinNum VSync = streamData.read(); data16_1 = VSync.LazerWinX; data16_2 = VSync.LazerWinY; *frameROI_x = data16_1; uint16_t winNum = (uint16_t)data16_2; //6th: frmY VSync = streamData.read(); data16_1 = VSync.LazerWinX; *frameROI_y = data16_1; //output data for(int i = 0; i < winNum; i ++) { RgnPixConvolve data_in = streamData.read(); Luma_convolveData a_pnt; a_pnt.WinRdx = (uint16_t)data_in.LazerWinX; a_pnt.y = (uint16_t)data_in.LazerWinY; a_pnt.Rid = (uint16_t)data_in.LazerWinRid; a_pnt.Flag = (uint8_t)data_in.LazerWinFlag; a_pnt.pkValue = (uint8_t)data_in.value; a_pnt.nD1 = data_in.nD1; a_pnt.nD2 = data_in.nD2; arrayData.push_back(a_pnt); if(data_in.Sync == 0b11) break; } return; } void writeConvolveData( const char* fileName, std::vector& outData) { std::ofstream sw(fileName); int i_max = outData.size(); for (int i = 0; i < i_max; i++) { char data[250]; #if defined(__linux__) sprintf(data, "%04x %04x %04x %01x %02x", outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].pkValue); #else sprintf_s(data, "%04x %04x %04x %01x %02x", outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].pkValue); #endif sw << data << std::endl; #if defined(__linux__) sprintf(data, "%d",outData[i].nD1); #else sprintf_s(data, "%d",outData[i].nD1); #endif sw << data << std::endl; #if defined(__linux__) sprintf(data, "%d",outData[i].nD2); #else sprintf_s(data, "%d",outData[i].nD2); #endif sw << data << std::endl; } sw.close(); } #define TST_GROUP 3 int main() { #if defined(__linux__) const char* SrcDataPath[TST_GROUP] = { "/home/zengHQ/CamTestData/testSample/PickRgn_C/PickRgn_Rslt/Txt/", "/home/zengHQ/CamTestData/Grp_0/PickRgn_C/PickRgn_Rslt/Txt/", "/home/zengHQ/CamTestData/Grp_1/PickRgn_C/PickRgn_Rslt/Txt/" }; const char* InDataPath[TST_GROUP] = { "/home/zengHQ/CamTestData/testSample/PkCentering/", "/home/zengHQ/CamTestData/Grp_0/PkCentering/", "/home/zengHQ/CamTestData/Grp_1/PkCentering/", }; const char* OutDataPath[TST_GROUP] = { "/home/zengHQ/CamTestData/testSample/Convolve/", "/home/zengHQ/CamTestData/Grp_0/Convolve/", "/home/zengHQ/CamTestData/Grp_1/Convolve/", }; #else const char* SrcDataPath[TST_GROUP] = { "E:/CamTestData/testSample/PickRgn_C/PickRgn_Rslt/Txt/", "E:/CamTestData/Grp_0/PickRgn_C/PickRgn_Rslt/Txt/", "E:/CamTestData/Grp_1/PickRgn_C/PickRgn_Rslt/Txt/" }; const char* InDataPath[TST_GROUP] = { "E:/CamTestData/testSample/PkCentering/", "E:/CamTestData/Grp_0/PkCentering/", "E:/CamTestData/Grp_1/PkCentering/", }; const char* OutDataPath[TST_GROUP] = { "E:/CamTestData/testSample/Convolve/", "E:/CamTestData/Grp_0/Convolve/", "E:/CamTestData/Grp_1/Convolve/", }; #endif int testFileSize[TST_GROUP] = {1, 4, 4}; for(int n = 1; n < TST_GROUP; n ++) { int winSize = 0; int fileSize = testFileSize[n]; for(int fi = 0; fi < fileSize; fi++) { char fileName[200]; char paraFileName[200]; char outFileName[200]; #if defined(__linux__) sprintf(fileName, "%s%d_L_pkCenter.txt", InDataPath[n], fi); sprintf(paraFileName, "%s%d_para_verilog.txt", SrcDataPath[n], fi); sprintf(outFileName, "%s%d_L_convolve.txt", OutDataPath[n], fi); #else sprintf_s(fileName, "%s%d_L_pkCenter.txt", InDataPath[n], fi); sprintf_s(paraFileName, "%s%d_para_verilog.txt", SrcDataPath[n], fi); sprintf_s(outFileName, "%s%d_L_convolve.txt", OutDataPath[n], fi); #endif std::vector testData = readTestFile(fileName, &winSize); Luma_frameInfo framwInfo = readParaFile(paraFileName); //gen test stream hls::stream inStream; genTestSream(testData, inStream, framwInfo); hls::stream OutConvolvePnt; convolve( inStream, OutConvolvePnt ); std::vector outData; uint32_t outFrmNo, outTimeStamp, outEncInfo; uint16_t outROI_w,outROI_h, outROI_x,outROI_y; convertConvolveStreamToArray( OutConvolvePnt, outData, &outFrmNo, &outTimeStamp, &outEncInfo, &outROI_w, &outROI_h, &outROI_x, &outROI_y); writeConvolveData(outFileName, outData); } } printf("done!\n"); }