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); //设置颜色模式
|
|
|
|
void HtCamSetDpi(int dpi); //设置dpi
|
|
|
|
|
|
|
|
|
|
|
|
int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要>
|
|
|
|
|
|
|
|
int get_width() { return v4lWidth; }
|
|
|
|
int get_height() { return v4lHeight; }
|
|
|
|
void set_width_hegith(int , int);
|
|
|
|
|
|
|
|
void HtCamSetPeriod(uint8_t reg_value); //设置扫描仪传感器占空比
|
|
|
|
void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比
|
|
|
|
|
|
|
|
void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数
|
|
|
|
void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧
|
|
|
|
|
|
|
|
|
|
|
|
void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值
|
|
|
|
|
|
|
|
private:
|
|
|
|
int init_fpga(); //初始化 寄存器基地址
|
|
|
|
int uninit_fpga();
|
|
|
|
|
|
|
|
void stopFPGAScan();//暂时无用 2023 -8 -2
|
|
|
|
void startFPGAScan();//暂时无用 2023 -8 -2
|
|
|
|
int HtCamWaitVideoCapture(int msTimeout); //等待图像信号
|
|
|
|
|
|
|
|
void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器
|
|
|
|
|
|
|
|
|
|
|
|
void HtCamSetSpTime(uint32_t reg_value);//0x03 //内触发间隔 //影响到图像得拉伸
|
|
|
|
void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime
|
2023-07-17 03:29:37 +00:00
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
void HtCamSetStSp(int color);//0x0d //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移
|
|
|
|
void HtCamGetStSp(uint32_t ®_value);
|
|
|
|
|
|
|
|
|
|
|
|
void HtCamSetVsnpTime(int color);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
uint32_t HtCamReadPsRegs(uint8_t reg_addr);
|
|
|
|
void HtCamWritePsRegs(uint8_t reg_addr, uint32_t reg_value);
|
|
|
|
void savePsReg();
|
|
|
|
|
|
|
|
void HtCamWriteAllADC();
|
|
|
|
void HtCamInitADCReg();
|
|
|
|
void HtCamWriteADCReg(uint8_t addr,uint8_t data);
|
|
|
|
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 HtCamChangePhase(int phase);
|
|
|
|
|
|
|
|
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_fd();
|
|
|
|
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);//测试数据
|
|
|
|
void HtCamChangeExposureValue(unsigned int value); //曝光值设置
|
2023-07-17 03:29:37 +00:00
|
|
|
void HtCamExitVideoCapturing();
|
|
|
|
void HtCamResizeBuffer(int width, int height, int number);
|
|
|
|
void HtCamChangeAdjustSpTime(uint32_t sp_time_gap, uint32_t sp_time_rw);
|
|
|
|
void HtCamChangeAdjustPhase(uint16_t times, uint8_t dir);
|
2023-07-18 14:29:02 +00:00
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
|
2023-08-09 07:31:27 +00:00
|
|
|
bool HtCamPsDpiChange(int dpi);
|
|
|
|
|
|
|
|
void HtCamImageProcessChange();
|
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-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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|