2023-07-17 03:29:37 +00:00
|
|
|
|
/*
|
|
|
|
|
* @Author: your name
|
|
|
|
|
* @Date: 2022-01-11 09:41:39
|
2023-08-09 07:31:27 +00:00
|
|
|
|
* @LastEditTime: 2023-02-27 16:38:45
|
2023-07-17 03:29:37 +00:00
|
|
|
|
* @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"
|
2023-08-09 07:31:27 +00:00
|
|
|
|
#include "CameraParams.h"
|
2023-07-17 03:29:37 +00:00
|
|
|
|
#include <functional>
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include <thread>
|
2023-08-09 07:31:27 +00:00
|
|
|
|
#include <map>
|
2023-07-18 01:32:46 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
#define adcRegSize 20
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Camconfig;
|
2023-07-17 03:29:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HCamDevice
|
|
|
|
|
{
|
|
|
|
|
public:
|
2023-08-09 07:31:27 +00:00
|
|
|
|
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); //设置颜色模式
|
2023-09-26 09:16:56 +00:00
|
|
|
|
//设置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);
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要>
|
|
|
|
|
|
|
|
|
|
int get_width() { return v4lWidth; }
|
|
|
|
|
int get_height() { return v4lHeight; }
|
|
|
|
|
void set_width_hegith(int , int);
|
|
|
|
|
|
2023-08-31 08:37:05 +00:00
|
|
|
|
void HtCamSetdivder (bool ); //设置扫描仪传感器使能
|
2023-08-09 07:31:27 +00:00
|
|
|
|
void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比
|
|
|
|
|
|
2023-10-27 03:08:47 +00:00
|
|
|
|
void HtCamSetPeriod(double reg_value); //设置扫描仪传感器占空比
|
2023-12-11 08:12:03 +00:00
|
|
|
|
//void HtCamGetPeriod(double ®_value); //获取扫描仪传感器占空比
|
2023-08-31 08:37:05 +00:00
|
|
|
|
|
2023-09-14 02:46:04 +00:00
|
|
|
|
void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 需要采集的帧数,设置为0x05表示采集六帧后停止
|
|
|
|
|
void HtCamSetFrameCnt(uint32_t val);//需要采集的帧数,设置为0x05表示采集六帧后停止
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-09-14 02:46:04 +00:00
|
|
|
|
void HtCamGetFrameNum(uint32_t &val);//采集到的帧数,如果为0x0005则表示采集到了5帧
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-09-14 02:46:04 +00:00
|
|
|
|
|
2023-08-11 05:54:42 +00:00
|
|
|
|
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值
|
2023-08-31 08:37:05 +00:00
|
|
|
|
void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔,
|
2023-08-11 05:54:42 +00:00
|
|
|
|
void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime
|
2023-08-31 08:37:05 +00:00
|
|
|
|
void HtCamSetSpTime2(uint32_t reg_value);// reg_value //彩色内触发间隔 至少大于灰度三倍
|
|
|
|
|
|
|
|
|
|
void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认:200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移
|
2023-08-11 05:54:42 +00:00
|
|
|
|
void HtCamGetStSp(uint32_t &start_sample);
|
2023-09-04 03:28:08 +00:00
|
|
|
|
void HtCamSetVsnpTime(int color); //相位
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-08-15 01:50:06 +00:00
|
|
|
|
void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置
|
|
|
|
|
void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-08-15 01:50:06 +00:00
|
|
|
|
//void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器
|
2023-08-31 08:37:05 +00:00
|
|
|
|
void HtCamReadADCReg_ALL(uint8_t addr) ; //读adc寄存器
|
2023-10-09 01:26:25 +00:00
|
|
|
|
void HtCamSetLowPower(bool val);//低功耗模式
|
2023-08-15 01:50:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////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
|
2023-08-09 07:31:27 +00:00
|
|
|
|
private:
|
|
|
|
|
int init_fpga(); //初始化 寄存器基地址
|
|
|
|
|
int uninit_fpga();
|
|
|
|
|
|
2023-08-15 01:50:06 +00:00
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
int HtCamWaitVideoCapture(int msTimeout); //等待图像信号
|
|
|
|
|
|
|
|
|
|
void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
HCamDevice();
|
2023-07-17 03:29:37 +00:00
|
|
|
|
~HCamDevice();
|
|
|
|
|
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
int HtCamReadNextFrame(void **pbuf);
|
|
|
|
|
int V4LBufferQuery();
|
2023-07-17 03:29:37 +00:00
|
|
|
|
|
|
|
|
|
void HtCamChangeTriggerInAndEXt(int in_out);
|
|
|
|
|
|
|
|
|
|
void savePsReg();
|
|
|
|
|
|
|
|
|
|
void HtCamWriteAllADC();
|
|
|
|
|
void HtCamInitADCReg();
|
|
|
|
|
void HtCamWriteADCReg(uint8_t addr,uint8_t data);
|
2023-08-31 08:37:05 +00:00
|
|
|
|
void HtCamWriteADCReg();
|
2023-07-17 03:29:37 +00:00
|
|
|
|
void HtCamReadADCReg(uint8_t addr, uint8_t *data);
|
|
|
|
|
|
|
|
|
|
void HtCamOverClockClear(); // 清除切换超频标志位
|
|
|
|
|
|
|
|
|
|
uint8_t getADCReg(int addr);
|
|
|
|
|
void setADCReg(int addr , uint8_t value);
|
|
|
|
|
void saveADCReg();
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
void setConfig(Camconfig* _config){config = _config;}
|
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
void HtCamChangeMonoStartSample(int start_sample);
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
|
|
|
|
void ChangeScanState(bool state);
|
2023-07-18 14:29:02 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
private:
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
int init_sample();
|
2023-08-09 07:31:27 +00:00
|
|
|
|
int init_capture();
|
2023-07-17 03:29:37 +00:00
|
|
|
|
int init_video_buffer();
|
|
|
|
|
int init_dev();
|
|
|
|
|
void init_ps_regs();
|
2023-08-09 07:31:27 +00:00
|
|
|
|
void HtCamSwitchSampleModes(unsigned char mode);//测试数据
|
2023-08-11 05:54:42 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
void HtCamExitVideoCapturing();
|
|
|
|
|
void HtCamResizeBuffer(int width, int height, int number);
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
|
|
|
|
|
int HtCamEventWorkThread(void);
|
|
|
|
|
|
|
|
|
|
struct captureBuffer
|
|
|
|
|
{
|
|
|
|
|
void *start;
|
|
|
|
|
int dmabuf_fd;
|
|
|
|
|
uint32_t length;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const unsigned int phyBaseAddr = 0x40010000;
|
|
|
|
|
const unsigned int AddrMapSize = 0x100;
|
2023-08-09 07:31:27 +00:00
|
|
|
|
unsigned int *virBaseAddr;
|
2023-07-17 03:29:37 +00:00
|
|
|
|
|
|
|
|
|
int memfd;
|
|
|
|
|
std::string subDeviceName;
|
|
|
|
|
int subDevicefd;
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
std::string videoDevName;
|
2023-07-17 03:29:37 +00:00
|
|
|
|
int videofd;
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
unsigned int v4lWidth;
|
|
|
|
|
unsigned int v4lHeight;
|
2023-08-09 07:31:27 +00:00
|
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
unsigned int v4lBufferCount;
|
|
|
|
|
int nplanes;
|
|
|
|
|
int drivertype;
|
|
|
|
|
enum v4l2_buf_type v4l2buftype;
|
|
|
|
|
enum v4l2_memory v4l2memtype;
|
|
|
|
|
struct captureBuffer *captureBufers;
|
|
|
|
|
int lastSucceedBufferIndex;
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
uint32_t pPsReg[PSReg::REG_NUM + 1] = {0};
|
2023-07-17 03:29:37 +00:00
|
|
|
|
uint8_t pADCReg[adcRegSize];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<std::thread> event_thread = nullptr;
|
2023-12-11 08:12:03 +00:00
|
|
|
|
|
|
|
|
|
std::shared_ptr<std::thread> thread_auto_duty= nullptr;
|
|
|
|
|
//std::condition_variable auto_duty_wait;
|
|
|
|
|
//std::mutex auto_duty_lock_;
|
2023-08-09 07:31:27 +00:00
|
|
|
|
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;
|
2023-07-17 03:29:37 +00:00
|
|
|
|
};
|
|
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
};
|
2023-07-17 03:29:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|