#pragma once #include #include #include #include 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::mapmapFradme_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 &imageready, const std::function &deviceevent) : m_imageready(imageready), m_deviceevent(deviceevent) {} std::function m_imageready; std::function 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 };