567 lines
13 KiB
C++
567 lines
13 KiB
C++
#pragma once
|
||
#include <string>
|
||
#include <functional>
|
||
#include <map>
|
||
#include <opencv2/opencv.hpp>
|
||
|
||
using namespace std;
|
||
|
||
/*****************************************
|
||
* 定义编译版本 *
|
||
* G400/G300 *
|
||
******************************************/
|
||
#define G300
|
||
|
||
//#define CIS_6CH
|
||
#define CIS_3CH
|
||
|
||
#ifdef CIS_6CH
|
||
#undef CIS_3CH
|
||
#elif define CIS_3CH
|
||
#undef CIS_6CHC
|
||
#else
|
||
|
||
#endif
|
||
/******************************************
|
||
* SPEEDMODE==3 60PPM *
|
||
* SPEEDMODE==4 70PPM *
|
||
* SPEEDMODE==5 80PPM *
|
||
*******************************************/
|
||
#define SPEEDMODE 5
|
||
#define MT_DEBUG
|
||
#define COLORSENSOR_SUP
|
||
/*支持低功耗模式开关*/
|
||
#define ENABLE_LOWPOWERMODE
|
||
|
||
/*支持写入系统syslog 功能开关*/
|
||
#define ENLOG_SYSLOG
|
||
|
||
|
||
|
||
#define IMAGE_COLOR 1
|
||
#define IMAGE_GRAY 0
|
||
|
||
#ifdef _LOG
|
||
#define LOG printf
|
||
#else
|
||
#define LOG //printf
|
||
#endif
|
||
|
||
#define FWVERSION "G345230918"
|
||
#define SERIALNUM "HS6010A38001P1"
|
||
|
||
typedef struct
|
||
{
|
||
int s_FRAME_COLOR_SP;
|
||
int s_FRAME_GRAY_SP;
|
||
string FWVERSIO;
|
||
}sp_COLOR_or_GRAY;
|
||
|
||
#define STR(X) #X
|
||
#define CON(a,b) STR(a##b)
|
||
|
||
typedef void (*image_callback)(int element);
|
||
static std::map<int , sp_COLOR_or_GRAY>mapFradme_SP={
|
||
{1,{0x08ED1003,0x1ACC1002,CON(G33Z,240206)}},//30 ppm
|
||
{2,{0x06DB1003,0x14A01002,CON(G34Z,240206)}},//40 ppm
|
||
{3,{0x05591003,0x100E1002,CON(G35Z,240206)}},//50 ppm
|
||
{4,{0x04421003,0x0CD11002,CON(G36Z,240206)}},//60 ppm
|
||
{5,{0x036c1003,0x0A421002,CON(G37Z,240206)}},//70 ppm
|
||
};
|
||
|
||
enum class LedStatus
|
||
{
|
||
Ready,
|
||
Scanning,
|
||
Abnormal,
|
||
NoPaper,
|
||
StopScan,
|
||
CoverOpen,
|
||
Updating,
|
||
UpdateDone
|
||
};
|
||
|
||
struct HG_JpegCompressInfo
|
||
{
|
||
unsigned int error_code;
|
||
unsigned int first_frame;
|
||
unsigned int last_frame;
|
||
unsigned int index_frame;
|
||
unsigned int DataLength;
|
||
unsigned int width;
|
||
unsigned int height;
|
||
unsigned int dpi;
|
||
unsigned char *pJpegData;
|
||
//cv::Mat mat;
|
||
};
|
||
struct HG_JpegCompressInfo_data
|
||
{
|
||
HG_JpegCompressInfo info;
|
||
|
||
unsigned char *pJpegData[1];
|
||
};
|
||
|
||
|
||
struct HG_Msg{
|
||
int code;
|
||
std::string msg;
|
||
};
|
||
|
||
enum class CISVendor
|
||
{
|
||
CIS_UNKNOWUN,
|
||
HUALIN_CIS_V0,
|
||
DUNNAN_CIS_V0,
|
||
DUNNAN_CIS_COLOR_V0
|
||
};
|
||
|
||
enum class PaperSize
|
||
{
|
||
G400_A3 = 0,
|
||
G400_A4,
|
||
G400_A4R,
|
||
G400_A5,
|
||
G400_A5R,
|
||
G400_A6,
|
||
G400_A6R,
|
||
G400_B4,
|
||
G400_B5,
|
||
G400_B5R,
|
||
G400_B6,
|
||
G400_B6R,
|
||
G400_DOUBLELETTER,
|
||
G400_LEGAL,
|
||
G400_LETTER,
|
||
G400_LETTERR,
|
||
G400_LONGLETTER,
|
||
G400_MAXSIZE,
|
||
G400_AUTO,
|
||
G400_MAXAUTO
|
||
};
|
||
|
||
struct HGSize
|
||
{
|
||
unsigned int width;
|
||
unsigned int height;
|
||
|
||
bool operator<(HGSize const &right) const
|
||
{
|
||
if (width < right.width && height < right.height)
|
||
return true;
|
||
return false;
|
||
}
|
||
};
|
||
|
||
|
||
typedef struct Paper_Res
|
||
{
|
||
Paper_Res(unsigned int res,PaperSize papertype):Res(res),PaperType(papertype){}
|
||
Paper_Res():Res(0),PaperType(PaperSize::G400_A4){}
|
||
unsigned int Res;
|
||
PaperSize PaperType;
|
||
friend bool operator<(const struct Paper_Res &a,const struct Paper_Res &b)
|
||
{
|
||
if(a.Res<b.Res || (a.Res==b.Res && a.PaperType < b.PaperType)){
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}PaperRes;
|
||
|
||
|
||
|
||
|
||
union HG_ScanConfiguration
|
||
{
|
||
struct
|
||
{
|
||
unsigned int pageSize : 5;
|
||
unsigned int isColor : 1;
|
||
unsigned int dpi : 2;
|
||
unsigned int doubleFeeded : 1;
|
||
unsigned int enableStable : 1;
|
||
unsigned int enableLed : 1;
|
||
unsigned int enableSizeDetect : 1;
|
||
unsigned int lutmode : 1 ;
|
||
unsigned int slow_moire : 1;
|
||
unsigned int reversed1 : 2;
|
||
unsigned int isCorrect : 1;
|
||
unsigned int dc : 7; //0 - 100
|
||
unsigned int reversed2 : 8;
|
||
} params;
|
||
unsigned int value;
|
||
};
|
||
|
||
union VIDPID
|
||
{
|
||
struct
|
||
{
|
||
unsigned short VID;
|
||
unsigned short PID;
|
||
};
|
||
unsigned int Value;
|
||
};
|
||
|
||
struct ScannerGlue
|
||
{
|
||
ScannerGlue(const std::function<void(const HG_JpegCompressInfo &imginfo)> &imageready, const std::function<void(const int eventID,std::string)> &deviceevent) : m_imageready(imageready), m_deviceevent(deviceevent) {}
|
||
|
||
std::function<void(const HG_JpegCompressInfo &)> m_imageready;
|
||
std::function<void(const int,std::string)> m_deviceevent;
|
||
};
|
||
|
||
|
||
struct V4L2_DATAINFO
|
||
{
|
||
cv::Mat mat;
|
||
unsigned char *data;
|
||
int width;
|
||
int height;
|
||
int pixtype;
|
||
};
|
||
|
||
struct V4L2_DATAINFO_Ex:V4L2_DATAINFO
|
||
{
|
||
unsigned int frame_index; //总帧数
|
||
unsigned int dpi; //dpi
|
||
unsigned int error_code;
|
||
unsigned int first_frame; //第一帧
|
||
unsigned int lost_frame; //丢失帧
|
||
unsigned int last_frame; //最后一帧
|
||
unsigned int snap_end; //采集结束
|
||
};
|
||
|
||
typedef struct CaptureParams
|
||
{
|
||
|
||
int correctColorExposure[2][3];
|
||
int correctColorGain[2][6];
|
||
int correctColorOffset[2][6];
|
||
|
||
int correctGrayExposure[2][3];
|
||
int correctGrayGain[2][6];
|
||
int correctGrayOffset[2][6];
|
||
|
||
int colorExposure[2][3];
|
||
int colorGain[2][6];
|
||
int colorOffset[2][6];
|
||
|
||
int grayExposure[2][3];
|
||
int grayGain[2][6];
|
||
int grayOffset[2][6];
|
||
|
||
int uvCorrectColorExposure[2];
|
||
int uvCorrectGrayExposure[2];
|
||
int uvColorExposure[2];
|
||
int uvGrayExposure[2];
|
||
} CaptureParams;
|
||
|
||
struct ScannerScanInfo
|
||
{
|
||
unsigned int TotalScanned; //扫描总页数
|
||
unsigned int RollerNum;
|
||
unsigned int CuoNum; //搓纸总数
|
||
unsigned int JamInNum; //搓纸失败次数
|
||
unsigned int JamOutNum; //卡纸次数
|
||
unsigned int DoubleNum; //双张次数
|
||
unsigned int ErrorNum; //其他异常次数
|
||
unsigned int HRatio; //横向校正系数
|
||
unsigned int VRatio; //纵向校正系数
|
||
unsigned int SleepTime; //休眠时间 单位s
|
||
unsigned int SpeedMode; //速率模式
|
||
unsigned int VID; //vid
|
||
unsigned short PID; //pid
|
||
std::string SerialNum; //序列号
|
||
std::string FWVersion; //固件版本号
|
||
std::string Token; //token 令牌
|
||
};
|
||
|
||
constexpr char BULK_CTL_PATH[] = "/dev/usb-ffs/mtp/ep0";
|
||
constexpr char BULK_OUT_PATH[] = "/dev/usb-ffs/mtp/ep2";
|
||
constexpr char BULK_IN_PATH[] = "/dev/usb-ffs/mtp/ep1";
|
||
constexpr char BULK_INT_PATH[] = "/dev/usb-ffs/mtp/ep3";
|
||
constexpr char STATE_PATH[] = "/sys/class/android_usb/android0/state";
|
||
|
||
union FLAT_INFO
|
||
{
|
||
struct
|
||
{
|
||
unsigned int dpi:5;
|
||
unsigned int colormode:1;
|
||
unsigned int is_whiteimage:1;
|
||
unsigned int status:8;
|
||
unsigned int reversed:1;
|
||
unsigned int datalen:16;
|
||
}params;
|
||
unsigned int value;
|
||
};
|
||
|
||
#define SLEEP_STATUS_PATH "/mnt/flash-disk/sleep_status.txt"
|
||
#define UPDATE_STATUS_PATH "/mnt/flash-disk/update_status.txt"
|
||
enum scanner_err
|
||
{
|
||
SCANNER_ERR_OK = 0, //设备正常状态
|
||
SCANNER_ERR_SLEEP, //设备处于休眠当中
|
||
SCANNER_ERR_UPDATE_OK, //设备更新:成功
|
||
SCANNER_ERR_UPDATE_UPDATAING, //设备更新:进行中
|
||
SCANNER_ERR_UPDATE_CHECK_VAL_ERROR, //设备更新:校验检测错误
|
||
SCANNER_ERR_UPDATE_CHECK_FILE_LOST, //设备更新:文件丢失
|
||
SCANNER_ERR_UPDATE_UNZIP_FAIL, //设备更新:解压失败
|
||
};
|
||
|
||
|
||
enum ScanEvent {
|
||
S_EVT_NORES = 0x0,
|
||
S_EVT_SCAN_FINISHED = 0x2,
|
||
S_EVT_CLEAR_ERR = 0x03,
|
||
S_EVT_PAPER_PULLOUT = 0x05,
|
||
S_EVT_COVER_OPENED = 0x01,
|
||
S_EVT_COVER_CLOSED = 0x102,
|
||
S_EVT_PAPER_AT_SCAN = 0x08,
|
||
S_EVT_PAPER_NOT_AT_SCAN = 0x106,
|
||
S_EVT_DOUBLEPAPER = 0x110,
|
||
S_EVT_NOT_DOUBLEPAPER = 0x111,
|
||
S_EVT_START_SCAN = 0x45,
|
||
S_EVT_STOP_SCAN = 0x46,
|
||
S_EVT_SCAN_STARTED = 0x112,
|
||
S_EVT_SCAN_STOPPED = 0x113,
|
||
S_EVT_JAM_IN = 0x114,
|
||
S_EVT_JAM_OUT = 0x115,
|
||
S_EVT_SAMPLE_ERR = 0x116,
|
||
S_EVT_COVER_IN_OPEN = 0x117,
|
||
S_EVT_ERROR_PICKING = 0x4,
|
||
S_EVT_ERROR_JAM = 0x8,
|
||
S_EVT_ERROR_DOUBLEPAPER = 0x10,
|
||
S_EVT_ERROR_STAPLE = 0x20,
|
||
S_EVT_ERROR_FPGA = 0x44,
|
||
S_EVT_HAVING_IMAGE = 0x47,
|
||
S_EVT_ONE_PAPER_END = 0x59,
|
||
S_EVT_PAPER_NOT_STANDBY = 0,//?
|
||
S_EVT_PAPER_STANDBY = 0 //?
|
||
};
|
||
|
||
|
||
typedef struct
|
||
{
|
||
int Command;
|
||
int Data;
|
||
int Length;
|
||
} USBCB;
|
||
|
||
enum class USBCommand : unsigned int
|
||
{
|
||
//无命令
|
||
NO_COMMAND = 0,
|
||
//获取dsp 状态
|
||
GET_DSP_STATUS = 1,
|
||
//取图
|
||
GET_IMAGE = 2,
|
||
//销毁DSP中驻存的图
|
||
POP_IMAGE = 3,
|
||
//开始扫描命令
|
||
START_COMMAND = 4,
|
||
//停止扫描命令
|
||
STOP = 5,
|
||
//获取扫描仪扫描模式
|
||
GET_SCAN_MODE = 6,
|
||
//获取固件版本号
|
||
GET_FW_VERSION = 7,
|
||
//返回PC端的状态
|
||
SEND_STATUS_PC = 8,
|
||
//下发扫描配置参数
|
||
CONFIGURED_DATA = 9,
|
||
//下发固件信息
|
||
SEND_FW = 10,
|
||
//获取扫描参数
|
||
GET_CONFIG_DATA = 11,
|
||
//获取扫描总张数
|
||
GET_SCANN_NUM = 12,
|
||
//获取有无纸的状态
|
||
GET_PAPERFEEDER_STATUS = 13,
|
||
//DSP初始化
|
||
INIT_HARDWARE_SYS = 14,
|
||
//下发元器件配置参数(灰度,LED R曝光时间)
|
||
SEND_COMPONENTS_GR = 15,
|
||
//下发元器件配置参数(LED G/B曝光时间)
|
||
SEND_COMPONENTS_GB = 16,
|
||
//下发扫描模式
|
||
SEND_SCAN_MODE = 17,
|
||
//开始进行平场矫正
|
||
START_FLAT = 18,
|
||
//停止平场矫正
|
||
STOP_FLAT = 19,
|
||
//下发200dpi彩色平场矫正参数
|
||
SEND_200_COLOR_FLAT_DATA = 20,
|
||
//下发300dpi彩色平场矫正参数
|
||
SEND_300_COLOR_FLAT_DATA = 21,
|
||
//获取200dpi彩色平场矫正参数
|
||
GET_200_COLOR_FLAT_DATA = 22,
|
||
//获取300dpi彩色平场矫正参数
|
||
GET_300_COLOR_FLAT_DATA = 23,
|
||
//下发200dpi灰度平场校正参数
|
||
SEND_200_GRAY_FLAT_DATA = 24,
|
||
//下发300dpi灰度平场校正参数
|
||
SEND_300_GRAY_FLAT_DATA = 25,
|
||
//获取200DPI灰度平场校正参数
|
||
GET_200_GRAY_FLAT_DATA = 26,
|
||
//获取300DPI灰度平场校正参数
|
||
GET_300_GRAY_FLAT_DATA = 27,
|
||
//下发序列号命令
|
||
SEND_SERIAL = 28,
|
||
//获取序列号命令
|
||
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,
|
||
//G400 清除硬件异常
|
||
CLEAR_HWERROR = 0x40,
|
||
//设置纵向畸变系数
|
||
SET_JUST_COF_V = 0x41,
|
||
//读取纵向畸变系数
|
||
GET_JUST_COF_V = 0x42,
|
||
//设置彩色校正参数
|
||
SEND_COLOR_FLAT = 0x43,
|
||
//设置彩色平场校正参数
|
||
SEND_COLORCORRECT_FLAT = 0x44,
|
||
//设置灰度校正参数
|
||
SEND_GRAY_FLAT = 0x45,
|
||
//设置灰度平场校正参数
|
||
SEND_GRAYCORRECT_FLAT = 0x46,
|
||
//设置平场校正参数
|
||
GET_FLAT_DATA =0x47,
|
||
//更新完成
|
||
UPDATE_FINISHED = 0x48,
|
||
//重启
|
||
REBOOT = 0x49,
|
||
//获取日志
|
||
GET_LOG_FILES_INFO = 0x50,
|
||
//发送log文件完成
|
||
GET_UPDATE_RESULT=0x51,
|
||
//清空日志
|
||
CLEAR_LOG_FILES = 0x52,
|
||
//获取搓纸失败
|
||
GET_CUO_ERROR,
|
||
//获取双张失败次数
|
||
GET_DOU_ERROR,
|
||
//获取卡纸次数
|
||
GET_JAM_ERROR,
|
||
ACTIVE_SCANNER=0x100,
|
||
//图像处理参数下发
|
||
GETSYSINFO_LEN =0x200,
|
||
GETSYSINFO =0x201,
|
||
GETMOTORPARAM = 0x202,
|
||
GETMOTORPARMLEN=0x203,
|
||
SETMOTORPARAM = 0x204,
|
||
SETMOTORPARAMLEN = 0x205,
|
||
DEVICES_7010 = 0x7010
|
||
};
|
||
|
||
enum class HG_ScannerStatus
|
||
{
|
||
//异常
|
||
HAVE_ERROR = -1,
|
||
//正常状态
|
||
NORMAL = 0,
|
||
//开盖
|
||
OPEN_COVER = 1,
|
||
// 无纸
|
||
NO_FEED = 2,
|
||
// 搓纸失败
|
||
FEED_IN_ERROR = 4,
|
||
// 卡纸
|
||
PAPER_JAM = 8,
|
||
// 检测到双张
|
||
DETECT_DOUBLE_FEED = 16,
|
||
// 检测到订书钉
|
||
DETECT_STAPLE = 32,
|
||
// 纸张倾斜
|
||
PAPER_SKEW = 64,
|
||
// 自动模式
|
||
AUTO_SCAN_MODE = 65,
|
||
// 手动模式
|
||
MANAUL_SCAN_MODE = 66,
|
||
// 计数模式
|
||
COUNT_MODE = 67,
|
||
// 硬件错误
|
||
HARDWARE_ERROR = 68,
|
||
// FPGA崩溃
|
||
FPGA_ERROR = 68,
|
||
// 开始
|
||
START_SCAN = 69,
|
||
//停止
|
||
STOP_SCAN = 70,
|
||
//有图
|
||
HAVE_IMAGE = 71,
|
||
// 更新扫描参数
|
||
UPDATE_SCAN_PARAMETER = 72,
|
||
// PC繁忙或出错
|
||
PC_SCAN_BUSY_or_ERROR = 73,
|
||
// 更新完成
|
||
UPDATE_FINISHED = 74,
|
||
//尺寸检测错误
|
||
SIZE_ERROR=75,
|
||
//纸张有孔
|
||
PAPER_HOLE = 84,
|
||
//自动校正中
|
||
AUTO_FLATTING=198,
|
||
//USB 未连接
|
||
USB_DISCONNECTED = 200,
|
||
//用户点击停止
|
||
USER_STOP = 201,
|
||
//自动平场校正完成
|
||
AUTO_FLAT_FINISHED = 202,
|
||
SCANNER_ACTIVED=0x10
|
||
};
|