zynq_7010/zynq_7010_code/scanservices_utils.h

567 lines
13 KiB
C
Raw Permalink Normal View History

2023-07-17 03:29:37 +00:00
#pragma once
#include <string>
#include <functional>
#include <map>
2023-07-20 03:48:38 +00:00
#include <opencv2/opencv.hpp>
2023-07-17 03:29:37 +00:00
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
2023-07-17 03:29:37 +00:00
/******************************************
* 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
2023-08-31 08:37:05 +00:00
#define LOG //printf
2023-07-17 03:29:37 +00:00
#endif
2023-09-19 01:24:12 +00:00
#define FWVERSION "G345230918"
2023-07-17 03:29:37 +00:00
#define SERIALNUM "HS6010A38001P1"
2023-09-19 02:40:47 +00:00
2023-07-17 03:29:37 +00:00
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)
2023-11-18 03:48:39 +00:00
typedef void (*image_callback)(int element);
2023-07-17 03:29:37 +00:00
static std::map<int , sp_COLOR_or_GRAY>mapFradme_SP={
2024-02-06 09:28:31 +00:00
{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
2023-07-17 03:29:37 +00:00
};
enum class LedStatus
{
Ready,
Scanning,
Abnormal,
NoPaper,
StopScan,
CoverOpen,
Updating,
UpdateDone
};
struct HG_JpegCompressInfo
{
unsigned int error_code;
2023-07-20 05:50:35 +00:00
unsigned int first_frame;
unsigned int last_frame;
unsigned int index_frame;
2023-08-09 07:31:27 +00:00
unsigned int DataLength;
unsigned int width;
unsigned int height;
2023-09-15 06:05:42 +00:00
unsigned int dpi;
2023-07-20 05:50:35 +00:00
unsigned char *pJpegData;
2023-08-31 08:37:05 +00:00
//cv::Mat mat;
2023-07-17 03:29:37 +00:00
};
2023-08-09 07:31:27 +00:00
struct HG_JpegCompressInfo_data
{
HG_JpegCompressInfo info;
unsigned char *pJpegData[1];
};
2023-07-17 03:29:37 +00:00
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
2023-07-17 03:29:37 +00:00
{
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;
2023-11-04 01:38:17 +00:00
unsigned int reversed1 : 2;
2023-07-17 03:29:37 +00:00
unsigned int isCorrect : 1;
2023-11-04 01:38:17 +00:00
unsigned int dc : 7; //0 - 100
unsigned int reversed2 : 8;
2023-07-17 03:29:37 +00:00
} 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
{
2023-08-09 07:31:27 +00:00
cv::Mat mat;
2023-09-19 01:24:12 +00:00
unsigned char *data;
2023-07-17 03:29:37 +00:00
int width;
int height;
int pixtype;
};
struct V4L2_DATAINFO_Ex:V4L2_DATAINFO
{
2023-09-04 03:28:08 +00:00
unsigned int frame_index; //总帧数
2023-08-09 07:31:27 +00:00
unsigned int dpi; //dpi
2023-07-17 03:29:37 +00:00
unsigned int error_code;
2023-08-09 07:31:27 +00:00
unsigned int first_frame; //第一帧
unsigned int lost_frame; //丢失帧
unsigned int last_frame; //最后一帧
unsigned int snap_end; //采集结束
2023-07-17 03:29:37 +00:00
};
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, //设备更新:解压失败
2023-11-18 03:48:39 +00:00
};
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
};