Instrument Neutral Distributed Interface INDI 2.2.5
camera_bridge.h
Go to the documentation of this file.
1/*******************************************************************************
2 Copyright(c) 2025 Jasem Mutlaq. All rights reserved.
3
4 INDI Alpaca Camera Bridge
5
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2 of the License, or (at your option)
9 any later version.
10
11 This program is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20
21 The full GNU General Public License is included in this distribution in the
22 file called LICENSE.
23*******************************************************************************/
24
25#pragma once
26
27#include "device_bridge.h"
28#include "basedevice.h"
29#include "indiproperty.h"
30#include <string>
31#include <mutex>
32#include <vector>
33#include <chrono>
34
35#ifdef _USE_SYSTEM_JSONLIB
36#include <nlohmann/json.hpp>
37#else
38#include <indijson.hpp>
39#endif
40
42{
43 public:
44 CameraBridge(INDI::BaseDevice device, int deviceNumber);
46
47 // IDeviceBridge implementation
48 std::string getDeviceType() const override
49 {
50 return "camera";
51 }
52 std::string getDeviceName() const override;
53 int getDeviceNumber() const override
54 {
55 return m_DeviceNumber;
56 }
57 std::string getUniqueID() const override;
58
59 void handleRequest(const std::string &method,
60 const httplib::Request &req,
61 httplib::Response &res) override;
62
63 void updateProperty(INDI::Property property) override;
64
65 // Common Alpaca API methods
66 void handleConnected(const httplib::Request &req, httplib::Response &res) override;
67 void handleName(const httplib::Request &req, httplib::Response &res) override;
68 void handleDescription(const httplib::Request &req, httplib::Response &res) override;
69 void handleDriverInfo(const httplib::Request &req, httplib::Response &res) override;
70 void handleDriverVersion(const httplib::Request &req, httplib::Response &res) override;
71 void handleInterfaceVersion(const httplib::Request &req, httplib::Response &res) override;
72
73 private:
74 // Camera-specific Alpaca API methods - Information
75 void handleCameraXSize(const httplib::Request &req, httplib::Response &res);
76 void handleCameraYSize(const httplib::Request &req, httplib::Response &res);
77 void handleMaxBinX(const httplib::Request &req, httplib::Response &res);
78 void handleMaxBinY(const httplib::Request &req, httplib::Response &res);
79 void handleCanAsymmetricBin(const httplib::Request &req, httplib::Response &res);
80 void handlePixelSizeX(const httplib::Request &req, httplib::Response &res);
81 void handlePixelSizeY(const httplib::Request &req, httplib::Response &res);
82 void handleBinX(const httplib::Request &req, httplib::Response &res);
83 void handleBinY(const httplib::Request &req, httplib::Response &res);
84 void handleStartX(const httplib::Request &req, httplib::Response &res);
85 void handleStartY(const httplib::Request &req, httplib::Response &res);
86 void handleNumX(const httplib::Request &req, httplib::Response &res);
87 void handleNumY(const httplib::Request &req, httplib::Response &res);
88
89 // Camera-specific Alpaca API methods - Capabilities
90 void handleCanAbortExposure(const httplib::Request &req, httplib::Response &res);
91 void handleCanStopExposure(const httplib::Request &req, httplib::Response &res);
92 void handleCanPulseGuide(const httplib::Request &req, httplib::Response &res);
93 void handleCanSetCCDTemperature(const httplib::Request &req, httplib::Response &res);
94 void handleCanFastReadout(const httplib::Request &req, httplib::Response &res);
95 void handleHasShutter(const httplib::Request &req, httplib::Response &res);
96
97 // Camera-specific Alpaca API methods - Temperature
98 void handleCCDTemperature(const httplib::Request &req, httplib::Response &res);
99 void handleCoolerOn(const httplib::Request &req, httplib::Response &res);
100 void handleCoolerPower(const httplib::Request &req, httplib::Response &res);
101 void handleCanGetCoolerPower(const httplib::Request &req, httplib::Response &res);
102 void handleSetCCDTemperature(const httplib::Request &req, httplib::Response &res);
103
104 // Camera-specific Alpaca API methods - Gain/Offset
105 void handleGain(const httplib::Request &req, httplib::Response &res);
106 void handleGainMin(const httplib::Request &req, httplib::Response &res);
107 void handleGainMax(const httplib::Request &req, httplib::Response &res);
108 void handleGains(const httplib::Request &req, httplib::Response &res);
109 void handleOffset(const httplib::Request &req, httplib::Response &res);
110 void handleOffsetMin(const httplib::Request &req, httplib::Response &res);
111 void handleOffsetMax(const httplib::Request &req, httplib::Response &res);
112 void handleOffsets(const httplib::Request &req, httplib::Response &res);
113
114 // Camera-specific Alpaca API methods - Readout
115 void handleReadoutMode(const httplib::Request &req, httplib::Response &res);
116 void handleReadoutModes(const httplib::Request &req, httplib::Response &res);
117 void handleSensorType(const httplib::Request &req, httplib::Response &res);
118 void handleBayerOffsetX(const httplib::Request &req, httplib::Response &res);
119 void handleBayerOffsetY(const httplib::Request &req, httplib::Response &res);
120 void handleSensorName(const httplib::Request &req, httplib::Response &res);
121
122 // Camera-specific Alpaca API methods - Exposure
123 void handleStartExposure(const httplib::Request &req, httplib::Response &res);
124 void handleStopExposure(const httplib::Request &req, httplib::Response &res);
125 void handleAbortExposure(const httplib::Request &req, httplib::Response &res);
126 void handleImageReady(const httplib::Request &req, httplib::Response &res);
127 void handleCameraState(const httplib::Request &req, httplib::Response &res);
128 void handlePercentCompleted(const httplib::Request &req, httplib::Response &res);
129 void handleLastExposureDuration(const httplib::Request &req, httplib::Response &res);
130 void handleLastExposureStartTime(const httplib::Request &req, httplib::Response &res);
131 void handleExposureMin(const httplib::Request &req, httplib::Response &res);
132 void handleExposureMax(const httplib::Request &req, httplib::Response &res);
133
134 // Camera-specific Alpaca API methods - Image Data
135 void handleImageArray(const httplib::Request &req, httplib::Response &res);
136 void handleImageArrayVariant(const httplib::Request &req, httplib::Response &res);
137
138 // Camera-specific Alpaca API methods - Guiding
139 void handleIsPulseGuiding(const httplib::Request &req, httplib::Response &res);
140 void handlePulseGuide(const httplib::Request &req, httplib::Response &res);
141
142 // Camera-specific Alpaca API methods - Additional Properties
143 void handleMaxADU(const httplib::Request &req, httplib::Response &res);
144 void handleElectronsPerADU(const httplib::Request &req, httplib::Response &res);
145 void handleFullWellCapacity(const httplib::Request &req, httplib::Response &res);
146
147 // Helper methods for sending commands to INDI server
148 void requestNewNumber(const INDI::PropertyNumber &numberProperty);
149 void requestNewSwitch(const INDI::PropertySwitch &switchProperty);
150
151 // Helper method to extract transaction IDs from request
152 void extractTransactionIDs(const httplib::Request &req, uint32_t &clientID, uint32_t &serverID);
153
154 // Helper methods for sending standard JSON responses
155 void sendResponse(httplib::Response &res, bool success, const std::string &errorMessage);
156
157 // Generic method for sending a response with a value of any type
158 template <typename T>
159 void sendResponse(httplib::Response &res, const T &value, bool success = true,
160 const std::string &errorMessage = "", int clientID = 0, int serverID = 0);
161
162 // Response methods with transaction ID extraction from request
163 template <typename T>
164 void sendResponseValue(httplib::Response &res, const httplib::Request &req, const T &value,
165 bool success = true, const std::string &errorMessage = "");
166
167 void sendResponseStatus(httplib::Response &res, const httplib::Request &req, bool success,
168 const std::string &errorMessage = "");
169
170 // Image processing helpers
171 bool extractImageFromFITS(const uint8_t* fitsData, size_t fitsSize,
172 std::vector<uint8_t> &rawData, int &width, int &height,
173 int &bitsPerPixel, int &naxis);
174 void convertCoordinateSystem(std::vector<uint8_t> &imageData, int width, int height, int bytesPerPixel);
175 void formatImageAsJSON(const std::vector<uint8_t> &rawData, int width, int height,
176 int bitsPerPixel, int naxis, nlohmann::json& response);
177
178 // Device state
179 INDI::BaseDevice m_Device;
180 int m_DeviceNumber;
181
182 // Current state tracking - Camera Information
183 int m_CameraXSize {0};
184 int m_CameraYSize {0};
185 double m_PixelSizeX {0.0};
186 double m_PixelSizeY {0.0};
187 int m_MaxBinX {1};
188 int m_MaxBinY {1};
189 int m_BitsPerPixel {16};
190
191 // Current state tracking - Camera Settings
192 int m_BinX {1};
193 int m_BinY {1};
194 int m_StartX {0};
195 int m_StartY {0};
196 int m_NumX {0};
197 int m_NumY {0};
198
199 // Current state tracking - Capabilities
200 bool m_CanAbortExposure {true};
201 bool m_CanStopExposure {false};
202 bool m_CanPulseGuide {false};
203 bool m_CanSetCCDTemperature {false};
204 bool m_HasShutter {false};
205 bool m_CanAsymmetricBin {false};
206
207 // Current state tracking - Temperature
208 double m_CCDTemperature {0.0};
209 double m_TargetCCDTemperature {0.0};
210 bool m_CoolerOn {false};
211 double m_CoolerPower {0.0};
212
213 // Current state tracking - Gain/Offset
214 bool m_HasGain {false};
215 bool m_HasOffset {false};
216 double m_Gain {0.0};
217 double m_GainMin {0.0};
218 double m_GainMax {1000.0};
219 double m_Offset {0.0};
220 double m_OffsetMin {0.0};
221 double m_OffsetMax {10000.0};
222 std::vector<std::string> m_Gains;
223 std::vector<std::string> m_Offsets;
224
225 // Current state tracking - Readout
226 int m_ReadoutMode {0};
227 std::vector<std::string> m_ReadoutModes;
228 int m_SensorType {0}; // 0=Monochrome, 1=Color, 2=RGGB, 3=CMYG, etc.
229 int m_BayerOffsetX {0};
230 int m_BayerOffsetY {0};
231
232 // Current state tracking - Exposure
233 bool m_IsExposing {false};
234 bool m_ImageReady {false};
235 int m_CameraState {0}; // 0=Idle, 1=Waiting, 2=Exposing, 3=Reading, 4=Download, 5=Error
236 double m_PercentCompleted {0.0};
237 double m_LastExposureDuration {0.0};
238 std::string m_LastExposureStartTime;
239 std::chrono::steady_clock::time_point m_ExposureStartTime;
240 double m_ExposureMin {0.0};
241 double m_ExposureMax {10000.0};
242
243 // Current state tracking - Image Data
244 std::vector<uint8_t> m_LastImageData;
245 int m_LastImageWidth {0};
246 int m_LastImageHeight {0};
247 int m_LastImageBPP {16};
248 int m_LastImageNAxis {2};
249
250 // Current state tracking - Guiding
251 bool m_IsPulseGuiding {false};
252
253 // Current state tracking - Additional Properties
254 int m_MaxADU {65535};
255 double m_ElectronsPerADU {1.0};
256 double m_FullWellCapacity {100000.0};
257
258 // Flag to indicate if CCD_CONTROLS property is used for Gain/Offset
259 bool m_UsesCCDControlsForGainOffset {false};
260
261 // Thread safety
262 std::mutex m_Mutex;
263};
hid_device * device
void handleName(const httplib::Request &req, httplib::Response &res) override
void handleDriverInfo(const httplib::Request &req, httplib::Response &res) override
std::string getDeviceName() const override
std::string getDeviceType() const override
std::string getUniqueID() const override
void handleDriverVersion(const httplib::Request &req, httplib::Response &res) override
void handleConnected(const httplib::Request &req, httplib::Response &res) override
void handleRequest(const std::string &method, const httplib::Request &req, httplib::Response &res) override
void updateProperty(INDI::Property property) override
int getDeviceNumber() const override
void handleDescription(const httplib::Request &req, httplib::Response &res) override
void handleInterfaceVersion(const httplib::Request &req, httplib::Response &res) override
Class to provide basic INDI device functionality.
Definition basedevice.h:52
Provides generic container for INDI properties.
a class to store JSON values