citrascope 0.6.1__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. citrascope/api/abstract_api_client.py +14 -0
  2. citrascope/api/citra_api_client.py +41 -0
  3. citrascope/citra_scope_daemon.py +97 -38
  4. citrascope/hardware/abstract_astro_hardware_adapter.py +144 -8
  5. citrascope/hardware/adapter_registry.py +10 -3
  6. citrascope/hardware/devices/__init__.py +17 -0
  7. citrascope/hardware/devices/abstract_hardware_device.py +79 -0
  8. citrascope/hardware/devices/camera/__init__.py +13 -0
  9. citrascope/hardware/devices/camera/abstract_camera.py +102 -0
  10. citrascope/hardware/devices/camera/rpi_hq_camera.py +353 -0
  11. citrascope/hardware/devices/camera/usb_camera.py +402 -0
  12. citrascope/hardware/devices/camera/ximea_camera.py +744 -0
  13. citrascope/hardware/devices/device_registry.py +273 -0
  14. citrascope/hardware/devices/filter_wheel/__init__.py +7 -0
  15. citrascope/hardware/devices/filter_wheel/abstract_filter_wheel.py +73 -0
  16. citrascope/hardware/devices/focuser/__init__.py +7 -0
  17. citrascope/hardware/devices/focuser/abstract_focuser.py +78 -0
  18. citrascope/hardware/devices/mount/__init__.py +7 -0
  19. citrascope/hardware/devices/mount/abstract_mount.py +115 -0
  20. citrascope/hardware/direct_hardware_adapter.py +787 -0
  21. citrascope/hardware/filter_sync.py +94 -0
  22. citrascope/hardware/indi_adapter.py +6 -2
  23. citrascope/hardware/kstars_dbus_adapter.py +67 -96
  24. citrascope/hardware/nina_adv_http_adapter.py +81 -64
  25. citrascope/hardware/nina_adv_http_survey_template.json +4 -4
  26. citrascope/settings/citrascope_settings.py +25 -0
  27. citrascope/tasks/runner.py +105 -0
  28. citrascope/tasks/scope/static_telescope_task.py +17 -12
  29. citrascope/tasks/task.py +3 -0
  30. citrascope/time/__init__.py +13 -0
  31. citrascope/time/time_health.py +96 -0
  32. citrascope/time/time_monitor.py +164 -0
  33. citrascope/time/time_sources.py +62 -0
  34. citrascope/web/app.py +274 -51
  35. citrascope/web/static/app.js +379 -36
  36. citrascope/web/static/config.js +448 -108
  37. citrascope/web/static/filters.js +55 -0
  38. citrascope/web/static/style.css +39 -0
  39. citrascope/web/templates/dashboard.html +176 -36
  40. {citrascope-0.6.1.dist-info → citrascope-0.8.0.dist-info}/METADATA +17 -1
  41. citrascope-0.8.0.dist-info/RECORD +62 -0
  42. citrascope-0.6.1.dist-info/RECORD +0 -41
  43. {citrascope-0.6.1.dist-info → citrascope-0.8.0.dist-info}/WHEEL +0 -0
  44. {citrascope-0.6.1.dist-info → citrascope-0.8.0.dist-info}/entry_points.txt +0 -0
  45. {citrascope-0.6.1.dist-info → citrascope-0.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Filter color utilities for visual wavelength representation.
3
+ *
4
+ * Maps standard astronomical filters to their representative colors
5
+ * based on spectral wavelength. Colors are darker variants suitable
6
+ * for badge backgrounds with white text.
7
+ */
8
+
9
+ /**
10
+ * Standard filter name to color mappings.
11
+ * Colors chosen to be dark enough for white text readability.
12
+ */
13
+ export const FILTER_COLORS = {
14
+ // Johnson-Cousins UBVRI
15
+ 'U': '#33005D', // Ultraviolet (365nm)
16
+ 'B': '#002A6E', // Blue (445nm)
17
+ 'V': '#005500', // Visual/Green (551nm)
18
+ 'R': '#6E0000', // Red (658nm)
19
+ 'I': '#550000', // Near-infrared (806nm)
20
+
21
+ // Sloan ugriz
22
+ 'u': '#3B0066', // Ultraviolet (354nm)
23
+ 'g': '#00442A', // Green (477nm)
24
+ 'r': '#6E2200', // Orange-Red (623nm)
25
+ 'i': '#5D0000', // Near-infrared (763nm)
26
+ 'z': '#440000', // Infrared (913nm)
27
+
28
+ // RGB filters
29
+ 'Red': '#770000',
30
+ 'Green': '#006600',
31
+ 'Blue': '#003380',
32
+ 'Clear': '#4C4C4C', // Gray for broadband clear
33
+ 'Luminance': '#4C4C4C', // Gray for luminance
34
+
35
+ // Narrowband emission line filters
36
+ 'Ha': '#6E002A', // H-alpha (656.3nm) - characteristic deep red
37
+ 'Hb': '#004C66', // H-beta (486.1nm) - cyan
38
+ 'OIII': '#005D44', // OIII (500.7nm) - teal
39
+ 'SII': '#6E112A', // SII (672.4nm) - pink-red
40
+ };
41
+
42
+ /**
43
+ * Get color for a filter based on name.
44
+ *
45
+ * @param {string} name - Filter name (e.g., "Ha", "Red", "V")
46
+ * @returns {string} Hex color string suitable for dark badge backgrounds
47
+ */
48
+ export function getFilterColor(name) {
49
+ // Check known filters first
50
+ if (FILTER_COLORS[name]) {
51
+ return FILTER_COLORS[name];
52
+ }
53
+ // Default to gray if no match
54
+ return '#777777';
55
+ }
@@ -49,6 +49,45 @@ body {
49
49
  gap: 0.5em;
50
50
  }
51
51
 
52
+ #automatedSchedulingStatus {
53
+ display: inline-block;
54
+ min-width: 70px;
55
+ }
56
+
57
+ #toggleAutomatedSchedulingSwitch {
58
+ margin-top: 6px;
59
+ cursor: pointer;
60
+ }
61
+
62
+ #toggleAutomatedSchedulingSwitch:checked {
63
+ background-color: #198754;
64
+ border-color: #198754;
65
+ }
66
+
67
+ #toggleAutomatedSchedulingSwitch:focus {
68
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
69
+ }
70
+
71
+ #processingStatus {
72
+ display: inline-block;
73
+ min-width: 70px;
74
+ }
75
+
76
+ /* Task processing switch alignment */
77
+ #toggleProcessingSwitch {
78
+ margin-top: 6px;
79
+ cursor: pointer;
80
+ }
81
+
82
+ #toggleProcessingSwitch:checked {
83
+ background-color: #198754;
84
+ border-color: #198754;
85
+ }
86
+
87
+ #toggleProcessingSwitch:focus {
88
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
89
+ }
90
+
52
91
  /* Clickable elements */
53
92
  #headerVersion, #updateIndicator {
54
93
  cursor: pointer;
@@ -67,17 +67,51 @@
67
67
  </div>
68
68
  <div class="row mb-2">
69
69
  <div class="col-6 fw-semibold">Camera</div>
70
- <div class="col-6" id="cameraConnected"><span class="badge rounded-pill bg-secondary">Unknown</span></div>
70
+ <div class="col-6 d-flex align-items-center gap-2" id="cameraConnected"><span class="badge rounded-pill bg-secondary">Unknown</span></div>
71
+ </div>
72
+ <div class="row mb-2">
73
+ <div class="col-6 fw-semibold">
74
+ <span data-bs-toggle="tooltip" data-bs-theme="dark" data-bs-placement="top" title="Controls whether the Citra.space server will automatically assign new observation tasks to this telescope">
75
+ Automated Scheduling
76
+ </span>
77
+ </div>
78
+ <div class="col-6 d-flex align-items-center gap-2">
79
+ <span id="automatedSchedulingStatus"><span class="badge rounded-pill bg-secondary">Unknown</span></span>
80
+ <div class="form-check form-switch">
81
+ <input class="form-check-input" type="checkbox" id="toggleAutomatedSchedulingSwitch" title="Toggle automated scheduling">
82
+ <label class="form-check-label visually-hidden" for="toggleAutomatedSchedulingSwitch">Automated Scheduling</label>
83
+ </div>
84
+ </div>
71
85
  </div>
72
86
  <div class="row">
73
- <div class="col-6 fw-semibold">Task Processing</div>
87
+ <div class="col-6 fw-semibold">
88
+ <span data-bs-toggle="tooltip" data-bs-theme="dark" data-bs-placement="top" title="Controls whether this local daemon will execute tasks from its queue. Pause to safely stop observations without canceling scheduled tasks">
89
+ Task Processing
90
+ </span>
91
+ </div>
74
92
  <div class="col-6 d-flex align-items-center gap-2">
75
93
  <span id="processingStatus"><span class="badge rounded-pill bg-success">Active</span></span>
76
- <button id="toggleProcessingButton" class="btn btn-sm btn-secondary" title="Pause task processing">
77
- <span id="processingButtonIcon">Pause</span>
78
- </button>
94
+ <div class="form-check form-switch">
95
+ <input class="form-check-input" type="checkbox" id="toggleProcessingSwitch" checked title="Toggle task processing">
96
+ <label class="form-check-label visually-hidden" for="toggleProcessingSwitch">Task Processing</label>
97
+ </div>
79
98
  </div>
80
99
  </div>
100
+ <div class="row">
101
+ <div class="col-6 fw-semibold">
102
+ <span data-bs-toggle="tooltip" data-bs-theme="dark" data-bs-placement="top" title="System clock synchronization status. Accurate time is critical for astronomical observations">
103
+ Time Sync
104
+ </span>
105
+ </div>
106
+ <div class="col-6 d-flex align-items-center gap-2">
107
+ <span id="timeSyncStatus"><span class="badge rounded-pill bg-secondary">Unknown</span></span>
108
+ <small class="text-muted" id="timeOffsetDisplay">-</small>
109
+ </div>
110
+ </div>
111
+ <!-- Missing Dependencies Alert -->
112
+ <div id="missingDependenciesAlert" class="alert alert-warning mt-3 mb-0" role="alert" style="display: none;">
113
+ <!-- Populated by JavaScript -->
114
+ </div>
81
115
  </div>
82
116
  </div>
83
117
  </div>
@@ -92,12 +126,12 @@
92
126
  <div class="col-6" id="hardwareAdapter">-</div>
93
127
  </div>
94
128
  <div class="row mb-2">
95
- <div class="col-6 fw-semibold">Right Ascension</div>
96
- <div class="col-6" id="telescopeRA">-</div>
129
+ <div class="col-6 fw-semibold">RA / DEC</div>
130
+ <div class="col-6" id="telescopeCoords">-</div>
97
131
  </div>
98
132
  <div class="row mb-2">
99
- <div class="col-6 fw-semibold">Declination</div>
100
- <div class="col-6" id="telescopeDEC">-</div>
133
+ <div class="col-6 fw-semibold">Enabled Filters</div>
134
+ <div class="col-6" id="enabledFilters">-</div>
101
135
  </div>
102
136
  <div class="row">
103
137
  <div class="col-6 fw-semibold">Ground Station</div>
@@ -166,9 +200,6 @@
166
200
  </div>
167
201
 
168
202
  <div class="container my-4" id="configSection" style="display: none;">
169
- <div id="configError" class="alert alert-danger" style="display: none;" role="alert"></div>
170
- <div id="configSuccess" class="alert alert-success" style="display: none;" role="alert"></div>
171
-
172
203
  <form id="configForm">
173
204
  <div class="row g-3 mb-3">
174
205
  <!-- API Configuration Card -->
@@ -239,34 +270,74 @@
239
270
  <!-- Dynamic Adapter Settings Container -->
240
271
  <div id="adapter-settings-container"></div>
241
272
 
273
+ <!-- Missing Dependencies Alert (Config Page) -->
274
+ <div id="configMissingDependenciesAlert" class="alert alert-warning mt-3" role="alert" style="display: none;">
275
+ <!-- Populated by JavaScript -->
276
+ </div>
277
+
242
278
  <!-- Filter Configuration Section (shown when adapter supports filters) -->
243
279
  <div id="filterConfigSection" style="display: none; margin-top: 1.5rem;">
244
280
  <hr class="border-secondary">
245
- <div class="d-flex justify-content-between align-items-center mb-3">
246
- <h5 class="mb-0">Filter Configuration</h5>
247
- <div class="text-end">
248
- <button type="button" class="btn btn-sm btn-outline-primary" id="runAutofocusButton">
249
- <span id="autofocusButtonText">Run Autofocus</span>
250
- <span id="autofocusButtonSpinner" class="spinner-border spinner-border-sm ms-2" style="display: none;" role="status"></span>
251
- </button>
252
- <div><small class="text-muted">Note: Pause task processing before running autofocus</small></div>
281
+ <h5 class="mb-3">Filter Configuration</h5>
282
+ <p id="filterAdapterChangeMessage" class="text-muted mb-3" style="display: none;">
283
+ Save configuration to edit filter settings for this adapter
284
+ </p>
285
+ <div class="row">
286
+ <!-- Filter List Column -->
287
+ <div class="col-12 col-md-6">
288
+ <h6 class="mb-2">Filters</h6>
289
+ <div id="filterTableContainer">
290
+ <table class="table table-dark table-sm">
291
+ <thead>
292
+ <tr>
293
+ <th>Enabled</th>
294
+ <th>Name</th>
295
+ <th>Focus Position</th>
296
+ </tr>
297
+ </thead>
298
+ <tbody id="filterTableBody">
299
+ <!-- Filter rows will be populated by JavaScript -->
300
+ </tbody>
301
+ </table>
302
+ <div id="noFiltersMessage" class="text-muted small" style="display: none;">
303
+ No filters configured. Connect to hardware to discover filters.
304
+ </div>
305
+ </div>
253
306
  </div>
254
- </div>
255
- <div id="filterTableContainer">
256
- <table class="table table-dark table-sm">
257
- <thead>
258
- <tr>
259
- <th>Filter ID</th>
260
- <th>Name</th>
261
- <th>Focus Position</th>
262
- </tr>
263
- </thead>
264
- <tbody id="filterTableBody">
265
- <!-- Filter rows will be populated by JavaScript -->
266
- </tbody>
267
- </table>
268
- <div id="noFiltersMessage" class="text-muted small" style="display: none;">
269
- No filters configured. Connect to hardware to discover filters.
307
+
308
+ <!-- Autofocus Column -->
309
+ <div class="col-12 col-md-6">
310
+ <h6 class="mb-2">Autofocus</h6>
311
+ <div class="mb-3">
312
+ <button type="button" class="btn btn-sm btn-outline-primary w-100" id="runAutofocusButton">
313
+ <span id="autofocusButtonText">Run Autofocus</span>
314
+ <span id="autofocusButtonSpinner" class="spinner-border spinner-border-sm ms-2" style="display: none;" role="status"></span>
315
+ </button>
316
+ </div>
317
+ <div class="mb-3">
318
+ <label class="form-label small text-muted">Last Autofocus</label>
319
+ <div id="lastAutofocusDisplay" class="text-light">Never</div>
320
+ </div>
321
+ <div class="mb-3">
322
+ <div class="form-check">
323
+ <input class="form-check-input" type="checkbox" id="scheduled_autofocus_enabled">
324
+ <label class="form-check-label" for="scheduled_autofocus_enabled">
325
+ Enable Scheduled Autofocus
326
+ </label>
327
+ </div>
328
+ </div>
329
+ <div class="mb-3">
330
+ <label for="autofocus_interval_minutes" class="form-label small">Autofocus Interval</label>
331
+ <select id="autofocus_interval_minutes" class="form-select form-select-sm">
332
+ <option value="30">30 minutes</option>
333
+ <option value="60" selected>60 minutes</option>
334
+ <option value="120">120 minutes (2 hours)</option>
335
+ <option value="180">180 minutes (3 hours)</option>
336
+ </select>
337
+ </div>
338
+ <div id="nextAutofocusDisplay" class="small text-muted" style="display: none;">
339
+ Next autofocus in: <span id="nextAutofocusTime">--</span>
340
+ </div>
270
341
  </div>
271
342
  </div>
272
343
  </div>
@@ -274,6 +345,24 @@
274
345
  </div>
275
346
  </div>
276
347
 
348
+ <!-- Time Synchronization Settings Card -->
349
+ <div class="col-12">
350
+ <div class="card bg-dark text-light border-secondary">
351
+ <div class="card-header">
352
+ <h5 class="mb-0">Time Synchronization</h5>
353
+ </div>
354
+ <div class="card-body">
355
+ <div class="row g-3">
356
+ <div class="col-12 col-md-6">
357
+ <label for="time_offset_pause_ms" class="form-label">Pause Threshold (ms)</label>
358
+ <input type="number" class="form-control form-control-sm" id="time_offset_pause_ms" min="1" max="10000" step="1" value="500">
359
+ <small class="text-muted">Clock drift that triggers task pause (NTP-based monitoring)</small>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </div>
364
+ </div>
365
+
277
366
  <!-- Logging Settings Card -->
278
367
  <div class="col-12">
279
368
  <div class="card bg-dark text-light border-secondary">
@@ -482,6 +571,57 @@
482
571
  </div>
483
572
  </div>
484
573
 
574
+ <!-- Camera Control Modal -->
575
+ <div class="modal fade" id="cameraControlModal" tabindex="-1" aria-labelledby="cameraControlModalLabel" aria-hidden="true">
576
+ <div class="modal-dialog modal-lg modal-dialog-centered">
577
+ <div class="modal-content bg-dark text-light border-secondary">
578
+ <div class="modal-header border-secondary">
579
+ <h5 class="modal-title" id="cameraControlModalLabel"><i class="bi bi-camera"></i> Camera Control</h5>
580
+ <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
581
+ </div>
582
+ <div class="modal-body">
583
+ <div class="row g-3">
584
+ <div class="col-12">
585
+ <label for="exposureDuration" class="form-label">Exposure Duration (seconds)</label>
586
+ <input type="number" id="exposureDuration" class="form-control" value="0.1" min="0.001" max="300" step="0.001">
587
+ <small class="text-muted">Range: 0.001 to 300 seconds</small>
588
+ </div>
589
+ </div>
590
+
591
+ <!-- Capture Result Area -->
592
+ <div id="captureResult" class="mt-3" style="display: none;">
593
+ <hr class="border-secondary">
594
+ <h6>Latest Capture</h6>
595
+ <div class="alert alert-success mb-2">
596
+ <strong>Filename:</strong> <span id="captureFilename"></span><br>
597
+ <strong>Format:</strong> <span id="captureFormat"></span>
598
+ </div>
599
+ </div>
600
+
601
+ <!-- Images Directory -->
602
+ <div class="mt-3">
603
+ <hr class="border-secondary">
604
+ <h6>Images Directory</h6>
605
+ <p class="text-muted small mb-1">All captured images are saved to:</p>
606
+ <p><a href="#" id="imagesDirLink" class="text-break"></a></p>
607
+ </div>
608
+ </div>
609
+ <div class="modal-footer border-secondary">
610
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
611
+ <button type="button" class="btn btn-primary" id="captureButton" onclick="captureImage()">
612
+ <span id="captureButtonText">Capture</span>
613
+ <span id="captureButtonSpinner" class="spinner-border spinner-border-sm ms-2" role="status" style="display: none;">
614
+ <span class="visually-hidden">Capturing...</span>
615
+ </span>
616
+ </button>
617
+ </div>
618
+ </div>
619
+ </div>
620
+ </div>
621
+
622
+ <!-- Toast Container for Notifications -->
623
+ <div class="toast-container position-fixed top-0 end-0 p-3" style="z-index: 9999;" id="toastContainer"></div>
624
+
485
625
  <script type="module" src="/static/app.js"></script>
486
626
 
487
627
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: citrascope
3
- Version: 0.6.1
3
+ Version: 0.8.0
4
4
  Summary: Remotely control a telescope while it polls for tasks, collects and edge processes data, and delivers results and data for further processing.
5
5
  Project-URL: Homepage, https://citra.space
6
6
  Project-URL: Documentation, https://docs.citra.space/citrascope/
@@ -25,6 +25,7 @@ Requires-Python: <3.13,>=3.10
25
25
  Requires-Dist: click
26
26
  Requires-Dist: fastapi>=0.104.0
27
27
  Requires-Dist: httpx
28
+ Requires-Dist: ntplib>=0.4.0
28
29
  Requires-Dist: platformdirs>=4.0.0
29
30
  Requires-Dist: python-dateutil
30
31
  Requires-Dist: requests
@@ -36,6 +37,14 @@ Requires-Dist: dbus-python; extra == 'all'
36
37
  Requires-Dist: pixelemon; extra == 'all'
37
38
  Requires-Dist: plotly; extra == 'all'
38
39
  Requires-Dist: pyindi-client; extra == 'all'
40
+ Provides-Extra: all-hardware
41
+ Requires-Dist: cv2-enumerate-cameras>=1.0.0; extra == 'all-hardware'
42
+ Requires-Dist: opencv-python>=4.8.0; extra == 'all-hardware'
43
+ Requires-Dist: picamera2>=0.3.12; extra == 'all-hardware'
44
+ Requires-Dist: pixelemon; extra == 'all-hardware'
45
+ Requires-Dist: plotly; extra == 'all-hardware'
46
+ Requires-Dist: pyindi-client; extra == 'all-hardware'
47
+ Requires-Dist: ximea-api>=1.0.0; extra == 'all-hardware'
39
48
  Provides-Extra: build
40
49
  Requires-Dist: build; extra == 'build'
41
50
  Provides-Extra: deploy
@@ -58,10 +67,17 @@ Requires-Dist: plotly; extra == 'indi'
58
67
  Requires-Dist: pyindi-client; extra == 'indi'
59
68
  Provides-Extra: kstars
60
69
  Requires-Dist: dbus-python; extra == 'kstars'
70
+ Provides-Extra: rpi
71
+ Requires-Dist: picamera2>=0.3.12; extra == 'rpi'
61
72
  Provides-Extra: test
62
73
  Requires-Dist: mockito; extra == 'test'
63
74
  Requires-Dist: pytest; extra == 'test'
64
75
  Requires-Dist: pytest-cov; extra == 'test'
76
+ Provides-Extra: usb-camera
77
+ Requires-Dist: cv2-enumerate-cameras>=1.0.0; extra == 'usb-camera'
78
+ Requires-Dist: opencv-python>=4.8.0; extra == 'usb-camera'
79
+ Provides-Extra: ximea
80
+ Requires-Dist: ximea-api>=1.0.0; extra == 'ximea'
65
81
  Description-Content-Type: text/markdown
66
82
 
67
83
  # CitraScope
@@ -0,0 +1,62 @@
1
+ citrascope/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ citrascope/__main__.py,sha256=W7uY30MOuIlmhzVEoiZ_6BMmKrsqIvxcAxqw4-pOT3k,596
3
+ citrascope/citra_scope_daemon.py,sha256=VIvRnvrsx1spfefHwTzkaxO7lAiNi0aau1EiDyYI8S4,16050
4
+ citrascope/constants.py,sha256=Mc7SLzCelUMDV96BIwP684fFLGANCOEO_mM3GCeRDVY,968
5
+ citrascope/api/abstract_api_client.py,sha256=GJXpHTQEsE3QRbRjLCj3LkQsxvtPxHggXieQLomAO1o,1012
6
+ citrascope/api/citra_api_client.py,sha256=JOu5uNuBYXizmQZWUo77YNjOdMA_uSc7RA8qzw_4e7M,7570
7
+ citrascope/hardware/abstract_astro_hardware_adapter.py,sha256=vRlBFvGlzgb8AQIEojwGC68KFkhq5sELjZ9XWoOtf5k,14381
8
+ citrascope/hardware/adapter_registry.py,sha256=7Vi6RRxb5ygIJeHXd6objp9h0w96_JKaz2TnADkbv8Y,3597
9
+ citrascope/hardware/direct_hardware_adapter.py,sha256=eKYXQ2fx_RZ3A_b0Zh1SsawFnGHHXiVHTiUjWTPOkmo,29031
10
+ citrascope/hardware/filter_sync.py,sha256=jOo_P78TJC_FYhvm2SHvCAvQoBkVQNBiBx7jUSBdqhg,3463
11
+ citrascope/hardware/indi_adapter.py,sha256=VvlB13-9hk0ytfUjdNTGsLHfUz2q062KPDesBS8qxUQ,30060
12
+ citrascope/hardware/kstars_dbus_adapter.py,sha256=kpP8wC_HDHvPNMkynBiT7KGVGmi5F5_4uCQ7BJrOZHY,43439
13
+ citrascope/hardware/kstars_scheduler_template.esl,sha256=uHbS3Zs1S9_hz8kiMkrkZj5ye0z1T1zsy_8MO4N0D4Y,836
14
+ citrascope/hardware/kstars_sequence_template.esq,sha256=u1fzSGtyq7ybKvZcNRjDtQK7QnrQim-E6qiZyG9P7H0,626
15
+ citrascope/hardware/nina_adv_http_adapter.py,sha256=NZNF-_BMZVNhlOsx4k39v2hrTQWSJ1RTrEIe30rrCOg,28619
16
+ citrascope/hardware/nina_adv_http_survey_template.json,sha256=5y0l0h0rWZK6i6GxfAn-9rx7wA7aN5deAVe7op9RKPo,14480
17
+ citrascope/hardware/devices/__init__.py,sha256=6G9wIiSXDsKxAqW1goP6lWePbYfHpoW8j39OEeDsHqs,576
18
+ citrascope/hardware/devices/abstract_hardware_device.py,sha256=CYaLaOQ7TMjuZMfiYZnnERTuvCl-hSHv45qwDhxhPoo,2118
19
+ citrascope/hardware/devices/device_registry.py,sha256=1_ools6WQrbCtvb-9x6xStyeRnMXRtQ9P3BrhTFG2P4,8818
20
+ citrascope/hardware/devices/camera/__init__.py,sha256=ItA7cymHoMy-vnyk562XOcibLovCI5w4t1jixfzU0Ro,456
21
+ citrascope/hardware/devices/camera/abstract_camera.py,sha256=0s16dl8Pc8b4xYQH-KMJ-zHEwAofrDjk9cbm9ZNQcbQ,2857
22
+ citrascope/hardware/devices/camera/rpi_hq_camera.py,sha256=6mMU2l-GbdYhta6vP2HzF2OYdw2YW0UWqRDlhQtBn3k,11658
23
+ citrascope/hardware/devices/camera/usb_camera.py,sha256=JkyYyZS2esgSkksu56Ro6yDsZi_dP1TWWWd1jy0tvpg,14096
24
+ citrascope/hardware/devices/camera/ximea_camera.py,sha256=TpmQZeNBp4MM7R4icOghdg00IwVh7YTyZGpZ3fdDiBA,30715
25
+ citrascope/hardware/devices/filter_wheel/__init__.py,sha256=CukW3VbU3ttrTcKvVwvGiOrWhIe3fhjhVnMK7DVChK8,174
26
+ citrascope/hardware/devices/filter_wheel/abstract_filter_wheel.py,sha256=iMwZDOmZbjsfjQNSBTaAZCAmY_iO-siIB1o5078h8X4,1822
27
+ citrascope/hardware/devices/focuser/__init__.py,sha256=lPbSW43_gjYU9Q6E1pEHw-dMorA6F4vHms2JbdIZOnA,151
28
+ citrascope/hardware/devices/focuser/abstract_focuser.py,sha256=NfNzSVsqQEWwXVTmUFeTfCzV16jE66s_2TcQECME7lE,1959
29
+ citrascope/hardware/devices/mount/__init__.py,sha256=swyX-IXdZ_4gZa3MMLWgHdu2hTDjjgOkEOdrMdv1-fI,141
30
+ citrascope/hardware/devices/mount/abstract_mount.py,sha256=QKneKhK_YFyIFiEEld2w1O80U9IqjtHMggX30nLEUGw,2790
31
+ citrascope/logging/__init__.py,sha256=YU38HLMWfbXh_H-s7W7Zx2pbCR4f_tRk7z0G8xqz4_o,179
32
+ citrascope/logging/_citrascope_logger.py,sha256=GkqNpFJWiatqrBr8t4o2nHt7V9bBDJ8mysM0F4AXMa8,3479
33
+ citrascope/logging/web_log_handler.py,sha256=d0XQzHJZ5M1v3H351tdkBYg7EOwFzXpp7PA9nYejIV0,2659
34
+ citrascope/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ citrascope/settings/citrascope_settings.py,sha256=iClMV57Qd3_fTlC6nagAJg7M635x_Fu1kmhn3FH_o2k,7090
36
+ citrascope/settings/settings_file_manager.py,sha256=Yijb-I9hbbVJ2thkr7OrfkNknSPt1RDpsE7VvqAs0a8,4193
37
+ citrascope/tasks/runner.py,sha256=uEXMP_FSpi3zCqekvWWx4w6vRG-k3LdbfKwT77EsUrA,18292
38
+ citrascope/tasks/task.py,sha256=wK6t5iWhxxB0SC9k2nT_FS0ohBLnimwgBoWdAQQtrgI,1429
39
+ citrascope/tasks/scope/base_telescope_task.py,sha256=wIdyUxplFNhf_YMdCXOK6pG7HF7tZn_id59TvYyWZAY,9674
40
+ citrascope/tasks/scope/static_telescope_task.py,sha256=WYoqCPool2_Sel5VvjEAWWg_ZvytW9Y9wUxLPc6-Ojw,1627
41
+ citrascope/tasks/scope/tracking_telescope_task.py,sha256=k5LEmEi_xnFHNjqPNYb8_tqDdCFD3YGe25Wh_brJXHk,1130
42
+ citrascope/time/__init__.py,sha256=sN81g6VT2qiyEF6e1RAPba2m0PRdcaSCwNUyx1mMnzQ,363
43
+ citrascope/time/time_health.py,sha256=jRrERYbzqNRzjJejW1Zp04Ka85P3EYZGMOd15bH5KIU,2598
44
+ citrascope/time/time_monitor.py,sha256=GAb6Otc3iwMd_HR7mV6Gxsne3y08wgIu1a5lzc_3KYs,5828
45
+ citrascope/time/time_sources.py,sha256=3oPKV6s44DsVmyRyxyPhRmyr8YTAErMzrmFHe_BT5_U,1739
46
+ citrascope/web/__init__.py,sha256=CgU36fyNSxGXjUy3hsHwx7UxF8UO4Qsb7PjC9-6tRmY,38
47
+ citrascope/web/app.py,sha256=hu2IErgjOAcRyFnIMhFIF50fe-S4eQMzrPJXE8dlqDg,37109
48
+ citrascope/web/server.py,sha256=IJJk4HgEwcsjHercL-Q5z39NmJRbkNk_51HIUKKhtRE,5242
49
+ citrascope/web/static/api.js,sha256=s-b1FIw-pTo3A8kLlLINVqHhIvfHwTWA7cEvz4N8Gqc,1924
50
+ citrascope/web/static/app.js,sha256=kXrPGeO2UqEc2RVTdVw7XTYzIOlSWSasPcvEhuSbo9I,39169
51
+ citrascope/web/static/config.js,sha256=MynZZMoF61UstDZbQ5ctDMmuCugPE7R5WP80IcUmgF0,35730
52
+ citrascope/web/static/filters.js,sha256=a_Ug4potNvcNu1Q-d7eodUdixZuXOIQYVdBOEdqhmn8,1768
53
+ citrascope/web/static/style.css,sha256=AMmdJ3aR7aAst71j7HP41_KiwyjjeqNLu5DsDJ_mahk,3690
54
+ citrascope/web/static/websocket.js,sha256=UITw1DDfehOKpjlltn5MXhewZYGKzPFmaTtMFtC0-Ps,3931
55
+ citrascope/web/static/img/citra.png,sha256=Bq8dPWB6fNz7a_H0FuEtNmZWcPHH2iV2OC-fMg4REbQ,205570
56
+ citrascope/web/static/img/favicon.png,sha256=zrbUlpFXDB_zmsIdhhn8_klnc2Ma3N6Q8ouBMAxFjbM,24873
57
+ citrascope/web/templates/dashboard.html,sha256=Sci5M57E9px-Pquokw5xXvhipBOhaQ2iVo5hb9jgvAw,39877
58
+ citrascope-0.8.0.dist-info/METADATA,sha256=kQPmtCYhE_dYgd3HvEd-51owPjUYBqoyk5HZ81eKGQw,8693
59
+ citrascope-0.8.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
60
+ citrascope-0.8.0.dist-info/entry_points.txt,sha256=fP22Lt8bNZ_whBowDnOWSADf_FUrgAWnIhqqPf5Xo2g,55
61
+ citrascope-0.8.0.dist-info/licenses/LICENSE,sha256=4B_Ug8tnhTwde7QywOV3HhQcweHJeI0QaGdZfJLxsV8,1068
62
+ citrascope-0.8.0.dist-info/RECORD,,
@@ -1,41 +0,0 @@
1
- citrascope/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- citrascope/__main__.py,sha256=W7uY30MOuIlmhzVEoiZ_6BMmKrsqIvxcAxqw4-pOT3k,596
3
- citrascope/citra_scope_daemon.py,sha256=XPskPbtenx-WNenlnbb5QhvvH_amK4vST-Uw6Pg2cts,13567
4
- citrascope/constants.py,sha256=Mc7SLzCelUMDV96BIwP684fFLGANCOEO_mM3GCeRDVY,968
5
- citrascope/api/abstract_api_client.py,sha256=gjmA9mw1O-TK16nYahOWClAwqPc_L1E3F2llZJeKTPw,624
6
- citrascope/api/citra_api_client.py,sha256=8rpz25Diy8YhuCiQ9HqMi4TIqxAc6BbrvqoFu8u-orQ,6007
7
- citrascope/hardware/abstract_astro_hardware_adapter.py,sha256=Xc1zNuvlyYapWto37dzFfaKM62pKDN7VC8r4oGF8Up4,8140
8
- citrascope/hardware/adapter_registry.py,sha256=fFIZhXYphZ_p480c6hICpcx9fNOeX-EG2tvLHm372dM,3170
9
- citrascope/hardware/indi_adapter.py,sha256=uNrjkfxD0zjOPfar6J-frb6A87VkEjsL7SD9N9bEsC8,29903
10
- citrascope/hardware/kstars_dbus_adapter.py,sha256=Rvv_skURngGIfNhtpVzykq1Bs1vIyIXAb4sBlBwd4YI,44643
11
- citrascope/hardware/kstars_scheduler_template.esl,sha256=uHbS3Zs1S9_hz8kiMkrkZj5ye0z1T1zsy_8MO4N0D4Y,836
12
- citrascope/hardware/kstars_sequence_template.esq,sha256=u1fzSGtyq7ybKvZcNRjDtQK7QnrQim-E6qiZyG9P7H0,626
13
- citrascope/hardware/nina_adv_http_adapter.py,sha256=Jzg9j74bEFdY77XX-O-UE-e3Q3Y8PQ-xL7-igXMqbwg,27637
14
- citrascope/hardware/nina_adv_http_survey_template.json,sha256=beg4H6Bzby-0x5uDc_eRJQ_rKs8VT64sDJyAzS_q1l4,14424
15
- citrascope/logging/__init__.py,sha256=YU38HLMWfbXh_H-s7W7Zx2pbCR4f_tRk7z0G8xqz4_o,179
16
- citrascope/logging/_citrascope_logger.py,sha256=GkqNpFJWiatqrBr8t4o2nHt7V9bBDJ8mysM0F4AXMa8,3479
17
- citrascope/logging/web_log_handler.py,sha256=d0XQzHJZ5M1v3H351tdkBYg7EOwFzXpp7PA9nYejIV0,2659
18
- citrascope/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- citrascope/settings/citrascope_settings.py,sha256=Env0L8sM0e9v7Os9CIqeRX3Nq0-DrgxmGLeNzbOm1To,5671
20
- citrascope/settings/settings_file_manager.py,sha256=Yijb-I9hbbVJ2thkr7OrfkNknSPt1RDpsE7VvqAs0a8,4193
21
- citrascope/tasks/runner.py,sha256=77rn8ML7Fpay7B0YbXag6rn70IbEYYVMNNFLLDaHA50,13903
22
- citrascope/tasks/task.py,sha256=0u0oN56E6KaNz19ba_7WuY43Sk4CTXc8UPT7sdUpRXo,1287
23
- citrascope/tasks/scope/base_telescope_task.py,sha256=wIdyUxplFNhf_YMdCXOK6pG7HF7tZn_id59TvYyWZAY,9674
24
- citrascope/tasks/scope/static_telescope_task.py,sha256=nrRV2M2bUfIwTtZacAmidwj1dlTxyZgTbFEVkpxzL7c,1389
25
- citrascope/tasks/scope/tracking_telescope_task.py,sha256=k5LEmEi_xnFHNjqPNYb8_tqDdCFD3YGe25Wh_brJXHk,1130
26
- citrascope/web/__init__.py,sha256=CgU36fyNSxGXjUy3hsHwx7UxF8UO4Qsb7PjC9-6tRmY,38
27
- citrascope/web/app.py,sha256=LGimBCHWmaPrLkh6JDpJ7IoC__423lhO7NldQGTFzKI,26181
28
- citrascope/web/server.py,sha256=IJJk4HgEwcsjHercL-Q5z39NmJRbkNk_51HIUKKhtRE,5242
29
- citrascope/web/static/api.js,sha256=s-b1FIw-pTo3A8kLlLINVqHhIvfHwTWA7cEvz4N8Gqc,1924
30
- citrascope/web/static/app.js,sha256=BtryRqh1ujXXRmAMWLdEhFQtdr_XaxXohagD2HVJMSE,26457
31
- citrascope/web/static/config.js,sha256=l0brTgkQ4UW-C9a2wabkvVGwb-wPnJSmM4lb63s0KbY,21500
32
- citrascope/web/static/style.css,sha256=z5D4FHWm-JBb0Cu0HWPD_4V7qnXNBuOllrPJD9nHI38,2961
33
- citrascope/web/static/websocket.js,sha256=UITw1DDfehOKpjlltn5MXhewZYGKzPFmaTtMFtC0-Ps,3931
34
- citrascope/web/static/img/citra.png,sha256=Bq8dPWB6fNz7a_H0FuEtNmZWcPHH2iV2OC-fMg4REbQ,205570
35
- citrascope/web/static/img/favicon.png,sha256=zrbUlpFXDB_zmsIdhhn8_klnc2Ma3N6Q8ouBMAxFjbM,24873
36
- citrascope/web/templates/dashboard.html,sha256=7N5JPlihK3WNDe8fnFMfIRfCgp4ZZJLbl2TVc_nY0SU,30119
37
- citrascope-0.6.1.dist-info/METADATA,sha256=41ckB6zCtSPkVOBDayoKVIfF3boDtsGLkvvLvYc8Teg,7945
38
- citrascope-0.6.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
39
- citrascope-0.6.1.dist-info/entry_points.txt,sha256=fP22Lt8bNZ_whBowDnOWSADf_FUrgAWnIhqqPf5Xo2g,55
40
- citrascope-0.6.1.dist-info/licenses/LICENSE,sha256=4B_Ug8tnhTwde7QywOV3HhQcweHJeI0QaGdZfJLxsV8,1068
41
- citrascope-0.6.1.dist-info/RECORD,,