1.GScanO200 类针对G200机器 增加从硬件读取横纵修正系数,并应用于原图修正;

2.内存优化,popimage接口调整;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
This commit is contained in:
lovelyyoung 2020-05-16 09:50:34 +08:00
parent b84ef9c843
commit 639a175a17
3 changed files with 165 additions and 22 deletions

View File

@ -7,6 +7,10 @@
#include "JpegBuffer.h"
#include "ImageMatQueue.h"
#include "filetools.h"
#include "GetMemoryUsage.h"
#ifndef G200
#include "G400ScanConfig.h"
#endif // !G200
//u32_CMD
typedef enum tagUsbKeyWords : UINT32
@ -72,7 +76,70 @@ typedef enum tagUsbKeyWords : UINT32
//下发序列号命令
SEND_SERIAL = 28,
//获取序列号命令
GET_SERIAL = 29
GET_SERIAL = 29,
//获取滚轴数
GET_ROLLER_NUM=0x1e,
//清零滚轴数
CLR_ROLLER_NUM=0x1f,
//清除扫描总张数
CLR_SCAN_NUM=0x20,
//准备更新固件
PRE_UPGRADE=0X21,
//开始更新固件
START_UPGRADE=0x22,
//彩色的AD参数
RGB_ADI_PARA=0x23,
//灰度的AD参数
ADI_PARA=0x24,
//获取CIS参数曝光时间ad参数)
GET_CIS_PARA=0x25,
//扫描张数
START_COMMAND_COUNT=0x26,
//下发休眠时间
SET_SLEEP_TIME=0x27,
//获取休眠时间
GET_SLEEP_TIME=0x28,
//清除缓存
CLR_CACHE=0x29,
//下发速度模式
SET_SPEED_MODE=0x2a,
//获取扫描速度模式
GET_SPEED_MODE=0X2b,
//设置固件版本一共8个字节
SET_FW_VERSION=0X2c,
//获取DSP版本
GET_DSP_VERSION=0X2d,
//采集板FPGA固件版本
GET_SCANFPGA_VERSION=0x2e,
//电机板FPGA固件版本
GET_MOTORFPGA_VERSION =0X2f,
//设置制造商信息
SET_USB_INFOR_MANUFACTURE=0X30,
//获取制造商信息
GET_USB_INFOR_MANUFACTURE=0X31,
//设置产品型号信息
SET_USB_INFOR_MODEL_NAME=0X32,
//获取产品型号信息
GET_USB_INFOR_MODEL_NAME=0X33,
//设置USB PID / VID信息
SET_USB_INFOR_VIDPID=0X34,
GET_USB_INFOR_VIDPID=0X35,
//设置卡纸急停检测灵敏度
SET_JAM_DETECT_SENSITIVE=0X36,
//获取卡纸急停检测灵敏度
GET_JAM_DETECT_SENSITIVE=0X37,
//设置横向畸变系数
SET_JUST_COF_H=0x38,
//读取横向畸变系数
GET_JUST_COF_H=0x39,
#ifndef G200
CLEAR_HWERROR = 0x40,//G400 清除硬件异常
#endif // !G200
//设置纵向畸变系数
SET_JUST_COF_V = 0x41,
//读取纵向畸变系数
GET_JUST_COF_V
} UsbKeyWords, * PUsbKeyWords;
GScanO200::GScanO200()
@ -133,7 +200,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
}
else {
if (m_pImages->valid()) {
bmpdata = m_pImages->popBmpdata();
bmpdata = *(m_pImages->popBmpdata());
#ifdef LOG_NORMAL
static int aquireindex = 0;
FileTools::write_log("out.txt", "aquire image index " + std::to_string(++aquireindex));
@ -156,11 +223,25 @@ std::string GScanO200::GetFWVersion()
if (m_usb.get() && m_usb->is_connected()) {
lock_guard< mutex> lock(m_imgLocker);
if (fwVersion.empty()) {
#ifndef G200
fwVersion = " ";
USBCB cmd = { GET_FW_VERSION,10,0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], 10);
//std::string ver=fwVersion.substr((fwVersion.length() - 2), 2);
//int verValue = atoi(ver.c_str());
//m_bread_fixed_ratio_fromDSP = verValue >= 15;
//writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio");
//updateHVRatio()
#else // !G200
fwVersion = " ";
USBCB cmd = { GET_FW_VERSION,8,0, };
m_usb->write_bulk(&cmd, sizeof(cmd));
m_usb->read_bulk(&fwVersion[0], 8);
#endif
}
;
return fwVersion;
}
return "";
@ -172,10 +253,19 @@ std::string GScanO200::GetSerialNum()
{
std::lock_guard<std::mutex> lck(m_imgLocker);
if (SerialNum.empty()) {
#ifndef G200
SerialNum = " ";
USBCB usbcb = { GET_SERIAL,14,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], 14);
#else // !G200
SerialNum = " ";
USBCB usbcb = { GET_SERIAL,12,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&SerialNum[0], 12);
#endif
}
return SerialNum;
}
@ -203,8 +293,12 @@ BOOL GScanO200::Get_Scanner_PaperOn()
void GScanO200::config_params(GScanCap& params)
{
if (m_usb.get() && m_usb->is_connected()) {
IConfig cfg;
cfg = hgConfigClass(params);
#ifndef G200
G400ScanConfig cfg = G400ScanConfig(params);
#else
hgConfigClass cfg = hgConfigClass(params);
#endif
gcap = params;
UINT32 cfgdata = cfg.GetData();
USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 };
m_usb->write_bulk(&usbcb, sizeof(USBCB));
@ -219,11 +313,12 @@ void GScanO200::Scanner_StartScan(UINT16 count)
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
m_threadUsb->join();
}
m_pImages->setscanflags(true);
m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this));
m_pImages->run();
m_pImages->setscanflags(true);
}
}
@ -235,6 +330,8 @@ void GScanO200::Stop_scan()
std::lock_guard<std::mutex> lck(m_imgLocker);
USBCB usbcb = { STOP ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_pImages->setscanflags(false);
devState = DEV_STOP;
}
void GScanO200::ResetScanner()
@ -283,6 +380,19 @@ int GScanO200::get_scanned_num()
return usbcb.u32_Count;
}
void GScanO200::clear_hwerror()
{
#ifndef G200
if (m_usb.get() && !m_usb->is_connected())
return;
std::lock_guard<std::mutex> lck(m_imgLocker);
USBCB usbcb = { CLEAR_HWERROR ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
#endif // !G200
}
void GScanO200::usbhotplug_callback(bool isconnect, void* userdata)
{
GScanO200* This = (GScanO200*)userdata;
@ -292,9 +402,27 @@ void GScanO200::usbhotplug_callback(bool isconnect, void* userdata)
void GScanO200::usbhotplug(bool isleft)
{
if (isleft) {
//devState = DEV_WRONG;
//Error_Code = USB_DISCONNECTED;
//m_pImages->setscanflags(false);
devState = DEV_WRONG;
Error_Code = USB_DISCONNECTED;
m_pImages->setscanflags(false);
}
}
void GScanO200::updateHVRatio()
{
if (m_usb.get() && !m_usb->is_connected())
return;
if (m_bread_fixed_ratio_fromDSP) {
USBCB usbcb = { GET_JUST_COF_H ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
float hratio = *((float*)(&usbcb.u32_Data));
usbcb= { GET_JUST_COF_V ,0,0 };
m_usb->write_bulk(&usbcb, sizeof(usbcb));
m_usb->read_bulk(&usbcb, sizeof(usbcb));
float vratio = *((float*)(&usbcb.u32_Data));
writelog("fx: " + to_string(hratio) + " fy :" + to_string(vratio));
m_pImages->updatefixratio(hratio, vratio);
}
}
@ -303,22 +431,32 @@ void GScanO200::usbmain()
std::shared_ptr<std::vector<char>> imgData;
devState = DEV_ISRUNNING;
while (devState == DEV_ISRUNNING) {
if (m_usb.get() && !m_usb->is_connected()) {
//int mmused = GetMemoryUsage::CurrentProcessMemoryInfo();//当前进程内存使用量
//bool need_loop = (m_pImages->getdpi() > 240.0) && mmused >500;//进程内存占用率大于600MB
if ((m_usb.get() && !m_usb->is_connected())) {
this_thread::sleep_for(chrono::milliseconds(200));
continue;
}
if (gcap.resolution_dst == 300.0f && gcap.en_fold) {
if (m_pImages->orginimgcount() > 1)
{
this_thread::sleep_for(chrono::milliseconds(100));
continue;
}
}
USBCB usbcb = Get_Scanner_Status();
switch (usbcb.u32_Data) {
case HAVE_IMAGE:
{
int totalNum = usbcb.u32_Count;
m_usb->set_timeout(1500);
m_usb->set_timeout(2000);
imgData = Get_Img_Data(totalNum);
if (!imgData->size()) {
Stop_scan();
}
m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
#ifdef LOG_NORMAL
static int rawdataindex = 0;

View File

@ -32,15 +32,20 @@ public:
virtual UINT32 get_ErrorCode() override;
virtual void Set_ErrorCode(UINT32 value) override;
virtual int get_scanned_num() override;
virtual void clear_hwerror() override;
private:
static void usbhotplug_callback(bool isleft, void* userdata);
void usbhotplug(bool isleft);
void updateHVRatio();
void usbmain();
USBCB Get_Scanner_Status();
std::shared_ptr<std::vector<char>> Get_Img_Data(int buffersize);
void Pop_Image();
private:
bool m_bread_fixed_ratio_fromDSP;
std::shared_ptr<IUsb> m_usb;
std::unique_ptr<thread> m_threadUsb;
GScanCap gcap;
};

View File

@ -57,7 +57,7 @@ int GScanVirtual::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
}
else {
if (m_pImages->valid()) {
bmpdata = m_pImages->popBmpdata();
bmpdata = *(m_pImages->popBmpdata());
return 0;
}
}