mirror of http://192.168.1.51:8099/lmh188/twain3.0
1.GScanO200 类针对G200机器 增加从硬件读取横纵修正系数,并应用于原图修正;
2.内存优化,popimage接口调整;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
This commit is contained in:
parent
b84ef9c843
commit
639a175a17
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue