230 lines
7.3 KiB
C++
230 lines
7.3 KiB
C++
/*
|
||
* @Author: your name
|
||
* @Date: 2022-01-11 09:41:39
|
||
* @LastEditTime: 2023-02-27 16:38:45
|
||
* @LastEditors: Zhaozhonmin 1656963645@qq.com
|
||
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||
* @FilePath: \zynq_MSS\capimage\HCamDevice.h
|
||
*/
|
||
#pragma once
|
||
#include <string>
|
||
#include <linux/videodev2.h>
|
||
// #include "../cameraConfig.h"
|
||
#include "CameraParams.h"
|
||
#include <functional>
|
||
#include <memory>
|
||
#include <thread>
|
||
#include <map>
|
||
|
||
#define adcRegSize 20
|
||
|
||
|
||
class Camconfig;
|
||
|
||
|
||
class HCamDevice
|
||
{
|
||
public:
|
||
int open_device(int , int);
|
||
int close_device();
|
||
|
||
void HtCamStartVideoCapturing(); //开始 摄像头工作
|
||
void HtCamStopVideoCapturing(); //停止 摄像头工作
|
||
int HtCamStartSampling(); //开始cis摄像头灯寄存器设置
|
||
int HtCamStopSampling(); //停止cis摄像头灯寄存器设置
|
||
|
||
void HtCamSetTriggerMode(int val); //设置触发模式
|
||
int HtCamGetTriggerMode(); //获取触发模式
|
||
int HtCamGetColorMode(); //获取颜色模式
|
||
void HtCamSetClolr(int color); //设置颜色模式
|
||
//设置dpi dpi =0 200dpi ,dpi =1 300dpi,dpi =2 600dpi
|
||
//注意协议的逻辑 :11号寄存器设置1 12号设置1 200dpi 11号寄存器设置1 12号设置0 300dpi 11号寄存器设置0 12号设置0 600dpi
|
||
void HtCamSetDpi(int dpi);
|
||
|
||
|
||
int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要>
|
||
|
||
int get_width() { return v4lWidth; }
|
||
int get_height() { return v4lHeight; }
|
||
void set_width_hegith(int , int);
|
||
|
||
void HtCamSetdivder (bool ); //设置扫描仪传感器使能
|
||
void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比
|
||
|
||
void HtCamSetPeriod(double reg_value); //设置扫描仪传感器占空比
|
||
//void HtCamGetPeriod(double ®_value); //获取扫描仪传感器占空比
|
||
|
||
void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 需要采集的帧数,设置为0x05表示采集六帧后停止
|
||
void HtCamSetFrameCnt(uint32_t val);//需要采集的帧数,设置为0x05表示采集六帧后停止
|
||
|
||
void HtCamGetFrameNum(uint32_t &val);//采集到的帧数,如果为0x0005则表示采集到了5帧
|
||
|
||
|
||
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值
|
||
void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔,
|
||
void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime
|
||
void HtCamSetSpTime2(uint32_t reg_value);// reg_value //彩色内触发间隔 至少大于灰度三倍
|
||
|
||
void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认:200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移
|
||
void HtCamGetStSp(uint32_t &start_sample);
|
||
void HtCamSetVsnpTime(int color); //相位
|
||
|
||
void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置
|
||
void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置
|
||
|
||
//void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器
|
||
void HtCamReadADCReg_ALL(uint8_t addr) ; //读adc寄存器
|
||
void HtCamSetLowPower(bool val);//低功耗模式
|
||
|
||
|
||
////////////////ADC 寄存器0x00 - 0x14///////////////////
|
||
/////////////// 0x00 - 0xdh暂时只需要写高位,低位不用写
|
||
// 1、adc参数配置寄存器分为两个 0x00 和 0x07
|
||
// 2、每个adc参数配置又分32位宽 ,前八个位宽为adc值
|
||
|
||
// is_gain == true 设置增益
|
||
// is_gain == false 设置偏移
|
||
// is_adc1 == true 设置adc1
|
||
// is_adc1 == false 设置adc2
|
||
// addr adc 寄存器地址
|
||
// adc 寄存器数据
|
||
void HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, uint8_t data);
|
||
|
||
void stopFPGAScan();//暂时无用 2023 -8 -2
|
||
void startFPGAScan();//暂时无用 2023 -8 -2
|
||
private:
|
||
int init_fpga(); //初始化 寄存器基地址
|
||
int uninit_fpga();
|
||
|
||
|
||
int HtCamWaitVideoCapture(int msTimeout); //等待图像信号
|
||
|
||
void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器
|
||
|
||
public:
|
||
HCamDevice();
|
||
~HCamDevice();
|
||
|
||
|
||
int HtCamReadNextFrame(void **pbuf);
|
||
int V4LBufferQuery();
|
||
|
||
void HtCamChangeTriggerInAndEXt(int in_out);
|
||
|
||
void savePsReg();
|
||
|
||
void HtCamWriteAllADC();
|
||
void HtCamInitADCReg();
|
||
void HtCamWriteADCReg(uint8_t addr,uint8_t data);
|
||
void HtCamWriteADCReg();
|
||
void HtCamReadADCReg(uint8_t addr, uint8_t *data);
|
||
|
||
void HtCamOverClockClear(); // 清除切换超频标志位
|
||
|
||
uint8_t getADCReg(int addr);
|
||
void setADCReg(int addr , uint8_t value);
|
||
void saveADCReg();
|
||
|
||
void setConfig(Camconfig* _config){config = _config;}
|
||
|
||
void HtCamChangeMonoStartSample(int start_sample);
|
||
|
||
void ChangeScanState(bool state);
|
||
|
||
private:
|
||
|
||
int init_sample();
|
||
int init_capture();
|
||
int init_video_buffer();
|
||
int init_dev();
|
||
void init_ps_regs();
|
||
void HtCamSwitchSampleModes(unsigned char mode);//测试数据
|
||
|
||
void HtCamExitVideoCapturing();
|
||
void HtCamResizeBuffer(int width, int height, int number);
|
||
|
||
|
||
|
||
int HtCamEventWorkThread(void);
|
||
|
||
struct captureBuffer
|
||
{
|
||
void *start;
|
||
int dmabuf_fd;
|
||
uint32_t length;
|
||
};
|
||
|
||
const unsigned int phyBaseAddr = 0x40010000;
|
||
const unsigned int AddrMapSize = 0x100;
|
||
unsigned int *virBaseAddr;
|
||
|
||
int memfd;
|
||
std::string subDeviceName;
|
||
int subDevicefd;
|
||
|
||
std::string videoDevName;
|
||
int videofd;
|
||
|
||
unsigned int v4lWidth;
|
||
unsigned int v4lHeight;
|
||
|
||
unsigned int v4lBufferCount;
|
||
int nplanes;
|
||
int drivertype;
|
||
enum v4l2_buf_type v4l2buftype;
|
||
enum v4l2_memory v4l2memtype;
|
||
struct captureBuffer *captureBufers;
|
||
int lastSucceedBufferIndex;
|
||
|
||
uint32_t pPsReg[PSReg::REG_NUM + 1] = {0};
|
||
uint8_t pADCReg[adcRegSize];
|
||
|
||
|
||
std::shared_ptr<std::thread> event_thread = nullptr;
|
||
|
||
std::shared_ptr<std::thread> thread_auto_duty= nullptr;
|
||
//std::condition_variable auto_duty_wait;
|
||
//std::mutex auto_duty_lock_;
|
||
Camconfig* config = nullptr;
|
||
|
||
std::string _CAM_TYPE = "PYTHONZ_1200";
|
||
int _V4LWIDTH = 15552 / 3; //灰度
|
||
int _IMG_BUF_WIDTH = 5184;
|
||
int _V4LHEIGHT = 128;
|
||
int _V4LBUFFERCOUNT = 32;
|
||
std::string _SP_DPI = "150|300|600";
|
||
std::string _V4L_DPIS = "300|600";
|
||
int _N_DPI = 150;
|
||
int _CIS_NUM = 6;
|
||
std::map<int, int> _DPI_WIDTH = {{150, 7776}, {300, 5184}, {600, 10368}};
|
||
std::map<int, int> _DPI_V4LWIDTH = {{150, 15552}, {300, 15552}, {600, 31104}};
|
||
std::string _ADCPATH = "/media/sd-mmcblk1p1/ADC.ini";
|
||
int VSNP = 0 ;
|
||
int ST_SP = 85 ;
|
||
int ST_SP_VSNP = 0;
|
||
int _TRIG_SPACING = 2592;
|
||
};
|
||
|
||
class FPGA{
|
||
|
||
int init_fpga(); //初始化 寄存器基地址
|
||
int uninit_fpga();
|
||
|
||
public:
|
||
FPGA();
|
||
~FPGA();
|
||
|
||
private:
|
||
const unsigned int phyBaseAddr = 0x40010000;
|
||
const unsigned int AddrMapSize = 0x100;
|
||
unsigned int *virBaseAddr;
|
||
int memfd;
|
||
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|