Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions indi-libcamera/indi_libcamera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,18 @@
#include <libraw.h>
#include <jpeglib.h>

#include <fstream>
#include <cerrno>
#include <cstring>

#define CONTROL_TAB "Controls"

namespace
{
constexpr const char *HCG_SYSFS =
"/sys/module/imx290/parameters/hcg_mode";
}

static class Loader
{
std::map<int, std::shared_ptr<INDILibCamera >> cameras;
Expand Down Expand Up @@ -773,6 +782,10 @@ bool INDILibCamera::initProperties()
GainNP[0].fill("GAIN", "Gain", "%.2f", props.gain.min, props.gain.max, 1.00, props.gain.def);
GainNP.fill(getDeviceName(), "CCD_GAIN", "Gain", IMAGE_CONTROLS_TAB, IP_RW, 60, IPS_IDLE);

GainConversionSP[0].fill("LCG", "Dynamic Range (LCG)", ISS_ON);
GainConversionSP[1].fill("HCG", "Low Noise (HCG)", ISS_OFF);
GainConversionSP.fill(getDeviceName(), "GAIN_CONVERSION", "Gain Conversion", IMAGE_CONTROLS_TAB, IP_RW, ISR_1OFMANY, 60, IPS_IDLE);

uint32_t cap = 0;
cap |= CCD_HAS_BAYER;
cap |= CCD_HAS_STREAMING;
Expand Down Expand Up @@ -810,6 +823,8 @@ bool INDILibCamera::updateProperties()
defineProperty(TemperatureNP);
defineProperty(AdjustmentNP);
defineProperty(GainNP);
defineProperty(GainConversionSP);
updateGainConversionUI();
defineProperty(AdjustExposureModeSP);
defineProperty(AdjustAwbModeSP);
defineProperty(AdjustMeteringModeSP);
Expand All @@ -820,6 +835,7 @@ bool INDILibCamera::updateProperties()
deleteProperty(TemperatureNP);
deleteProperty(AdjustmentNP);
deleteProperty(GainNP);
deleteProperty(GainConversionSP);
deleteProperty(AdjustExposureModeSP);
deleteProperty(AdjustAwbModeSP);
deleteProperty(AdjustMeteringModeSP);
Expand Down Expand Up @@ -1062,6 +1078,28 @@ bool INDILibCamera::ISNewSwitch(const char *dev, const char *name, ISState * sta
}, true);
return true;
}

// Gain Conversion
if (GainConversionSP.isNameMatch(name))
{
updateProperty(GainConversionSP, states, names, n, [this, names]()
{
GainConversionMode mode =
(strcmp(names[0], "HCG") == 0) ?
GainConversionMode::LowNoise :
GainConversionMode::DynamicRange;

if (!writeGainConversionMode(mode))
return false;

updateGainConversionUI();

return true;
}, true);

return true;
}

}

return INDI::CCD::ISNewSwitch(dev, name, states, names, n);
Expand Down Expand Up @@ -1574,3 +1612,80 @@ INDI_PIXEL_FORMAT INDILibCamera::bayerToPixelFormat(const char *bayer)

return INDI_MONO;
}
/////////////////////////////////////////////////////////////////////////////
///
/////////////////////////////////////////////////////////////////////////////
bool INDILibCamera::readGainConversionMode(GainConversionMode &mode) const
{
std::ifstream file(HCG_SYSFS);

if (!file)
return false;

std::string value;
file >> value;

if (!value.empty() &&
(value[0] == 'Y' || value[0] == 'y'))
{
mode = GainConversionMode::LowNoise;
}
else
{
mode = GainConversionMode::DynamicRange;
}

return true;
}

void INDILibCamera::updateGainConversionUI()
{
GainConversionMode mode;

if (!readGainConversionMode(mode))
return;

GainConversionSP.reset();

if (mode == GainConversionMode::LowNoise)
GainConversionSP[1].setState(ISS_ON);
else
GainConversionSP[0].setState(ISS_ON);

GainConversionSP.setState(IPS_OK);
GainConversionSP.apply();
}

bool INDILibCamera::writeGainConversionMode(GainConversionMode mode)
{
std::ofstream file(HCG_SYSFS);

if (!file)
{
LOGF_ERROR("Unable to change Gain Conversion mode. Cannot open %s for writing: %s",
HCG_SYSFS,
strerror(errno));
return false;
}

if (mode == GainConversionMode::LowNoise)
file << '1';
else
file << '0';

file.flush();

if (!file.good())
{
LOGF_ERROR("Failed writing to %s: %s",
HCG_SYSFS,
strerror(errno));
return false;
}

return true;
}

/////////////////////////////////////////////////////////////////////////////
///
/////////////////////////////////////////////////////////////////////////////
11 changes: 11 additions & 0 deletions indi-libcamera/indi_libcamera.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ class INDILibCamera : public INDI::CCD
INDI::PropertySwitch AdjustExposureModeSP {0}, AdjustAwbModeSP {0}, AdjustMeteringModeSP {0}, AdjustDenoiseModeSP {0} ;
INDI::PropertyNumber AdjustmentNP {AdjustAwbBlue + 1};
INDI::PropertyNumber GainNP {1};
INDI::PropertySwitch GainConversionSP {2};

// std::unique_ptr<RPiCamApp> m_CameraApp;
// std::unique_ptr<RPiCamEncoder> m_CameraEncoder;
Expand All @@ -169,5 +170,15 @@ class INDILibCamera : public INDI::CCD
uint8_t m_CameraIndex;
libcamera::ControlList m_ControlList;

enum class GainConversionMode
{
DynamicRange,
LowNoise
};

bool readGainConversionMode(GainConversionMode &mode) const;
bool writeGainConversionMode(GainConversionMode mode);
void updateGainConversionUI();

RpiCamProperties getAvailableCamProperties();
};