//包头
/*========================================================================================================
* 结构定义:RE_ReqGetRadarDetectTargetInfo_t
* 用 途:雷达分包数包头信息
* 消息类型:
* 备 注:
========================================================================================================*/
struct ImagePackageHeader_t
{
unsigned long uTransPackageSize; //当前包大小
unsigned long uDataSize; //数据总大小
unsigned long uDataPackageNum; //数据被分成包的个数
unsigned long uDataPackageCurrIndex; //数据包当前的帧号
unsigned long uDataPackageOffset; //数据包在整个数据中的偏移
unsigned long lImageWidth; // 图像宽
unsigned long lImageHeight; // 图像高
};
/*========================================================================================================
* 结构定义:RE_ReqRadarImageDataInfo_t
* 用 途:获取当前雷达仿真目标图像
* 消息类型:
* 备 注:
========================================================================================================*/
struct RE_ReqRadarImageDataInfo_t
{
long lPlatformID; // 来自哪个平台探测的目标
ImagePackageHeader_t stImagePackageHeader; //发送包头的信息
sequence<octet,IMAGE_SEQUENCE_MAX_LENGTH> seqImageDatas;
};
// 发送图像
{
const unsigned int nDDSMaxSize = 20000; //定义DDS一次最大发送多少数据
QScreen * pScreenshot = QGuiApplication::primaryScreen();
HWND hRadarWindow = FindWindowA(NULL, "Ondulus Radar Display");
if(NULL == hRadarWindow)
{
printf("Find Radar Window handle Errno !");
return false;
}
QPixmap mRadarWindowImage = pScreenshot->grabWindow(WId(hRadarWindow)); //保存雷达窗口的图像
mRadarWindowImage = mRadarWindowImage.copy(143, 140, mRadarWindowImage.width() - 285, mRadarWindowImage.height() - 280);
pstDetectTargetInfo = TS_Data::RE_ReqRadarImageDataInfo_tTypeSupport::create_data();
pstDetectTargetInfo->seqImageDatas.maximum(TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);
//发送图像数据
QBuffer qtbuffer;
qtbuffer.open(QIODevice::ReadWrite);
mRadarWindowImage.save(&qtbuffer, "jpg");
int nDataLength = qtbuffer.data().size();//图片Byte大小,即表示图片大小
const char * wDataBuffer = qtbuffer.data().data(); //将QByteArray数据类型转换
int nPacketNum = 0; //该图片一共分了多少个包发送
int nlastPaketSize = 0;//最后一个包的大小
nPacketNum = nDataLength / nDDSMaxSize;//nDDSMaxSize定义一个包的大小
nlastPaketSize = nDataLength % nDDSMaxSize;//最后一个包的大小
int nCurrentPacketIndex = 0;//当前包的ID
if(nlastPaketSize != 0)//如果最后一个包不是空,
nPacketNum = nPacketNum + 1;//总包数+1,即数据不满也算一个包
PackageHeader packageHead;//定义一个包头,方便接收的时候区分
packageHead.uDataSize = nDataLength;//数据总大小
packageHead.uDataPackageNum = nPacketNum;//图片被分成几个包发送
while(nCurrentPacketIndex < nPacketNum)//当前包的ID小于总的包数,说明没传完数据,即可以继续传
{
char wFrameBuffer[1024 * 100];
memset(wFrameBuffer, 0, 1024 * 100);//清零
if(nCurrentPacketIndex < (nPacketNum - 1))//数据量够nDDSMaxSize的长度,也就是此时不是发的最后一个包
{
packageHead.uTransPackageSize = nDDSMaxSize;//当前包大小
packageHead.uDataPackageCurrIndex = nCurrentPacketIndex + 1;//当前包ID默认是0,+1使开始ID为1
packageHead.uDataPackageOffset = nCurrentPacketIndex * nDDSMaxSize;//偏移量
memcpy(wFrameBuffer, wDataBuffer + packageHead.uDataPackageOffset, nDDSMaxSize);//将数据部分赋值给容器
//发送数据 数据保存在wFrameBuffer中
pstDetectTargetInfo->seqImageDatas.ensure_length(packageHead.uTransPackageSize, TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);
DDS_Octet* pContBuff = pstDetectTargetInfo->seqImageDatas.get_contiguous_buffer();
for(int i = 0; i < packageHead.uTransPackageSize; i++)
pContBuff[i] = wFrameBuffer[i];
nCurrentPacketIndex++;
pstDetectTargetInfo->stImagePackageHeader.uDataSize = nDataLength;
pstDetectTargetInfo->stImagePackageHeader.uTransPackageSize = packageHead.uTransPackageSize;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageCurrIndex = packageHead.uDataPackageCurrIndex;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageOffset = packageHead.uDataPackageOffset;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageNum = packageHead.uDataPackageNum;
pstDetectTargetInfo->stImagePackageHeader.lImageHeight = mRadarWindowImage.height();
pstDetectTargetInfo->stImagePackageHeader.lImageWidth = mRadarWindowImage.width();
m_opubReqSendRadarCurImageInfo.SendData(pstDetectTargetInfo);
}
//这个部分发送的是最后一个包,有可能是不够一个包长度的
else
{
//当前包大小(最后一个包的大小)包头大小?+?剩余数据的大小
packageHead.uTransPackageSize = nDataLength - nCurrentPacketIndex * nDDSMaxSize;
//数据包当前的帧号
packageHead.uDataPackageCurrIndex = nCurrentPacketIndex + 1;
//数据包在整个数据中的偏移
packageHead.uDataPackageOffset = nCurrentPacketIndex * nDDSMaxSize;
//memcpy(wFrameBuffer, &packageHead, sizeof(PackageHeader));//将包头赋值给char*
//将数据体的一个包的长度赋值给cahr*
memcpy(wFrameBuffer, wDataBuffer + packageHead.uDataPackageOffset, nDataLength - nCurrentPacketIndex * nDDSMaxSize);
pstDetectTargetInfo->seqImageDatas.ensure_length(packageHead.uTransPackageSize , TS_Data::IMAGE_SEQUENCE_MAX_LENGTH);
DDS_Octet* pContBuff = pstDetectTargetInfo->seqImageDatas.get_contiguous_buffer();
for(int i = 0; i < packageHead.uTransPackageSize; i++)
pContBuff[i] = wFrameBuffer[i];
nCurrentPacketIndex++;
pstDetectTargetInfo->stImagePackageHeader.uDataSize = nDataLength;
pstDetectTargetInfo->stImagePackageHeader.uTransPackageSize = packageHead.uTransPackageSize;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageCurrIndex = packageHead.uDataPackageCurrIndex;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageOffset = packageHead.uDataPackageOffset;
pstDetectTargetInfo->stImagePackageHeader.uDataPackageNum = packageHead.uDataPackageNum;
pstDetectTargetInfo->stImagePackageHeader.lImageHeight = mRadarWindowImage.height();
pstDetectTargetInfo->stImagePackageHeader.lImageWidth = mRadarWindowImage.width();
m_opubReqSendRadarCurImageInfo.SendData(pstDetectTargetInfo);
}
}
TS_Data::RE_ReqRadarImageDataInfo_tTypeSupport::delete_data(pstDetectTargetInfo);
return true;
}
// 接收图像
if ( 0 == stRadarImageData.stImagePackageHeader.uDataSize )
return false;
PackageHeader stPackageHead;
stPackageHead.uTransPackageSize = stRadarImageData.stImagePackageHeader.uTransPackageSize;
stPackageHead.uDataSize = stRadarImageData.stImagePackageHeader.uDataSize;
stPackageHead.uDataPackageNum = stRadarImageData.stImagePackageHeader.uDataPackageNum;
stPackageHead.uDataPackageCurrIndex = stRadarImageData.stImagePackageHeader.uDataPackageCurrIndex;
stPackageHead.uDataPackageOffset = stRadarImageData.stImagePackageHeader.uDataPackageOffset;
QByteArray data((char *)stRadarImageData.seqImageDatas.get_contiguous_buffer(), stRadarImageData.seqImageDatas.length());
static int iNum = 1;
static uint uiSize = 0;
if ( stPackageHead.uDataPackageCurrIndex == iNum )//判断是否是第几个包
{
iNum++;
uiSize += stPackageHead.uTransPackageSize;
//如果当前包数据超过1024*100,说明数据过大,不是需要的数据
if ( uiSize > 1024 * 100 )
{
iNum = 1;
uiSize = 0;
return false;
}
//如果当前包数据偏移量超过1024*100,说明数据过大,不是需要的数据
if ( stPackageHead.uDataPackageOffset > 1024 * 100 )
{
stPackageHead.uDataPackageOffset = 0;
iNum = 1;
uiSize = 0;
return false;
}
memcpy(s_wImageFramBuff + stPackageHead.uDataPackageOffset, data.data(), stPackageHead.uTransPackageSize);//将数据部分赋值到数据容器里
}
else
{
iNum = 1;
uiSize = 0;
memset(s_wImageFramBuff, 0, sizeof(char) * 1024 * 100);
return false;
}
if ( (stPackageHead.uDataPackageNum == stPackageHead.uDataPackageCurrIndex) && (uiSize == stPackageHead.uDataSize) )
{
QByteArray RadarImagedata(s_wImageFramBuff, stPackageHead.uDataSize);
static QImage image;
image.loadFromData(RadarImagedata, "jpg");
IteractController::s_pRadarImage = ℑ
iNum = 1;
uiSize = 0;
memset(s_wImageFramBuff, 0, sizeof(char) * 1024 * 100);
return true;
}
return true;