zynq_7010/zynq_7010_code/HCamDevice.h

230 lines
7.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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 &reg_value);//获取扫描仪传感器占空比
void HtCamSetPeriod(double reg_value); //设置扫描仪传感器占空比
//void HtCamGetPeriod(double &reg_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 &reg_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;
};