zynq_7010/FpgaComm.h

285 lines
6.5 KiB
C++

//
// Created by Nick on 2019/4/7.
//
#ifndef HGSCANSERVICE_FPGACOMM_H
#define HGSCANSERVICE_FPGACOMM_H
#include "serialib.h"
#include <string>
#include <memory>
#include <cstring>
#include "Gpio.h"
#include "scanservices_utils.h"
//#define HAS_UV
#ifdef HAS_UV
#define MAX_REGS 0x0e
#else
#define MAX_REGS 0x0d
#endif
typedef struct Frame_FPGA
{
unsigned int height:16;
unsigned int num : 16;
} FrameFpga;
typedef struct Mode_FPGA
{
unsigned short int colorMode : 1;
unsigned short int dpi : 2;
unsigned short int led : 1;
unsigned short sample : 9;
unsigned short int adcA : 1;
unsigned short int adcB : 1;
unsigned short int selftest : 1;
unsigned short int sp;
} ModeFpga;
typedef struct CMD_FPGA
{
unsigned int cmd : 1; //start : 1 , stop : 0
unsigned int reserved : 31;
} CmdFpga;
typedef struct STATUS_FPGA
{
unsigned int status : 1; //start : 1 , stop : 0
unsigned int reserved : 31;
} StatusFpga;
typedef union Ad_Gain
{
struct
{
unsigned short int gain_low8 : 8;
unsigned short int gain_hight : 1;
} gain_value;
unsigned short int value;
} AdGain;
typedef union CIS_AD_Gain
{
struct
{
unsigned short int ad0_value : 8; //!< 数据位
unsigned short int ad0_reserved : 2; //!< 保留位
unsigned short int ad0_addr : 5; //!< 寄存器地址
unsigned short int ad0_rw : 1; //!< 读写位 1:读, 0:写
unsigned short int ad1_value : 8; //!< 数据位
unsigned short int ad1_reserved : 2; //!< 保留位
unsigned short int ad1_addr : 5; //!< 寄存器地址
unsigned short int ad1_rw : 1; //!< 读写位 1:读, 0:写;
} bits;
int value;
} CisAdGain;
typedef struct CIS_LED_RF {
union
{
struct
{
unsigned short int ledEnable : 1;
unsigned short int fanMode : 2;
unsigned short int jamEnable : 1;
unsigned short int sample : 9;
} led_sample;
unsigned short int reserved;
} user_define;
unsigned short int ledR;
}CisLedRF;
typedef struct CIS_LED_R
{
union
{
struct
{
unsigned short int ledEnable : 1;
unsigned short int sample : 9;
unsigned short int en_test_color :1;
unsigned short int en_test : 1;
unsigned short int cis_type : 1 ;
} led_sample;
unsigned short int reserved;
} user_define;
unsigned short int ledR;
} CisLedR;
typedef union CIS_LED_GB
{
struct
{
unsigned short int ledG;
unsigned short int ledB;
} bits;
int value;
} CisLedGB;
typedef union CIS_LED_UV
{
struct
{
unsigned short int ledASide;
unsigned short int ledBSide;
} bits;
int value;
} CisLedUv;
typedef union CIS_VSP
{
struct
{
unsigned int ASide_VSP:9;
unsigned int BSide_VSP:9;
unsigned int reserved : 14;
} bits;
int value;
} CISVSP;
typedef struct CIS_FRAME_INTERVAL
{
unsigned short Frame_Interval_min;
unsigned short Frame_Interval_max:13;
unsigned short reversed:3;
}CisFrameInterval;
typedef union Fpga_Params
{
struct
{
FrameFpga frame; //0x00
ModeFpga mode; //0x01
CmdFpga cmd; //0x02
StatusFpga status; //0x03
CisAdGain Aad; //0x04
CisLedR AledR; //0x05
CisLedGB AledGB; //0x06
CisAdGain Bad; //0x07
#ifndef G300
CisLedRF BledR; //0x08
#else
CisLedR BledR; //0x08
#endif
CisLedGB BledGB; //0x09
unsigned int ExpIncr; //0x0a
unsigned int TrigMode; //0x0b
CisFrameInterval FrameInterval; //0x0c
CisLedUv UVLed; //0x0d
unsigned int reversed;//0x0e
unsigned int fpgaversion;//0x0f
unsigned int ConFrameCount;//多帧计数
} params;
int regs[17];
} FpgaParams;
#define FAN_PORT 59
class FpgaComm
{
public:
FpgaComm();
void reset();
void setRegs(int addr, int value);
int getRegs(int addr);
void setFrameHeight(int height);
int getFrameHeight();
int getAutoFrameHeight();
void setFrameNum(int num);
void enableLed(bool bEnable);
void enableUV(bool enable);
void capture();
void updateRegs();
void setAGain(int indexGain, int value);
void getAGain(int indexGain, int &Avalue, int &Bvalue);
void setBGain(int indexGain, int value);
void getBGain(int indexGain, int &Avalue, int &Bvalue);
void setAOffset(int indexOffset, int value);
void getAOffset(int indexGain, int &Avalue, int &Bvalue);
void setBOffset(int indexOffset, int value);
void getBOffset(int indexGain, int &Avalue, int &Bvalue);
void setAExposureR(int value);
void setAExposureG(int value);
void setAExposureB(int value);
void setAExposureUV(int value);
void setBExposureR(int value);
void setBExposureG(int value);
void setBExposureB(int value);
void setBExpousreUV(int value);
void setEnTestCol(bool en);
void setEnTestBit(bool en);
void setFanMode(int mode);
void setSp(int value);
int getSp();
void setSample(int sampleFront,int sampleBack);
void EnableTest(bool bTest);
int IsTest();
void setColorMode(int mode);
int getColorMode();
void setDpi(int dpi);
int getDpi();
void setSample(int sample);
int getSample();
int read(int addr);
//20190626 YHP autoTrig function
void setFrame_interval_min(int min);
int getFrame_interval_min();
void setFrame_interval_max(int max);
int getFrame_interval_max();
//void setDelayTime(int value);
void setTrigMode(bool isArmMode);
void update();
void enableJamCheck(bool b);
void resetADC();
void setVsp(unsigned int Aside,unsigned int BSide);
unsigned int getFrame_counter_val();
int getFrameNum();
void set_cis_type(bool isA3_CIS);
private:
const std::string com = "/dev/ttyS3";
const unsigned int bauds = 921600;
unsigned char bufSend[7];
unsigned char bufRecv[5];
serialib m_serial;
FpgaParams fpgaParams;
bool isUVEnable = false;
Gpio fanGpio;
void updateRegs(int addr);
void write(int addr, int data);
};
#endif //HGSCANSERVICE_FPGACOMM_H