Instrument Neutral Distributed Interface INDI 2.2.5
simpleccd.cpp

A simple CCD device that can capture images and control temperature. It returns a FITS image to the client. To build drivers for complex CCDs, please refer to the INDI Generic CCD driver template in INDI SVN (under 3rdparty).

/*
INDI Developers Manual
Tutorial #3
"Simple CCD Driver"
We develop a simple CCD driver.
Refer to README, which contains instruction on how to build this driver, and use it
with an INDI-compatible client.
*/
#include "simpleccd.h"
#include <memory>
/* Macro shortcut to CCD temperature value */
#define currentCCDTemperature TemperatureNP[0].value
std::unique_ptr<SimpleCCD> simpleCCD(new SimpleCCD());
/**************************************************************************************
** Client is asking us to establish connection to the device
***************************************************************************************/
{
LOG_INFO("Simple CCD connected successfully!");
// Let's set a timer that checks teleCCDs status every POLLMS milliseconds.
return true;
}
/**************************************************************************************
** Client is asking us to terminate connection to the device
***************************************************************************************/
{
LOG_INFO("Simple CCD disconnected successfully!");
return true;
}
/**************************************************************************************
** INDI is asking us for our default device name
***************************************************************************************/
{
return "Simple CCD";
}
/**************************************************************************************
** INDI is asking us to init our properties.
***************************************************************************************/
{
// Must init parent properties first!
// We set the CCD capabilities
// Add Debug, Simulator, and Configuration controls
return true;
}
/********************************************************************************************
** INDI is asking us to update the properties because there is a change in CONNECTION status
** This function is called whenever the device is connected or disconnected.
*********************************************************************************************/
{
// Call parent update properties first
if (isConnected())
{
// Let's get parameters now from CCD
setupParams();
// Start the timer
}
return true;
}
/**************************************************************************************
** Setting up CCD parameters
***************************************************************************************/
void SimpleCCD::setupParams()
{
// Our CCD is an 8 bit CCD, 1280x1024 resolution, with 5.4um square pixels.
SetCCDParams(1280, 1024, 8, 5.4, 5.4);
// Let's calculate how much memory we need for the primary CCD buffer
uint32_t nbuf = PrimaryCCD.getXRes() * PrimaryCCD.getYRes() * PrimaryCCD.getBPP() / 8;
}
/**************************************************************************************
** Client is asking us to start an exposure
***************************************************************************************/
bool SimpleCCD::StartExposure(float duration)
{
ExposureRequest = duration;
// Since we have only have one CCD with one chip, we set the exposure duration of the primary CCD
ExposureTimer.start();
InExposure = true;
// We're done
return true;
}
/**************************************************************************************
** Client is asking us to abort an exposure
***************************************************************************************/
{
InExposure = false;
return true;
}
/**************************************************************************************
** Client is asking us to set a new temperature
***************************************************************************************/
{
TemperatureRequest = temperature;
// 0 means it will take a while to change the temperature
return 0;
}
/**************************************************************************************
** How much longer until exposure is done?
***************************************************************************************/
float SimpleCCD::CalcTimeLeft()
{
return ExposureRequest - ExposureTimer.elapsed() / 1000.0;
}
/**************************************************************************************
** Main device loop. We check for exposure and temperature progress here
***************************************************************************************/
{
if (!isConnected())
return; // No need to reset timer if we are not connected anymore
if (InExposure)
{
double timeleft = CalcTimeLeft();
// Less than a 0.1 second away from exposure completion
// This is an over simplified timing method, check CCDSimulator and simpleCCD for better timing checks
if (timeleft < 0.1)
{
/* We're done exposing */
LOG_INFO("Exposure done, downloading image...");
// Set exposure left to zero
// We're no longer exposing...
InExposure = false;
/* grab and save image */
grabImage();
}
else
// Just update time left in client
}
// TemperatureNP is defined in INDI::CCD
{
case IPS_IDLE:
case IPS_OK:
break;
case IPS_BUSY:
/* If target temperature is higher, then increase current CCD temperature */
if (currentCCDTemperature < TemperatureRequest)
/* If target temperature is lower, then decrease current CCD temperature */
else if (currentCCDTemperature > TemperatureRequest)
/* If they're equal, stop updating */
else
{
LOG_WARN("Target temperature reached.");
break;
}
break;
case IPS_ALERT:
break;
}
}
/**************************************************************************************
** Create a random image and return it to client
***************************************************************************************/
void SimpleCCD::grabImage()
{
// Let's get a pointer to the frame buffer
uint8_t *image = PrimaryCCD.getFrameBuffer();
// Get width and height
int height = PrimaryCCD.getSubH() / PrimaryCCD.getBinY();
// Fill buffer with random pattern
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++)
image[i * width + j] = rand() % 255;
LOG_INFO("Download complete.");
// Let INDI::CCD know we're done filling the image buffer
}
double temperature
bool isConnected() const
void setExposureDuration(double duration)
setExposureDuration Set desired CCD frame exposure duration for next exposure. You must call this fun...
int getSubH() const
getSubH Get the height of the frame
int getBPP() const
getBPP Get CCD Chip depth (bits per pixel).
int getBinY() const
getBinY Get vertical binning of the CCD chip.
int getXRes() const
getXRes Get the horizontal resolution in pixels of the CCD Chip.
Definition indiccdchip.h:81
int getBinX() const
getBinX Get horizontal binning of the CCD chip.
uint8_t * getFrameBuffer()
getFrameBuffer Get raw frame buffer of the CCD chip.
void setExposureLeft(double duration)
setExposureLeft Update exposure time left. Inform the client of the new exposure time left value.
int getSubW() const
getSubW Get the width of the frame
void setFrameBufferSize(uint32_t nbuf, bool allocMem=true)
setFrameBufferSize Set desired frame buffer size. The function will allocate memory accordingly....
int getYRes() const
Get the vertical resolution in pixels of the CCD Chip.
Definition indiccdchip.h:90
CCDChip PrimaryCCD
Definition indiccd.h:621
@ CCD_CAN_SUBFRAME
Definition indiccd.h:116
@ CCD_CAN_ABORT
Definition indiccd.h:117
@ CCD_HAS_SHUTTER
Definition indiccd.h:120
@ CCD_CAN_BIN
Definition indiccd.h:115
@ CCD_HAS_COOLER
Definition indiccd.h:121
virtual bool ExposureComplete(CCDChip *targetChip)
Uploads target Chip exposed buffer as FITS to the client. Derived classes should class this function ...
Definition indiccd.cpp:2361
INDI::PropertyNumber TemperatureNP
TemperatureNP Camera Temperature in Celcius.
Definition indiccd.h:669
virtual bool initProperties() override
Initialize properties initial state and value. The child class must implement this function.
Definition indiccd.cpp:157
virtual bool updateProperties() override
updateProperties is called whenever there is a change in the CONNECTION status of the driver....
Definition indiccd.cpp:540
void SetCCDCapability(uint32_t cap)
SetCCDCapability Set the CCD capabilities. All fields must be initialized.
Definition indiccd.cpp:140
virtual void SetCCDParams(int x, int y, int bpp, float xf, float yf)
Setup CCD parameters for primary CCD. Child classes call this function to update CCD parameters.
Definition indiccd.cpp:2888
void setDefaultPollingPeriod(uint32_t msec)
setDefaultPollingPeriod Change the default polling period to call TimerHit() function in the driver.
uint32_t getCurrentPollingPeriod() const
getCurrentPollingPeriod Return the current polling period.
void addAuxControls()
Add Debug, Simulation, and Configuration options to the driver.
int SetTimer(uint32_t ms)
Set a timer to call the function TimerHit after ms milliseconds.
int64_t elapsed() const
Returns the number of milliseconds since this ElapsedTimer was last started.
void start()
Starts this timer. Once started, a timer value can be checked with elapsed().
void setState(IPState state)
void apply(const char *format,...) const ATTRIBUTE_FORMAT_PRINTF(2
int SetTemperature(double temperature) override
Set CCD temperature.
bool Disconnect() override
Disconnect from device.
Definition simpleccd.cpp:47
bool AbortExposure() override
Abort ongoing exposure.
bool updateProperties() override
updateProperties is called whenever there is a change in the CONNECTION status of the driver....
Definition simpleccd.cpp:85
bool initProperties() override
Initialize properties initial state and value. The child class must implement this function.
Definition simpleccd.cpp:64
bool Connect() override
Connect to the device. INDI::DefaultDevice implementation connects to appropriate connection interfac...
Definition simpleccd.cpp:35
const char * getDefaultName() override
Definition simpleccd.cpp:56
bool StartExposure(float duration) override
Start exposing primary CCD chip.
void TimerHit() override
Callback function to be called once SetTimer duration elapses.
@ IPS_BUSY
Definition indiapi.h:161
@ IPS_ALERT
Definition indiapi.h:162
@ IPS_IDLE
Definition indiapi.h:159
@ IPS_OK
Definition indiapi.h:160
#define LOG_WARN(txt)
Definition indilogger.h:73
#define LOG_INFO(txt)
Definition indilogger.h:74
std::unique_ptr< SimpleCCD > simpleCCD(new SimpleCCD())
#define currentCCDTemperature
Definition simpleccd.cpp:28
Construct a basic INDI CCD device that simulates exposure & temperature settings. It also generates a...