From ee89224511c4bb8609a49a781eb82d6d454f844b Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 29 Feb 2024 19:46:19 -0300 Subject: [PATCH 01/40] [desktop]: Fix auto resize window timeout --- desktop/src/app/filterwheel/filterwheel.component.ts | 2 +- desktop/src/shared/services/electron.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index d0ea85152..c68cb6d34 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -68,7 +68,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { this.update() if (wasConnected !== event.device.connected) { - setTimeout(() => electron.autoResizeWindow(), 250) + electron.autoResizeWindow() } }) } diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index 4de8889f7..dcf70a174 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -169,7 +169,7 @@ export class ElectronService { this.resizeWindow(size) } } else { - return setTimeout(() => this.autoResizeWindow(), timeout) + return setTimeout(() => this.autoResizeWindow(0), timeout) } } From 66926abf82e00edc2140a886eb37e1690d48603e Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 29 Feb 2024 19:47:19 -0300 Subject: [PATCH 02/40] [desktop]: Remove Buy Me a Coffee button --- desktop/README.md | 2 -- desktop/src/app/about/about.component.html | 3 --- 2 files changed, 5 deletions(-) diff --git a/desktop/README.md b/desktop/README.md index 054c3dc07..e48a26619 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -65,5 +65,3 @@ The complete integrated solution for all of your astronomical imaging needs. ## Support me [![](src/assets/images/donate-with-paypal-blue.svg)](https://www.paypal.com/donate/?hosted_button_id=U8TGGJTKSZUCA) - -[![](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/tiagohm) diff --git a/desktop/src/app/about/about.component.html b/desktop/src/app/about/about.component.html index 162bee3b6..c59cd2d6a 100644 --- a/desktop/src/app/about/about.component.html +++ b/desktop/src/app/about/about.component.html @@ -18,9 +18,6 @@ - - Buy Me A Coffee - \ No newline at end of file From 05d36d424374b1018f4abacccf90473d077da8f0 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 29 Feb 2024 20:41:23 -0300 Subject: [PATCH 03/40] [api][desktop]: Show progress on Sky Atlas database update --- .../nebulosa/api/atlas/SkyAtlasUpdateTask.kt | 81 ++++++++++++------- desktop/app/main.ts | 13 +-- desktop/src/app/app.module.ts | 2 + desktop/src/app/home/home.component.html | 2 + desktop/src/app/home/home.component.ts | 11 +++ .../src/shared/services/electron.service.ts | 3 +- desktop/src/shared/types/atlas.types.ts | 5 ++ 7 files changed, 84 insertions(+), 33 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt index 8eced252c..6aea23af6 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt @@ -25,57 +25,84 @@ class SkyAtlasUpdateTask( override val body = "Sky Atlas database is being updated" } + data class ProgressChanged(val progress: Int) : NotificationEvent { + + override val type = "SKY_ATLAS.PROGRESS_CHANGED" + override val body = "Sky Atlas database is updating" + override val silent = true + } + data object UpdateFinished : NotificationEvent { override val type = "SKY_ATLAS.UPDATE_FINISHED" override val body = "Sky Atlas database was updated" } + data object UpdateFailed : NotificationEvent { + + override val type = "SKY_ATLAS.UPDATE_FINISHED" + override val body = "Sky Atlas database update failed" + override val severity = NotificationEvent.Severity.ERROR + } + @Scheduled(fixedDelay = Long.MAX_VALUE, timeUnit = TimeUnit.SECONDS) override fun run() { + var needsUpdate = false var request = Request.Builder().get().url(VERSION_URL).build() - httpClient.newCall(request).execute().use { response -> - if (response.isSuccessful) { - val newestVersion = response.body!!.string() + try { + httpClient.newCall(request).execute().use { response -> + if (response.isSuccessful) { + val newestVersion = response.body!!.string().trim() - if (newestVersion != preferenceService.getText(VERSION_KEY) || simbadEntityRepository.isEmpty()) { - LOG.info("Sky Atlas database is out of date. Downloading...") + if (newestVersion != preferenceService.getText(VERSION_KEY) || simbadEntityRepository.isEmpty()) { + needsUpdate = true - messageService.sendMessage(UpdateStarted) + LOG.info("Sky Atlas database is out of date. Downloading...") - var finished = false + messageService.sendMessage(UpdateStarted) - for (i in 0 until MAX_DATA_COUNT) { - if (finished) break + var finished = false - val url = DATA_URL.format(i) - request = Request.Builder().get().url(url).build() + for (i in 0 until MAX_DATA_COUNT) { + if (finished) break - httpClient.newCall(request).execute().use { - if (it.isSuccessful) { - val reader = SimbadDatabaseReader(it.body!!.byteStream().source()) + val url = DATA_URL.format(i) + request = Request.Builder().get().url(url).build() - for (entity in reader) { - simbadEntityRepository.save(entity) + messageService.sendMessage(ProgressChanged(i)) + + httpClient.newCall(request).execute().use { + if (it.isSuccessful) { + val reader = SimbadDatabaseReader(it.body!!.byteStream().source()) + + for (entity in reader) { + simbadEntityRepository.save(entity) + } + } else if (it.code == 404) { + finished = true + } else { + messageService.sendMessage(UpdateFailed) + + LOG.error("Failed to download. url={}, code={}", url, it.code) + return } - } else if (it.code == 404) { - finished = true - } else { - LOG.error("Failed to download. url={}, code={}", url, it.code) - return } } - } - preferenceService.putText(VERSION_KEY, newestVersion) - messageService.sendMessage(UpdateFinished) + preferenceService.putText(VERSION_KEY, newestVersion) + messageService.sendMessage(UpdateFinished) - LOG.info("Sky Atlas database was updated. version={}, size={}", newestVersion, simbadEntityRepository.size) - } else { - LOG.info("Sky Atlas database is up to date. version={}, size={}", newestVersion, simbadEntityRepository.size) + LOG.info("Sky Atlas database was updated. version={}, size={}", newestVersion, simbadEntityRepository.size) + } else { + LOG.info("Sky Atlas database is up to date. version={}, size={}", newestVersion, simbadEntityRepository.size) + } } } + } finally { + if (needsUpdate) { + messageService.sendMessage(ProgressChanged(100)) + } } } diff --git a/desktop/app/main.ts b/desktop/app/main.ts index 4561e7691..7a6d2279c 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -20,6 +20,7 @@ let webSocket: Client const args = process.argv.slice(1) const serve = args.some(e => e === '--serve') +const appIcon = path.join(__dirname, serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) app.commandLine.appendSwitch('disable-http-cache') @@ -236,11 +237,13 @@ function createSplashScreen() { } function showNotification(event: NotificationEvent) { - const icon = path.join(__dirname, serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) - - new Notification({ ...event, icon }) - .on('click', () => sendToAllWindows(event.type, event)) - .show() + if (event.silent) { + sendToAllWindows(event.type, event) + } else { + new Notification({ ...event, icon: appIcon }) + .on('click', () => sendToAllWindows(event.type, event)) + .show() + } } function findWindowById(id: number) { diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index fb4b0f37c..6219d3926 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -27,6 +27,7 @@ import { MenuModule } from 'primeng/menu' import { MessageModule } from 'primeng/message' import { MultiSelectModule } from 'primeng/multiselect' import { OverlayPanelModule } from 'primeng/overlaypanel' +import { ProgressBarModule } from 'primeng/progressbar' import { ScrollPanelModule } from 'primeng/scrollpanel' import { SelectButtonModule } from 'primeng/selectbutton' import { SlideMenuModule } from 'primeng/slidemenu' @@ -144,6 +145,7 @@ import { SettingsComponent } from './settings/settings.component' MessageModule, MultiSelectModule, OverlayPanelModule, + ProgressBarModule, ScrollPanelModule, SelectButtonModule, SlideMenuModule, diff --git a/desktop/src/app/home/home.component.html b/desktop/src/app/home/home.component.html index 05c0a890b..01bc528ea 100644 --- a/desktop/src/app/home/home.component.html +++ b/desktop/src/app/home/home.component.html @@ -93,6 +93,8 @@
Sky Atlas
+
diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index baaa2922f..3159dd0b4 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -41,6 +41,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { readonly connections: ConnectionDetails[] = [] connection?: ConnectionDetails newConnection?: [ConnectionDetails, ConnectionDetails | undefined] + skyAtlasProgress?: number = undefined cameras: Camera[] = [] mounts: Mount[] = [] @@ -192,6 +193,16 @@ export class HomeComponent implements AfterContentInit, OnDestroy { } }) + electron.on('SKY_ATLAS.PROGRESS_CHANGED', event => { + ngZone.run(() => { + if (event.progress >= 100) { + this.skyAtlasProgress = undefined + } else { + this.skyAtlasProgress = event.progress + } + }) + }) + this.connections = preference.connections.get() this.connections.forEach(e => e.connected = false) this.connection = this.connections[0] diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index dcf70a174..d78aff675 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -10,7 +10,7 @@ import * as fs from 'fs' import { DARVElapsed, TPPAElapsed } from '../types/alignment.types' import { ApiEventType, DeviceMessageEvent } from '../types/api.types' import { CloseWindow, InternalEventType, JsonFile, OpenDirectory, OpenFile, SaveJson } from '../types/app.types' -import { Location } from '../types/atlas.types' +import { Location, SkyAtlasUpdated } from '../types/atlas.types' import { Camera, CameraCaptureElapsed } from '../types/camera.types' import { INDIMessageEvent } from '../types/device.types' import { FlatWizardElapsed } from '../types/flat-wizard.types' @@ -54,6 +54,7 @@ type EventMappedType = { 'SEQUENCER.ELAPSED': SequencerElapsed 'FLAT_WIZARD.ELAPSED': FlatWizardElapsed 'CONNECTION.CLOSED': ConnectionClosed + 'SKY_ATLAS.PROGRESS_CHANGED': SkyAtlasUpdated } @Injectable({ providedIn: 'root' }) diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index f0db163e2..bb1487567 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -1,3 +1,4 @@ +import { NotificationEvent } from './app.types' import { PierSide } from './mount.types' export type Angle = string | number @@ -273,3 +274,7 @@ export const EMPTY_LOCATION: Location = { offsetInMinutes: 0, selected: false, } + +export interface SkyAtlasUpdated extends NotificationEvent { + progress: number +} From a48a63bd5e2fe48c2a4744d6e19320a5be3aaa1c Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 1 Mar 2024 01:04:48 -0300 Subject: [PATCH 04/40] [api]: Implement AstroBin Equipment API --- nebulosa-astrobin-api/build.gradle.kts | 18 +++++ .../kotlin/nebulosa/astrobin/api/Astrobin.kt | 34 ++++++++ .../nebulosa/astrobin/api/AstrobinService.kt | 30 +++++++ .../kotlin/nebulosa/astrobin/api/Camera.kt | 9 +++ .../kotlin/nebulosa/astrobin/api/Equipment.kt | 10 +++ .../main/kotlin/nebulosa/astrobin/api/Page.kt | 8 ++ .../kotlin/nebulosa/astrobin/api/Sensor.kt | 17 ++++ .../nebulosa/astrobin/api/SensorColor.kt | 8 ++ .../kotlin/nebulosa/astrobin/api/Telescope.kt | 11 +++ .../src/test/kotlin/AstrobinServiceTest.kt | 79 +++++++++++++++++++ settings.gradle.kts | 1 + 11 files changed, 225 insertions(+) create mode 100644 nebulosa-astrobin-api/build.gradle.kts create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Astrobin.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/AstrobinService.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Camera.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Equipment.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Page.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Sensor.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/SensorColor.kt create mode 100644 nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Telescope.kt create mode 100644 nebulosa-astrobin-api/src/test/kotlin/AstrobinServiceTest.kt diff --git a/nebulosa-astrobin-api/build.gradle.kts b/nebulosa-astrobin-api/build.gradle.kts new file mode 100644 index 000000000..98db43b7f --- /dev/null +++ b/nebulosa-astrobin-api/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + kotlin("jvm") + id("maven-publish") +} + +dependencies { + api(project(":nebulosa-retrofit")) + implementation(project(":nebulosa-log")) + testImplementation(project(":nebulosa-test")) +} + +publishing { + publications { + create("pluginMaven") { + from(components["java"]) + } + } +} diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Astrobin.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Astrobin.kt new file mode 100644 index 000000000..9a56de5de --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Astrobin.kt @@ -0,0 +1,34 @@ +package nebulosa.astrobin.api + +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.Path +import retrofit2.http.Query + +interface Astrobin { + + @GET("api/v2/equipment/sensor") + @Headers("Accept: application/json") + fun sensors(@Query("page") page: Int): Call> + + @GET("api/v2/equipment/sensor/{id}") + @Headers("Accept: application/json") + fun sensor(@Path("id") id: Long): Call + + @GET("api/v2/equipment/camera") + @Headers("Accept: application/json") + fun cameras(@Query("page") page: Int): Call> + + @GET("api/v2/equipment/camera/{id}") + @Headers("Accept: application/json") + fun camera(@Path("id") id: Long): Call + + @GET("api/v2/equipment/telescope") + @Headers("Accept: application/json") + fun telescopes(@Query("page") page: Int): Call> + + @GET("api/v2/equipment/telescope/{id}") + @Headers("Accept: application/json") + fun telescope(@Path("id") id: Long): Call +} diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/AstrobinService.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/AstrobinService.kt new file mode 100644 index 000000000..0889edcaf --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/AstrobinService.kt @@ -0,0 +1,30 @@ +package nebulosa.astrobin.api + +import nebulosa.retrofit.RetrofitService +import okhttp3.OkHttpClient +import retrofit2.create + +class AstrobinService( + url: String = URL, + httpClient: OkHttpClient? = null, +) : RetrofitService(url, httpClient) { + + private val service by lazy { retrofit.create() } + + fun sensors(page: Int) = service.sensors(page) + + fun sensor(id: Long) = service.sensor(id) + + fun cameras(page: Int) = service.cameras(page) + + fun camera(id: Long) = service.camera(id) + + fun telescopes(page: Int) = service.telescopes(page) + + fun telescope(id: Long) = service.telescope(id) + + companion object { + + const val URL = "https://www.astrobin.com/" + } +} diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Camera.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Camera.kt new file mode 100644 index 000000000..b27fe5e9b --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Camera.kt @@ -0,0 +1,9 @@ +package nebulosa.astrobin.api + +data class Camera( + override val id: Long = 0L, + override val brandName: String = "", + override val name: String = "", + val cooled: Boolean = false, + val sensor: Long = 0L, +) : Equipment diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Equipment.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Equipment.kt new file mode 100644 index 000000000..609523b5a --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Equipment.kt @@ -0,0 +1,10 @@ +package nebulosa.astrobin.api + +sealed interface Equipment { + + val id: Long + + val brandName: String + + val name: String +} diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Page.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Page.kt new file mode 100644 index 000000000..310277cc4 --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Page.kt @@ -0,0 +1,8 @@ +package nebulosa.astrobin.api + +data class Page( + val count: Int = 0, + val results: List = emptyList(), + val next: String? = null, + val previous: String? = null, +) diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Sensor.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Sensor.kt new file mode 100644 index 000000000..8d365110e --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Sensor.kt @@ -0,0 +1,17 @@ +package nebulosa.astrobin.api + +@Suppress("ArrayInDataClass") +data class Sensor( + override val id: Long = 0L, + override val brandName: String = "", + override val name: String = "", + val quantumEfficiency: Double = 0.0, + val pixelSize: Double = 0.0, + val pixelWidth: Int = 0, + val pixelHeight: Int = 0, + val readNoise: Double = 0.0, + val fullWellCapacity: Double = 0.0, + val adc: Int = 0, + val color: SensorColor = SensorColor.MONO, + val cameras: LongArray = LongArray(0), +) : Equipment diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/SensorColor.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/SensorColor.kt new file mode 100644 index 000000000..974e96cb0 --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/SensorColor.kt @@ -0,0 +1,8 @@ +package nebulosa.astrobin.api + +import com.fasterxml.jackson.annotation.JsonValue + +enum class SensorColor(@JsonValue val code: String) { + MONO("M"), + COLOR("C"), +} diff --git a/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Telescope.kt b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Telescope.kt new file mode 100644 index 000000000..c67e1f26f --- /dev/null +++ b/nebulosa-astrobin-api/src/main/kotlin/nebulosa/astrobin/api/Telescope.kt @@ -0,0 +1,11 @@ +package nebulosa.astrobin.api + +data class Telescope( + override val id: Long = 0L, + override val brandName: String = "", + override val name: String = "", + val type: String = "", + val aperture: Double = 0.0, + val minFocalLength: Double = 0.0, + val maxFocalLength: Double = 0.0, +) : Equipment diff --git a/nebulosa-astrobin-api/src/test/kotlin/AstrobinServiceTest.kt b/nebulosa-astrobin-api/src/test/kotlin/AstrobinServiceTest.kt new file mode 100644 index 000000000..1b3379a01 --- /dev/null +++ b/nebulosa-astrobin-api/src/test/kotlin/AstrobinServiceTest.kt @@ -0,0 +1,79 @@ +import io.kotest.core.annotation.EnabledIf +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.booleans.shouldBeFalse +import io.kotest.matchers.collections.shouldContain +import io.kotest.matchers.doubles.shouldBeExactly +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.longs.shouldBeExactly +import io.kotest.matchers.shouldBe +import nebulosa.astrobin.api.AstrobinService +import nebulosa.astrobin.api.SensorColor +import nebulosa.test.NonGitHubOnlyCondition + +@EnabledIf(NonGitHubOnlyCondition::class) +class AstrobinServiceTest : StringSpec() { + + init { + val service = AstrobinService() + + "sensors" { + val page = service.sensors(1).execute().body()!! + + page.count shouldBeExactly 469 + page.results.size shouldBeExactly 50 + + println(page.results[0]) + } + "sensor" { + val sensor = service.sensor(184).execute().body()!! + + sensor.id shouldBeExactly 184 + sensor.brandName shouldBe "Sony" + sensor.name shouldBe "IMX492 (mono)" + sensor.quantumEfficiency shouldBeExactly 90.0 + sensor.pixelSize shouldBeExactly 2.32 + sensor.pixelWidth shouldBeExactly 8240 + sensor.pixelHeight shouldBeExactly 5628 + sensor.readNoise shouldBeExactly 1.3 + sensor.fullWellCapacity shouldBeExactly 14.0 + sensor.adc shouldBeExactly 12 + sensor.color shouldBe SensorColor.MONO + sensor.cameras.toList().shouldContain(529) + } + "cameras" { + val page = service.cameras(1).execute().body()!! + + page.count shouldBeExactly 3362 + page.results.size shouldBeExactly 50 + + println(page.results[0]) + } + "camera" { + val camera = service.camera(529).execute().body()!! + + camera.id shouldBeExactly 529 + camera.brandName shouldBe "ZWO" + camera.name shouldBe "ASI294MM" + camera.cooled.shouldBeFalse() + camera.sensor shouldBeExactly 184 + } + "telescopes" { + val page = service.telescopes(1).execute().body()!! + + page.count shouldBeExactly 3813 + page.results.size shouldBeExactly 50 + + println(page.results[0]) + } + "telescope" { + val telescope = service.telescope(1097).execute().body()!! + + telescope.id shouldBeExactly 1097 + telescope.brandName shouldBe "GSO" + telescope.name shouldBe "6\" f/9 Ritchey-Chretien" + telescope.aperture shouldBeExactly 152.0 + telescope.minFocalLength shouldBeExactly 1368.0 + telescope.maxFocalLength shouldBeExactly 1368.0 + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 11ad21ad8..0b00ef413 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -49,6 +49,7 @@ include(":nebulosa-alpaca-api") include(":nebulosa-alpaca-discovery-protocol") include(":nebulosa-alpaca-indi") include(":nebulosa-astap") +include(":nebulosa-astrobin-api") include(":nebulosa-astrometrynet") include(":nebulosa-astrometrynet-jna") include(":nebulosa-batch-processing") From b80ea6bb5a95976901fe1d12afa8b63136eb63a8 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 1 Mar 2024 01:05:29 -0300 Subject: [PATCH 05/40] [api]: Generate .json for Cameras and Telescopes from AstroBin Equipment API --- api/build.gradle.kts | 1 + .../test/kotlin/AstrobinEquipmentGenerator.kt | 99 +++++++++++++++++++ data/.gitignore | 1 + 3 files changed, 101 insertions(+) create mode 100644 api/src/test/kotlin/AstrobinEquipmentGenerator.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts index b57cf5fb6..b6a6881ed 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -46,6 +46,7 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") kapt("org.springframework:spring-context-indexer:6.1.4") + testImplementation(project(":nebulosa-astrobin-api")) testImplementation(project(":nebulosa-skycatalog-stellarium")) testImplementation(project(":nebulosa-test")) } diff --git a/api/src/test/kotlin/AstrobinEquipmentGenerator.kt b/api/src/test/kotlin/AstrobinEquipmentGenerator.kt new file mode 100644 index 000000000..1da8f76c9 --- /dev/null +++ b/api/src/test/kotlin/AstrobinEquipmentGenerator.kt @@ -0,0 +1,99 @@ +import com.fasterxml.jackson.databind.ObjectMapper +import nebulosa.astrobin.api.AstrobinService +import nebulosa.astrobin.api.Camera +import nebulosa.astrobin.api.Sensor +import nebulosa.astrobin.api.Telescope +import java.nio.file.Path +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.Executors +import kotlin.io.path.outputStream +import kotlin.math.max + +object AstrobinEquipmentGenerator { + + @JvmStatic private val SENSORS = ConcurrentHashMap() + @JvmStatic private val CAMERAS = ConcurrentHashMap() + @JvmStatic private val TELESCOPES = ConcurrentHashMap() + @JvmStatic private val OBJECT_MAPPER = ObjectMapper() + @JvmStatic private val CAMERA_PATH = Path.of("data", "astrobin", "cameras.json") + @JvmStatic private val TELESCOPE_PATH = Path.of("data", "astrobin", "telescopes.json") + @JvmStatic private val EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) + + data class CameraEquipment( + val id: Long, val name: String, val sensor: String, + val width: Int, val height: Int, val pixelSize: Double, + ) + + data class TelescopeEquipment( + val id: Long, val name: String, + val aperture: Double, val focalLength: Double, + ) + + @JvmStatic + fun main(args: Array) { + val astrobin = AstrobinService() + + val task1 = EXECUTOR_SERVICE.submit { + for (i in 1..99) { + val sensors = astrobin.sensors(i).execute().body() + ?.takeIf { it.results.isNotEmpty() }?.results ?: break + + println("SENSOR: $i") + + sensors.forEach { SENSORS[it.id] = it } + } + } + + val task2 = EXECUTOR_SERVICE.submit { + for (i in 1..99) { + val cameras = astrobin.cameras(i).execute().body() + ?.takeIf { it.results.isNotEmpty() }?.results ?: break + + println("CAMERA: $i") + + cameras.forEach { CAMERAS[it.id] = it } + } + } + + val task3 = EXECUTOR_SERVICE.submit { + for (i in 1..99) { + val telescopes = astrobin.telescopes(i).execute().body() + ?.takeIf { it.results.isNotEmpty() }?.results ?: break + + println("TELESCOPE: $i") + + telescopes.forEach { TELESCOPES[it.id] = it } + } + } + + task1.get() + task2.get() + task3.get() + + println("CAMERA SIZE: ${CAMERAS.size}") + println("SENSOR SIZE: ${SENSORS.size}") + println("TELESCOPE SIZE: ${TELESCOPES.size}") + + val output = HashSet(max(CAMERAS.size, TELESCOPES.size)) + + for ((key, value) in CAMERAS) { + val sensor = SENSORS[value.sensor] ?: continue + + val name = "%s %s".format(value.brandName, value.name).replace("(color)", "").replace("(mono)", "").trim() + val sensorName = "%s %s".format(sensor.brandName, sensor.name) + output.add(CameraEquipment(key, name, sensorName, sensor.pixelWidth, sensor.pixelHeight, sensor.pixelSize)) + } + + CAMERA_PATH.outputStream().use { OBJECT_MAPPER.writeValue(it, output) } + output.clear() + + for ((key, value) in TELESCOPES) { + val name = "%s %s".format(value.brandName, value.name) + output.add(TelescopeEquipment(key, name, value.aperture, value.maxFocalLength)) + } + + TELESCOPE_PATH.outputStream().use { OBJECT_MAPPER.writeValue(it, output) } + + EXECUTOR_SERVICE.shutdownNow() + } +} diff --git a/data/.gitignore b/data/.gitignore index 5e06793b2..f58680a40 100644 --- a/data/.gitignore +++ b/data/.gitignore @@ -1 +1,2 @@ simbad/ +astrobin/ From 8ea61135f73a7a2347dc6ef7824390d966c9fb3f Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 1 Mar 2024 14:02:09 -0300 Subject: [PATCH 06/40] [api][desktop]: List cameras and telescopes for Field of View on Image --- .../nebulosa/api/image/ImageController.kt | 13 ++++ .../kotlin/nebulosa/api/image/ImageService.kt | 11 ++++ desktop/src/app/image/image.component.html | 65 ++++++++++++++++--- desktop/src/app/image/image.component.ts | 53 ++++++++++++++- desktop/src/shared/services/api.service.ts | 10 ++- desktop/src/shared/types/image.types.ts | 17 +++++ desktop/src/styles.scss | 9 +++ 7 files changed, 167 insertions(+), 11 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt index 86c50f567..ae4e0184e 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt @@ -8,6 +8,7 @@ import nebulosa.imaging.algorithms.transformation.ProtectionMethod import nebulosa.indi.device.camera.Camera import nebulosa.star.detection.ImageStar import org.hibernate.validator.constraints.Range +import org.springframework.http.HttpHeaders import org.springframework.web.bind.annotation.* import java.nio.file.Path @@ -77,4 +78,16 @@ class ImageController( @RequestParam path: Path, @RequestParam(required = false, defaultValue = "16") @Valid @Range(min = 8, max = 16) bitLength: Int, ) = imageService.histogram(path, bitLength) + + @GetMapping("fov-cameras") + fun fovCameras(response: HttpServletResponse) { + response.addHeader(HttpHeaders.CONTENT_TYPE, "application/json") + return response.outputStream.write(imageService.fovCameras) + } + + @GetMapping("fov-telescopes") + fun fovTelescopes(response: HttpServletResponse) { + response.addHeader(HttpHeaders.CONTENT_TYPE, "application/json") + return response.outputStream.write(imageService.fovTelescopes) + } } diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index 35abce005..c2affce8a 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -30,6 +30,7 @@ import org.springframework.http.HttpStatus import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor import org.springframework.stereotype.Service import org.springframework.web.server.ResponseStatusException +import java.net.URI import java.nio.file.Path import java.time.LocalDateTime import java.util.* @@ -52,6 +53,16 @@ class ImageService( private val starDetector: StarDetector, ) { + val fovCameras by lazy { + URI.create("https://github.com/tiagohm/nebulosa.data/raw/main/astrobin/cameras.json") + .toURL().openConnection().getInputStream().readAllBytes() + } + + val fovTelescopes by lazy { + URI.create("https://github.com/tiagohm/nebulosa.data/raw/main/astrobin/telescopes.json") + .toURL().openConnection().getInputStream().readAllBytes() + } + @Synchronized fun openImage( path: Path, camera: Camera?, debayer: Boolean = true, calibrate: Boolean = false, force: Boolean = false, diff --git a/desktop/src/app/image/image.component.html b/desktop/src/app/image/image.component.html index e2a0b3830..2ac264770 100644 --- a/desktop/src/app/image/image.component.html +++ b/desktop/src/app/image/image.component.html @@ -409,8 +409,9 @@
-
+
Telescope +
@@ -427,11 +428,14 @@
-
- Camera Resolution (px) +
+ Resolution (px)
-
- Camera Pixel Size (µm) +
+ +
+
+ Pixel Size (µm)
@@ -482,10 +486,10 @@
- - + +
@for (item of fovs; track $index) { @@ -519,6 +523,49 @@
+ +
+
+ + +
+ {{ item.name }} + {{ item.sensor }} + {{ item.width }}x{{ item.height }} / {{ item.pixelSize }}µm +
+
+
+
+
+ + + +
+ + +
+
+ + +
+ {{ item.name }} + {{ item.aperture }}mm / {{ item.focalLength }}mm +
+
+
+
+
+ + + +
+
X: {{ mouseCoordinate.x }}
diff --git a/desktop/src/app/image/image.component.ts b/desktop/src/app/image/image.component.ts index 13236c505..3b3c4d9e4 100644 --- a/desktop/src/app/image/image.component.ts +++ b/desktop/src/app/image/image.component.ts @@ -17,7 +17,7 @@ import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' import { CheckableMenuItem, ToggleableMenuItem } from '../../shared/types/app.types' import { Angle, AstronomicalObject, DeepSkyObject, EquatorialCoordinateJ2000, Star } from '../../shared/types/atlas.types' -import { DEFAULT_FOV, DetectedStar, EMPTY_IMAGE_SOLVED, FITSHeaderItem, FOV, ImageAnnotation, ImageChannel, ImageData, ImageInfo, ImagePreference, ImageSolved, ImageStatisticsBitOption, SCNRProtectionMethod, SCNR_PROTECTION_METHODS } from '../../shared/types/image.types' +import { DEFAULT_FOV, DetectedStar, EMPTY_IMAGE_SOLVED, FITSHeaderItem, FOV, FOVCamera, FOVTelescope, ImageAnnotation, ImageChannel, ImageData, ImageInfo, ImagePreference, ImageSolved, ImageStatisticsBitOption, SCNRProtectionMethod, SCNR_PROTECTION_METHODS } from '../../shared/types/image.types' import { Mount } from '../../shared/types/mount.types' import { DEFAULT_SOLVER_TYPES } from '../../shared/types/settings.types' import { CoordinateInterpolator, InterpolatedCoordinate } from '../../shared/utils/coordinate-interpolation' @@ -112,6 +112,19 @@ export class ImageComponent implements AfterViewInit, OnDestroy { readonly fov = structuredClone(DEFAULT_FOV) fovs: FOV[] = [] editedFOV?: FOV + showFOVCamerasDialog = false + fovCameras: FOVCamera[] = [] + fovCamera?: FOVCamera + showFOVTelescopesDialog = false + fovTelescopes: FOVTelescope[] = [] + fovTelescope?: FOVTelescope + + get canAddFOV() { + return this.fov.aperture && this.fov.focalLength && + this.fov.cameraSize.width && this.fov.cameraSize.height && + this.fov.pixelSize.width && this.fov.pixelSize.height && + this.fov.bin + } private panZoom?: PanZoom private imageURL!: string @@ -791,6 +804,44 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } } + async showFOVCameras() { + if (!this.fovCameras.length) { + this.fovCameras = await this.api.fovCameras() + } + + this.fovCamera = undefined + this.showFOVCamerasDialog = true + } + + async showFOVTelescopes() { + if (!this.fovTelescopes.length) { + this.fovTelescopes = await this.api.fovTelescopes() + } + + this.fovTelescope = undefined + this.showFOVTelescopesDialog = true + } + + chooseCamera() { + if (this.fovCamera) { + this.fov.cameraSize.width = this.fovCamera.width + this.fov.cameraSize.height = this.fovCamera.height + this.fov.pixelSize.width = this.fovCamera.pixelSize + this.fov.pixelSize.height = this.fovCamera.pixelSize + this.fovCamera = undefined + this.showFOVCamerasDialog = false + } + } + + chooseTelescope() { + if (this.fovTelescope) { + this.fov.aperture = this.fovTelescope.aperture + this.fov.focalLength = this.fovTelescope.focalLength + this.fovTelescope = undefined + this.showFOVTelescopesDialog = false + } + } + addFOV() { if (this.computeFOV(this.fov)) { this.fovs.push(structuredClone(this.fov)) diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 60a5a9798..54b1b2680 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -10,7 +10,7 @@ import { Focuser } from '../types/focuser.types' import { HipsSurvey } from '../types/framing.types' import { GuideDirection, GuideOutput, Guider, GuiderHistoryStep, SettleInfo } from '../types/guider.types' import { ConnectionStatus, ConnectionType } from '../types/home.types' -import { CoordinateInterpolation, DetectedStar, ImageAnnotation, ImageChannel, ImageInfo, ImageSolved, SCNRProtectionMethod } from '../types/image.types' +import { CoordinateInterpolation, DetectedStar, FOVCamera, FOVTelescope, ImageAnnotation, ImageChannel, ImageInfo, ImageSolved, SCNRProtectionMethod } from '../types/image.types' import { CelestialLocationType, Mount, SlewRate, TrackMode } from '../types/mount.types' import { SequencePlan } from '../types/sequencer.types' import { PlateSolverOptions } from '../types/settings.types' @@ -504,6 +504,14 @@ export class ApiService { return this.http.get(`image/histogram?${query}`) } + fovCameras() { + return this.http.get('image/fov-cameras') + } + + fovTelescopes() { + return this.http.get('image/fov-telescopes') + } + // CALIBRATION calibrationFrames(camera: Camera) { diff --git a/desktop/src/shared/types/image.types.ts b/desktop/src/shared/types/image.types.ts index 4d30bf254..01d49d0cc 100644 --- a/desktop/src/shared/types/image.types.ts +++ b/desktop/src/shared/types/image.types.ts @@ -147,3 +147,20 @@ export const DEFAULT_FOV: FOV = { rotation: 0, color: '#FFFF00', } + +export interface FOVEquipment { + id: number + name: string +} + +export interface FOVCamera extends FOVEquipment { + sensor: string + width: number + height: number + pixelSize: number +} + +export interface FOVTelescope extends FOVEquipment { + aperture: number + focalLength: number +} diff --git a/desktop/src/styles.scss b/desktop/src/styles.scss index 1a9358367..c11bf3a89 100644 --- a/desktop/src/styles.scss +++ b/desktop/src/styles.scss @@ -257,6 +257,7 @@ p-dropdownitem *, ::-webkit-scrollbar { width: 6px; + height: 6px; } ::-webkit-scrollbar-thumb { @@ -270,6 +271,14 @@ p-dropdownitem *, background-color: transparent; } +::-webkit-scrollbar-track-piece { + background-color: transparent; +} + +::-webkit-scrollbar-corner { + background-color: transparent; +} + @font-face { font-family: 'icomoon'; src: url('assets/fonts/icomoon.ttf'); From cd7f45fffc2b564a464f25b896a551e5850ae539 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 1 Mar 2024 22:30:19 -0300 Subject: [PATCH 07/40] [desktop]: Remove electron-store dependency --- .../nebulosa/api/messages/MessageService.kt | 6 +- desktop/app/main.ts | 112 +++++-- desktop/app/package-lock.json | 304 ------------------ desktop/app/package.json | 1 - desktop/src/app/app.component.html | 2 +- desktop/src/app/app.component.ts | 6 +- 6 files changed, 89 insertions(+), 342 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt b/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt index 0a4206e7c..4f52f6b7f 100644 --- a/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt +++ b/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt @@ -23,7 +23,7 @@ class MessageService( private fun handleSessionSubscribe(event: SessionSubscribeEvent) { val destination = SimpMessageHeaderAccessor.wrap(event.message).destination ?: return - if (destination == EVENT_NAME && connected.compareAndSet(false, true)) { + if (destination == DESTINATION && connected.compareAndSet(false, true)) { while (messageQueue.isNotEmpty()) { sendMessage(messageQueue.take()) } @@ -37,7 +37,7 @@ class MessageService( fun sendMessage(event: MessageEvent) { if (connected.get()) { - simpleMessageTemplate.convertAndSend(EVENT_NAME, event) + simpleMessageTemplate.convertAndSend(DESTINATION, event) } else if (event is QueueableEvent) { LOG.debug { "queueing message. event=$event" } messageQueue.offer(event) @@ -46,7 +46,7 @@ class MessageService( companion object { - const val EVENT_NAME = "NEBULOSA.EVENT" + const val DESTINATION = "NEBULOSA.EVENT" @JvmStatic private val LOG = loggerFor() } diff --git a/desktop/app/main.ts b/desktop/app/main.ts index 7a6d2279c..f8433291e 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -1,6 +1,5 @@ import { Client } from '@stomp/stompjs' -import { BrowserWindow, Menu, Notification, app, dialog, ipcMain, screen, shell } from 'electron' -import * as ElectronStore from 'electron-store' +import { BrowserWindow, Menu, Notification, Point, Size, app, dialog, ipcMain, screen, shell } from 'electron' import * as fs from 'fs' import { ChildProcessWithoutNullStreams, spawn } from 'node:child_process' import * as path from 'path' @@ -8,9 +7,8 @@ import * as path from 'path' import { WebSocket } from 'ws' import { MessageEvent } from '../src/shared/types/api.types' import { CloseWindow, InternalEventType, JsonFile, NotificationEvent, OpenDirectory, OpenFile, OpenWindow } from '../src/shared/types/app.types' -Object.assign(global, { WebSocket }) -const store = new ElectronStore() +Object.assign(global, { WebSocket }) const browserWindows = new Map() const modalWindows = new Map void }>() @@ -20,10 +18,60 @@ let webSocket: Client const args = process.argv.slice(1) const serve = args.some(e => e === '--serve') +const appDir = path.join(app.getPath('appData'), 'nebulosa') const appIcon = path.join(__dirname, serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) +if (!fs.existsSync(appDir)) { + console.info(appDir) + fs.mkdirSync(appDir) +} + +class SimpleDB { + + private readonly data: Record + + constructor(private path: fs.PathLike) { + try { + if (fs.existsSync(path)) { + const text = fs.readFileSync(path).toString('utf-8') + this.data = text.length > 0 ? JSON.parse(text) : {} + } else { + this.data = {} + } + } catch (e) { + this.data = {} + console.error(e) + } + } + + get(key: string) { + return this.data[key] as T | undefined + } + + set(key: string, value: any) { + if (value === undefined || value === null) delete this.data[key] + else this.data[key] = value + + try { + this.save() + } catch (e) { + console.error(e) + } + } + + save() { + fs.writeFileSync(this.path, JSON.stringify(this.data)) + } +} + +const database = new SimpleDB(path.join(appDir, 'nebulosa.electron.json')) + app.commandLine.appendSwitch('disable-http-cache') +function isNotificationEvent(event: MessageEvent): event is NotificationEvent { + return event.eventName === 'NOTIFICATION.SENT' +} + function createMainWindow() { browserWindows.get('splash')?.close() browserWindows.delete('splash') @@ -36,12 +84,10 @@ function createMainWindow() { webSocket.subscribe('NEBULOSA.EVENT', message => { const event = JSON.parse(message.body) as MessageEvent - if (event.eventName) { - if (event.eventName === 'NOTIFICATION.SENT') { - showNotification(event as NotificationEvent) - } else { - sendToAllWindows(event.eventName, event) - } + if (isNotificationEvent(event)) { + showNotification(event) + } else if (event.eventName) { + sendToAllWindows(event.eventName, event) } else { console.warn('invalid message event', event) } @@ -103,12 +149,15 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { const height = options.height ? Math.trunc(computeHeight(options.height)) : 416 + const id = options.id const resizable = options.resizable ?? false + const autoResizable = options.autoResizable !== false + const modal = options.modal ?? false const icon = options.icon ?? 'nebulosa' const data = encodeURIComponent(JSON.stringify(options.data || {})) - const savedPos = !options.modal ? store.get(`window.${options.id}.position`, undefined) as { x: number, y: number } | undefined : undefined - const savedSize = !options.modal && options.resizable ? store.get(`window.${options.id}.size`, undefined) as { width: number, height: number } | undefined : undefined + const savedPos = !modal ? database.get(`window.${id}.position`) : undefined + const savedSize = !modal && resizable ? database.get(`window.${id}.size`) : undefined if (savedPos) { savedPos.x = Math.max(0, Math.min(savedPos.x, screenSize.width)) @@ -122,9 +171,7 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { window = new BrowserWindow({ title: 'Nebulosa', - frame: false, - modal: options.modal, - parent, + frame: false, modal, parent, width: savedSize?.width || width, height: savedSize?.height || height, x: savedPos?.x ?? undefined, @@ -151,9 +198,9 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { debug({ showDevTools: false }) require('electron-reloader')(module) - window.loadURL(`http://localhost:4200/${options.path}?data=${data}&resizable=${resizable}`) + window.loadURL(`http://localhost:4200/${options.path}?data=${data}`) } else { - const url = new URL(path.join('file:', __dirname, `index.html`) + `#/${options.path}?data=${data}&resizable=${resizable}`) + const url = new URL(path.join('file:', __dirname, `index.html`) + `#/${options.path}?data=${data}`) window.loadURL(url.href) } @@ -163,24 +210,33 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { }) window.on('moved', () => { - if (window) { - const [x, y] = window.getPosition() - store.set(`window.${options.id}.position`, { x, y }) - } + const [x, y] = window!.getPosition() + database.set(`window.${id}.position`, { x, y }) + console.info('window moved:', x, y) }) - if (!serve && window.isResizable() && options.autoResizable !== false) { + if (resizable && autoResizable !== false) { window.on('resized', () => { - if (window) { - const [width, height] = window.getSize() - store.set(`window.${options.id}.size`, { width, height }) - } + const [width, height] = window!.getSize() + database.set(`window.${id}.size`, { width, height }) + console.info('window resized:', width, height) }) } window.on('close', () => { const homeWindow = browserWindows.get('home') + if (!modal) { + const [x, y] = window!.getPosition() + const [width, height] = window!.getSize() + + database.set(`window.${id}.position`, { x, y }) + + if (resizable) { + database.set(`window.${id}.size`, { width, height }) + } + } + if (window === homeWindow) { browserWindows.delete('home') @@ -208,7 +264,7 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { } }) - browserWindows.set(options.id, window) + browserWindows.set(id, window) return window } @@ -441,7 +497,7 @@ try { const maxHeight = screen.getPrimaryDisplay().workAreaSize.height const height = Math.max(0, Math.min(data, maxHeight)) window.setSize(size[0], height) - console.info('window resized:', size[0], height) + console.info('window auto resized:', size[0], height) return true }) diff --git a/desktop/app/package-lock.json b/desktop/app/package-lock.json index e680391c5..1dcf87531 100644 --- a/desktop/app/package-lock.json +++ b/desktop/app/package-lock.json @@ -10,7 +10,6 @@ "license": "MIT", "dependencies": { "@stomp/stompjs": "7.0.0", - "electron-store": "8.1.0", "ws": "8.16.0" } }, @@ -19,304 +18,6 @@ "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==" }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-store": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", - "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", - "dependencies": { - "conf": "^10.2.0", - "type-fest": "^2.17.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/ws": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", @@ -336,11 +37,6 @@ "optional": true } } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/desktop/app/package.json b/desktop/app/package.json index 05301bee2..84fca0719 100644 --- a/desktop/app/package.json +++ b/desktop/app/package.json @@ -12,7 +12,6 @@ "private": true, "dependencies": { "@stomp/stompjs": "7.0.0", - "electron-store": "8.1.0", "ws": "8.16.0" } } diff --git a/desktop/src/app/app.component.html b/desktop/src/app/app.component.html index 36c098d32..fef76d594 100644 --- a/desktop/src/app/app.component.html +++ b/desktop/src/app/app.component.html @@ -19,7 +19,7 @@ styleClass="select-none cursor-pointer"> - diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index c62ee9d04..0ece200c6 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -17,7 +17,7 @@ export interface ExtendedMenuItem extends MenuItem { export class AppComponent implements AfterViewInit { pinned = false - maximizable = false + readonly maximizable = !!window.options.resizable readonly modal = window.options.modal ?? false subTitle? = '' backgroundColor = '#212121' @@ -46,10 +46,6 @@ export class AppComponent implements AfterViewInit { } async ngAfterViewInit() { - this.route.queryParams.subscribe(e => { - this.maximizable = e.resizable === 'true' - }) - if (window.options.autoResizable !== false) { this.electron.autoResizeWindow() } From e7c42a31016bd19907290984590004316102e9df Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 1 Mar 2024 22:38:42 -0300 Subject: [PATCH 08/40] [desktop]: Save window size and position only when it is closed --- desktop/app/main.ts | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index f8433291e..1c2b50f14 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -10,6 +10,8 @@ import { CloseWindow, InternalEventType, JsonFile, NotificationEvent, OpenDirect Object.assign(global, { WebSocket }) +app.commandLine.appendSwitch('disable-http-cache') + const browserWindows = new Map() const modalWindows = new Map void }>() let api: ChildProcessWithoutNullStreams | null = null @@ -22,7 +24,6 @@ const appDir = path.join(app.getPath('appData'), 'nebulosa') const appIcon = path.join(__dirname, serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) if (!fs.existsSync(appDir)) { - console.info(appDir) fs.mkdirSync(appDir) } @@ -64,9 +65,7 @@ class SimpleDB { } } -const database = new SimpleDB(path.join(appDir, 'nebulosa.electron.json')) - -app.commandLine.appendSwitch('disable-http-cache') +const database = new SimpleDB(path.join(appDir, 'nebulosa.data.json')) function isNotificationEvent(event: MessageEvent): event is NotificationEvent { return event.eventName === 'NOTIFICATION.SENT' @@ -209,20 +208,6 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { return { action: 'deny' } }) - window.on('moved', () => { - const [x, y] = window!.getPosition() - database.set(`window.${id}.position`, { x, y }) - console.info('window moved:', x, y) - }) - - if (resizable && autoResizable !== false) { - window.on('resized', () => { - const [width, height] = window!.getSize() - database.set(`window.${id}.size`, { width, height }) - console.info('window resized:', width, height) - }) - } - window.on('close', () => { const homeWindow = browserWindows.get('home') From 3824236ba52ce50cca5c7ae64e5817e59efbdd24 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 2 Mar 2024 13:36:04 -0300 Subject: [PATCH 09/40] [api]: Fix wrong values when parallax is zero for FixedStar --- .../kotlin/nebulosa/api/image/ImageService.kt | 21 +++++- .../src/main/kotlin/nebulosa/erfa/Erfa.kt | 75 ++++++------------- nebulosa-erfa/src/test/kotlin/ErfaTest.kt | 21 ++---- .../src/main/kotlin/nebulosa/math/Unsafe.kt | 4 + .../nebulosa/nova/astrometry/FixedStar.kt | 8 +- 5 files changed, 52 insertions(+), 77 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index c2affce8a..6d4c080d0 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -14,12 +14,14 @@ import nebulosa.imaging.algorithms.computation.Statistics import nebulosa.imaging.algorithms.transformation.* import nebulosa.indi.device.camera.Camera import nebulosa.io.transferAndClose +import nebulosa.log.debug import nebulosa.log.loggerFor import nebulosa.math.* import nebulosa.nova.astrometry.VSOP87E import nebulosa.nova.position.Barycentric import nebulosa.sbd.SmallBodyDatabaseService import nebulosa.skycatalog.ClassificationType +import nebulosa.skycatalog.SkyObjectType import nebulosa.star.detection.ImageStar import nebulosa.star.detection.StarDetector import nebulosa.time.TimeYMDHMS @@ -53,12 +55,12 @@ class ImageService( private val starDetector: StarDetector, ) { - val fovCameras by lazy { + val fovCameras: ByteArray by lazy { URI.create("https://github.com/tiagohm/nebulosa.data/raw/main/astrobin/cameras.json") .toURL().openConnection().getInputStream().readAllBytes() } - val fovTelescopes by lazy { + val fovTelescopes: ByteArray by lazy { URI.create("https://github.com/tiagohm/nebulosa.data/raw/main/astrobin/telescopes.json") .toURL().openConnection().getInputStream().readAllBytes() } @@ -199,9 +201,9 @@ class ImageService( } if (starsAndDSOs) { - val barycentric = VSOP87E.EARTH.at(UTC(TimeYMDHMS(dateTime))) - threadPoolTaskExecutor.submitCompletable { + val barycentric = VSOP87E.EARTH.at(UTC(TimeYMDHMS(dateTime))) + LOG.info("finding star/DSO annotations. dateTime={}, calibration={}", dateTime, calibration) val catalog = simbadEntityRepository.find(null, null, calibration.rightAscension, calibration.declination, calibration.radius) @@ -209,7 +211,18 @@ class ImageService( var count = 0 for (entry in catalog) { + if (entry.type == SkyObjectType.EXTRA_SOLAR_PLANET) continue + val astrometric = barycentric.observe(entry).equatorial() + + LOG.debug { + "%s: %s %s -> %s %s".format( + entry.name, + entry.rightAscensionJ2000.formatHMS(), entry.declinationJ2000.formatSignedDMS(), + astrometric.longitude.normalized.formatHMS(), astrometric.latitude.formatSignedDMS(), + ) + } + val (x, y) = wcs.skyToPix(astrometric.longitude.normalized, astrometric.latitude) val annotation = if (entry.type.classification == ClassificationType.STAR) ImageAnnotation(x, y, star = entry) else ImageAnnotation(x, y, dso = entry) diff --git a/nebulosa-erfa/src/main/kotlin/nebulosa/erfa/Erfa.kt b/nebulosa-erfa/src/main/kotlin/nebulosa/erfa/Erfa.kt index 4c5692312..0897411fb 100644 --- a/nebulosa-erfa/src/main/kotlin/nebulosa/erfa/Erfa.kt +++ b/nebulosa-erfa/src/main/kotlin/nebulosa/erfa/Erfa.kt @@ -489,7 +489,7 @@ fun eraApcs( /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and observed - * coordinates. The caller supplies the Earth ephemeris, the Earth + * coordinates. The caller supplies the Earth ephemeris, the Earth * rotation information and the refraction constants as well as the * site coordinates. * @@ -1712,7 +1712,7 @@ private const val OBLCOR = -0.02524 * ASEC2RAD * Although the precession adjustments are stated to be with respect * to Lieske et al. (1977), the MHB2000 model does not specify which * set of Euler angles are to be used and how the adjustments are to - * be applied. The most literal and straightforward procedure is to + * be applied. The most literal and straightforward procedure is to * adopt the 4-rotation epsilon_0, psi_A, omega_A, xi_A option, and * to add dpsipr to psi_A and depspr to both omega_A and eps_A. * @@ -2662,7 +2662,7 @@ const val DBL_EPSILON = 2.220446049250313E-16 /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and geocentric CIRS - * coordinates. The Earth ephemeris and CIP/CIO are supplied by the + * coordinates. The Earth ephemeris and CIP/CIO are supplied by the * caller. * * The parameters produced by this function are required in the @@ -2693,7 +2693,7 @@ fun eraApci( /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between ICRS and geocentric CIRS - * coordinates. The caller supplies the date, and ERFA models are used + * coordinates. The caller supplies the date, and ERFA models are used * to predict the Earth ephemeris and CIP/CIO. * * The parameters produced by this function are required in the @@ -2746,7 +2746,7 @@ fun eraAtci13( * star-independent astrometry parameters. * * Use of this function is appropriate when efficiency is important and - * where many star positions are to be transformed for one date. The + * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions [eraApci13], [eraApcg13], [eraApco13] or [eraApcs13]. * @@ -2784,7 +2784,7 @@ fun eraAtciq( * proper motion. * * Use of this function is appropriate when efficiency is important and - * where many star positions are to be transformed for one date. The + * where many star positions are to be transformed for one date. The * star-independent parameters can be obtained by calling one of the * functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. * @@ -2844,8 +2844,7 @@ fun eraLd(bm: Double, p: Vector3D, q: Vector3D, e: Vector3D, em: Distance, dlim: val qpe = DoubleArray(3) { q[it] + e[it] } val w = bm * SCHWARZSCHILD_RADIUS_OF_THE_SUN / em / max(q.dot(qpe), dlim) // p x (e x q). - val eq = e.cross(q) - val peq = p.cross(eq) + val peq = p.cross(e.cross(q)) // Apply the deflection. repeat(3) { @@ -2862,8 +2861,8 @@ fun eraLd(bm: Double, p: Vector3D, q: Vector3D, e: Vector3D, em: Distance, dlim: * @param declination ICRS Dec at catalog epoch (radians) * @param pmRA RA proper motion (radians/year, Note 1) * @param pmDEC Dec proper motion (radians/year) - * @param parallax parallax (arcsec) - * @param rv radial velocity (km/s, +ve if receding) + * @param parallax parallax (radians) + * @param rv radial velocity (au/day, +ve if receding) * @param pmt proper motion time interval (SSB, Julian years) * @param pob SSB to observer vector (au) * @@ -2890,8 +2889,7 @@ fun eraPmpx( val dt = pmt + pob.dot(p) * (LIGHT_TIME_AU / DAYSEC / DAYSPERJY) // Space motion (radians per year). - val pxr = parallax * ASEC2RAD - val w = (DAYSEC * DAYSPERJM / AU_M) * rv * pxr + val w = DAYSPERJY * rv * parallax val pdz = pmDEC * p[2] pm[0] = -pmRA * p[1] - pdz * cr + w * p[0] pm[1] = pmRA * p[0] - pdz * sr + w * p[1] @@ -2899,7 +2897,7 @@ fun eraPmpx( // Coordinate direction of star (unit vector, BCRS). repeat(3) { - p[it] += dt * pm[it] - pxr * pob[it] + p[it] += dt * pm[it] - parallax * pob[it] } return Vector3D(p).normalized @@ -3231,7 +3229,7 @@ fun eraApcs13(tdb1: Double, tdb2: Double, p: Vector3D, v: Vector3D): AstrometryP /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between CIRS and observed - * coordinates. The caller supplies the Earth orientation information + * coordinates. The caller supplies the Earth orientation information * and the refraction constants as well as the site coordinates. * * @param sp The TIO locator s (radians) @@ -3285,7 +3283,7 @@ fun eraApio( /** * For a terrestrial observer, prepare star-independent astrometry * parameters for transformations between CIRS and observed - * coordinates. The caller supplies UTC, site coordinates, ambient air + * coordinates. The caller supplies UTC, site coordinates, ambient air * conditions and observing wavelength. * * @param utc1 UTC as a 2-part... @@ -3398,7 +3396,7 @@ fun eraAtioq(rightAscension: Angle, declination: Angle, astrom: AstrometryParame } /** - * ICRS RA,Dec to observed place. The caller supplies UTC, site + * ICRS RA,Dec to observed place. The caller supplies UTC, site * coordinates, ambient air conditions and observing wavelength. * * ERFA models are used for the Earth ephemeris, bias-precession- @@ -3408,8 +3406,8 @@ fun eraAtioq(rightAscension: Angle, declination: Angle, astrom: AstrometryParame * @param declination ICRS Dec at catalog epoch (radians) * @param pmRA RA proper motion (radians/year, Note 1) * @param pmDEC Dec proper motion (radians/year) - * @param parallax parallax (arcsec) - * @param rv radial velocity (km/s, +ve if receding) + * @param parallax parallax (radians) + * @param rv radial velocity (au/day, +ve if receding) * @param utc1 UTC as a 2-part... * @param utc2 ...Julian Date * @param dut1 UT1-UTC (seconds) @@ -3596,46 +3594,12 @@ fun eraS2pv( * @param declination Declination (radians) * @param pmRA RA proper motion (radians/year) * @param pmDEC Dec proper motion (radians/year) - * @param parallax Parallax (arcseconds) - * @param rv Radial velocity (km/s, positive = receding) - * - * @return pv-vector (au, au/day). - */ -fun eraStarpv( - rightAscension: Angle, declination: Angle, - pmRA: Angle, pmDEC: Angle, parallax: Double, rv: Double, -): PositionAndVelocity { - // Distance (au). - var w = max(parallax, 1e-7) - val r = (180.0 * 3600.0 / PI) / w - - val rd = DAYSEC * rv / AU_KM - - // Proper motion (radian/day). - val rad = pmRA / DAYSPERJY - val decd = pmDEC / DAYSPERJY - - // To pv-vector (au,au/day). - val pv = eraS2pv(rightAscension, declination, r, rad, decd, rd) - - return eraStarpv(pv) -} - -/** - * Convert star catalog coordinates to position+velocity vector. - * - * Modified to accept radians and au/day instead of arcseconds and km/s. - * - * @param rightAscension Right ascension (radians) - * @param declination Declination (radians) - * @param pmRA RA proper motion (radians/year) - * @param pmDEC Dec proper motion (radians/year) * @param parallax Parallax (radians) * @param rv Radial velocity (au/day, positive = receding) * * @return pv-vector (au, au/day). */ -fun eraStarpvMod( +fun eraStarpv( rightAscension: Angle, declination: Angle, pmRA: Angle, pmDEC: Angle, parallax: Angle, rv: Velocity, ): PositionAndVelocity { @@ -3649,6 +3613,11 @@ fun eraStarpvMod( // To pv-vector (au,au/day). val pv = eraS2pv(rightAscension, declination, r, rad, decd, rv) + if (pv.velocity.length / SPEED_OF_LIGHT_AU_DAY > 0.5) { + pv.velocity.unsafe { fill(0.0) } + return pv + } + return eraStarpv(pv) } diff --git a/nebulosa-erfa/src/test/kotlin/ErfaTest.kt b/nebulosa-erfa/src/test/kotlin/ErfaTest.kt index 8ab08d14a..73b0a4558 100644 --- a/nebulosa-erfa/src/test/kotlin/ErfaTest.kt +++ b/nebulosa-erfa/src/test/kotlin/ErfaTest.kt @@ -915,14 +915,14 @@ class ErfaTest : StringSpec() { eo shouldBe (-0.003020548354802412839 plusOrMinus 1e-14) } "eraPmpx" { - val pco = eraPmpx(1.234, 0.789, 1e-5, -2e-5, 1e-2, 10.0, 8.75, Vector3D(0.9, 0.4, 0.1)) + val pco = eraPmpx(1.234, 0.789, 1e-5, -2e-5, 1e-2.arcsec, 10.0.kms, 8.75, Vector3D(0.9, 0.4, 0.1)) pco[0] shouldBe (0.2328137623960308438 plusOrMinus 1e-12) pco[1] shouldBe (0.6651097085397855328 plusOrMinus 1e-12) pco[2] shouldBe (0.7095257765896359837 plusOrMinus 1e-12) } "eraAtciq" { val (astrom) = eraApci13(2456165.5, 0.401182685) - val (ri, di) = eraAtciq(2.71, 0.174, 1e-5, 5e-6, 0.1, 55.0, astrom) + val (ri, di) = eraAtciq(2.71, 0.174, 1e-5, 5e-6, 0.1.arcsec, 55.0.kms, astrom) ri shouldBe (2.710121572968696744 plusOrMinus 1e-12) di shouldBe (0.1729371367219539137 plusOrMinus 1e-12) } @@ -933,7 +933,7 @@ class ErfaTest : StringSpec() { di shouldBe (0.1728740720984931891 plusOrMinus 1e-12) } "eraAtci13" { - val (ri, di, eo) = eraAtci13(2.71, 0.174, 1e-5, 5e-6, 0.1, 55.0, 2456165.5, 0.401182685) + val (ri, di, eo) = eraAtci13(2.71, 0.174, 1e-5, 5e-6, 0.1.arcsec, 55.0.kms, 2456165.5, 0.401182685) ri shouldBe (2.710121572968696744 plusOrMinus 1e-12) di shouldBe (0.1729371367219539137 plusOrMinus 1e-12) eo shouldBe (-0.002900618712657375647 plusOrMinus 1e-14) @@ -1069,7 +1069,7 @@ class ErfaTest : StringSpec() { } "eraAtco13" { val (b, eo) = eraAtco13( - 2.71, 0.174, 1e-5, 5e-6, 0.1, 55.0, 2456384.5, 0.969254051, + 2.71, 0.174, 1e-5, 5e-6, 0.1.arcsec, 55.0.kms, 2456384.5, 0.969254051, 0.1550675, -0.527800806, -1.2345856, 2738.0, 2.47230737e-7, 1.82640464e-6, 731.0, 12.8, 0.59, 0.55 ) @@ -1108,18 +1108,7 @@ class ErfaTest : StringSpec() { pv.velocity[2] shouldBe (0.2568431853930292259e-5 plusOrMinus 1e-16) } "eraStarpv" { - val pv = eraStarpv(0.01686756, -1.093989828, -1.78323516e-5, 2.336024047e-6, 0.74723, -21.6) - - pv.position[0] shouldBe (126668.5912743160601 plusOrMinus 1e-10) - pv.position[1] shouldBe (2136.792716839935195 plusOrMinus 1e-12) - pv.position[2] shouldBe (-245251.2339876830091 plusOrMinus 1e-10) - - pv.velocity[0] shouldBe (-0.4051854008955659551e-2 plusOrMinus 1e-13) - pv.velocity[1] shouldBe (-0.6253919754414777970e-2 plusOrMinus 1e-15) - pv.velocity[2] shouldBe (0.1189353714588109341e-1 plusOrMinus 1e-13) - } - "eraStarpvMod" { - val pv = eraStarpvMod(0.01686756, -1.093989828, -1.78323516e-5, 2.336024047e-6, 0.74723.arcsec, (-21.6).kms) + val pv = eraStarpv(0.01686756, -1.093989828, -1.78323516e-5, 2.336024047e-6, 0.74723.arcsec, (-21.6).kms) pv.position[0] shouldBe (126668.5912743160601 plusOrMinus 1e-10) pv.position[1] shouldBe (2136.792716839935195 plusOrMinus 1e-12) diff --git a/nebulosa-math/src/main/kotlin/nebulosa/math/Unsafe.kt b/nebulosa-math/src/main/kotlin/nebulosa/math/Unsafe.kt index 39cc3f3ef..ffcb216f2 100644 --- a/nebulosa-math/src/main/kotlin/nebulosa/math/Unsafe.kt +++ b/nebulosa-math/src/main/kotlin/nebulosa/math/Unsafe.kt @@ -43,6 +43,10 @@ value class UnsafeVector3D(@JvmField @PublishedApi internal val vector: Vector3D inline operator fun set(index: Int, value: Double) { vector.vector[index] = value } + + inline fun fill(value: Double) { + vector.vector.fill(value) + } } @JvmInline diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/FixedStar.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/FixedStar.kt index b4bf2378f..e644d25bc 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/FixedStar.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/FixedStar.kt @@ -2,7 +2,6 @@ package nebulosa.nova.astrometry import nebulosa.constants.* import nebulosa.erfa.PositionAndVelocity -import nebulosa.erfa.eraStarpvMod import nebulosa.math.Angle import nebulosa.math.Vector3D import nebulosa.math.Velocity @@ -35,9 +34,10 @@ data class FixedStar( val epoch: InstantOfTime = UTC.J2000, ) : Body { - // val positionAndVelocity by lazy { computePositionAndVelocity(ra, dec, pmRA, pmDEC, parallax, radialVelocity) } - // eraStarpvMod computes wrong values for Polaris ??? - val positionAndVelocity by lazy { eraStarpvMod(ra, dec, pmRA, pmDEC, parallax, radialVelocity) } + val positionAndVelocity by lazy { computePositionAndVelocity(ra, dec, pmRA, pmDEC, parallax, radialVelocity) } + + // eraStarpv: wrong values when parallax is zero? + // val positionAndVelocity by lazy { eraStarpv(ra, dec, pmRA, pmDEC, parallax, radialVelocity) } override val center = 0 From 4c7cb477cf7d963db83b58e215deec2691e89a19 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 2 Mar 2024 19:57:10 -0300 Subject: [PATCH 10/40] [api]: Use selected location when annotate image with minor planets --- .../kotlin/nebulosa/api/image/ImageService.kt | 19 +++++++++++-------- .../api/locations/LocationController.kt | 2 +- .../nebulosa/api/locations/LocationService.kt | 5 ++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index 6d4c080d0..04e79fe42 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -6,6 +6,7 @@ import nebulosa.api.atlas.SimbadEntityRepository import nebulosa.api.calibration.CalibrationFrameService import nebulosa.api.connection.ConnectionService import nebulosa.api.framing.FramingService +import nebulosa.api.locations.LocationService import nebulosa.fits.* import nebulosa.imaging.Image import nebulosa.imaging.ImageChannel @@ -53,6 +54,7 @@ class ImageService( private val threadPoolTaskExecutor: ThreadPoolTaskExecutor, private val connectionService: ConnectionService, private val starDetector: StarDetector, + private val locationService: LocationService, ) { val fovCameras: ByteArray by lazy { @@ -157,22 +159,23 @@ class ImageService( return emptyList() } - val annotations = Vector() - val tasks = ArrayList>() + val annotations = Vector(64) + val tasks = ArrayList>(2) val dateTime = image.header.observationDate ?: LocalDateTime.now() if (minorPlanets) { threadPoolTaskExecutor.submitCompletable { - val latitude = image.header.latitude ?: 0.0 - val longitude = image.header.longitude ?: 0.0 + val location = locationService.selected + val latitude = image.header.latitude ?: location?.latitude ?: 0.0 + val longitude = image.header.longitude ?: location?.longitude ?: 0.0 LOG.info( "finding minor planet annotations. dateTime={}, latitude={}, longitude={}, calibration={}", - dateTime, latitude, longitude, calibration + dateTime, latitude.formatSignedDMS(), longitude.formatSignedDMS(), calibration ) - val data = smallBodyDatabaseService.identify( + val identifiedBody = smallBodyDatabaseService.identify( dateTime, latitude, longitude, 0.0, calibration.rightAscension, calibration.declination, calibration.radius, minorPlanetMagLimit, @@ -181,7 +184,7 @@ class ImageService( val radiusInSeconds = calibration.radius.toArcsec var count = 0 - data.data.forEach { + identifiedBody.data.forEach { val distance = it[5].toDouble() if (distance <= radiusInSeconds) { @@ -235,7 +238,7 @@ class ImageService( .also(tasks::add) } - CompletableFuture.allOf(*tasks.toTypedArray()).join() + tasks.forEach { it.get() } wcs.close() diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt index d1112aab9..6469966ce 100644 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt +++ b/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt @@ -21,7 +21,7 @@ class LocationController( @GetMapping("selected") fun selected(): LocationEntity? { - return locationService.selected() + return locationService.selected } @PutMapping diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt index 7c06b4933..1ea2a9f15 100644 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt +++ b/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt @@ -15,9 +15,8 @@ class LocationService( return locationRepository.find(id)!! } - fun selected(): LocationEntity? { - return locationRepository.findFirstBySelectedTrueOrderById() - } + val selected + get() = locationRepository.findFirstBySelectedTrueOrderById() @Synchronized fun save(location: LocationEntity): LocationEntity { From 62b0194f2e33d793b13f2c915153197ef473089b Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 4 Mar 2024 11:50:15 -0300 Subject: [PATCH 11/40] [desktop]: Allow read and delete Local Storage items on Settingss --- desktop/app/main.ts | 2 +- .../src/app/settings/settings.component.html | 115 +++++++++++------- .../src/app/settings/settings.component.ts | 50 ++++++-- .../shared/services/browser-window.service.ts | 2 +- desktop/src/shared/types/settings.types.ts | 4 + desktop/src/shared/utils/comparators.ts | 9 ++ 6 files changed, 123 insertions(+), 59 deletions(-) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index 1c2b50f14..78d99f933 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -476,7 +476,7 @@ try { ipcMain.handle('WINDOW.RESIZE', (event, data: number) => { const window = findWindowById(event.sender.id)?.window - if (!window || (!serve && window.isResizable())) return false + if (!window || window.isResizable()) return false const size = window.getSize() const maxHeight = screen.getPrimaryDisplay().workAreaSize.height diff --git a/desktop/src/app/settings/settings.component.html b/desktop/src/app/settings/settings.component.html index 507732abe..347a84a90 100644 --- a/desktop/src/app/settings/settings.component.html +++ b/desktop/src/app/settings/settings.component.html @@ -1,6 +1,6 @@
-
@@ -28,58 +28,85 @@
-
- - - - -
-
- - - - - - - -
-
+
-
- - - - -
-
+
- - + +
-
- - - +
+ + + + + +
-
- - - - +
+
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+
+
+ + +
+ {{ item.key }} + {{ item.value }} +
+
+
+
+
+
+ {{ databaseEntry.key }} + +
+ + {{ databaseEntry.value }} + +
+
\ No newline at end of file diff --git a/desktop/src/app/settings/settings.component.ts b/desktop/src/app/settings/settings.component.ts index 39a13d451..b29c9e52e 100644 --- a/desktop/src/app/settings/settings.component.ts +++ b/desktop/src/app/settings/settings.component.ts @@ -7,7 +7,8 @@ import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' import { EMPTY_LOCATION, Location } from '../../shared/types/atlas.types' -import { DEFAULT_SOLVER_TYPES, PlateSolverOptions, PlateSolverType } from '../../shared/types/settings.types' +import { DEFAULT_SOLVER_TYPES, DatabaseEntry, PlateSolverOptions, PlateSolverType } from '../../shared/types/settings.types' +import { compareBy, textComparator } from '../../shared/utils/comparators' import { AppComponent } from '../app.component' @Component({ @@ -17,14 +18,15 @@ import { AppComponent } from '../app.component' }) export class SettingsComponent implements AfterViewInit, OnDestroy { - activeTab = 0 - locations: Location[] = [] location = structuredClone(EMPTY_LOCATION) - readonly plateSolverTypes = Array.from(DEFAULT_SOLVER_TYPES) - plateSolverType = this.plateSolverTypes[0] - readonly plateSolvers = new Map() + readonly solverTypes = Array.from(DEFAULT_SOLVER_TYPES) + solverType = this.solverTypes[0] + readonly solvers = new Map() + + readonly database: DatabaseEntry[] = [] + databaseEntry?: DatabaseEntry readonly items: MenuItem[] = [ { @@ -35,6 +37,10 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { icon: 'mdi mdi-sigma', label: 'Plate Solver', }, + { + icon: 'mdi mdi-database', + label: 'Local Storage', + }, ] item = this.items[0] @@ -48,9 +54,17 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { ) { app.title = 'Settings' - for (const type of this.plateSolverTypes) { - this.plateSolvers.set(type, preference.plateSolverOptions(type).get()) + for (const type of this.solverTypes) { + this.solvers.set(type, preference.plateSolverOptions(type).get()) + } + + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i)! + const value = localStorage.getItem(key) + this.database.push({ key, value }) } + + this.database.sort(compareBy('key', textComparator)) } async ngAfterViewInit() { @@ -80,7 +94,7 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { private async loadLocations() { this.locations = await this.api.locations() - this.location = this.locations.find(e => e.selected) ?? this.locations[0] ?? EMPTY_LOCATION + this.location = this.locations.find(e => e.selected) ?? this.locations[0] ?? structuredClone(EMPTY_LOCATION) if (this.location.id && !this.location.selected) { this.location.selected = true @@ -102,7 +116,7 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { } async chooseExecutablePath() { - const options = this.plateSolvers.get(this.plateSolverType)! + const options = this.solvers.get(this.solverType)! const executablePath = await this.electron.openFile({ defaultPath: path.dirname(options.executablePath) }) if (executablePath) { @@ -111,9 +125,19 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { } } - async save() { - for (const type of this.plateSolverTypes) { - this.preference.plateSolverOptions(type).set(this.plateSolvers.get(type)!) + deleteDatabaseEntry() { + if (this.databaseEntry) { + localStorage.removeItem(this.databaseEntry.key) + + const index = this.database.indexOf(this.databaseEntry) + this.database.splice(index, 1) + this.databaseEntry = undefined + } + } + + save() { + for (const type of this.solverTypes) { + this.preference.plateSolverOptions(type).set(this.solvers.get(type)!) } } } \ No newline at end of file diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index dc231be4b..a4d2490bc 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -105,7 +105,7 @@ export class BrowserWindowService { openSettings(options: OpenWindowOptions = {}) { Object.assign(options, { icon: 'settings', width: 580, height: 451 }) - this.openWindow({ ...options, id: 'settings', path: 'settings', data: undefined }) + this.openWindow({ ...options, id: 'settings', path: 'settings', data: undefined, resizable: true }) } openCalculator(options: OpenWindowOptions = {}) { diff --git a/desktop/src/shared/types/settings.types.ts b/desktop/src/shared/types/settings.types.ts index df1391d7b..5abda4196 100644 --- a/desktop/src/shared/types/settings.types.ts +++ b/desktop/src/shared/types/settings.types.ts @@ -1,3 +1,5 @@ +import { KeyValue } from '@angular/common' + export type PlateSolverType = 'ASTROMETRY_NET' | 'ASTROMETRY_NET_ONLINE' | 'ASTAP' export const DEFAULT_SOLVER_TYPES: PlateSolverType[] = ['ASTROMETRY_NET_ONLINE', 'ASTAP'] @@ -19,3 +21,5 @@ export const EMPTY_PLATE_SOLVER_OPTIONS: PlateSolverOptions = { apiKey: '', timeout: 600, } + +export type DatabaseEntry = KeyValue diff --git a/desktop/src/shared/utils/comparators.ts b/desktop/src/shared/utils/comparators.ts index 7c29fc757..edf740cc9 100644 --- a/desktop/src/shared/utils/comparators.ts +++ b/desktop/src/shared/utils/comparators.ts @@ -3,4 +3,13 @@ import { Device } from '../types/device.types' export type Comparator = (a: T, b: T) => number export const textComparator: Comparator = (a: string, b: string) => a.localeCompare(b) +export const numberComparator: Comparator = (a: number, b: number) => a - b export const deviceComparator: Comparator = (a: Device, b: Device) => textComparator(a.name, b.name) + +export function negateComparator(comparator: Comparator): Comparator { + return (a, b) => -comparator(a, b) +} + +export function compareBy(name: keyof T, comparator: (a: T[typeof name], b: T[typeof name]) => number): Comparator { + return (a, b) => comparator(a[name], b[name]) +} From 1b095efe13bb72bc9269a60b6871de9cbfa5bcfe Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 4 Mar 2024 23:39:28 -0300 Subject: [PATCH 12/40] [api][desktop]: Save location on localStorage instead of ObjectBox --- api/schemas/objectbox.json | 152 ++++++------------ .../polar/PolarAlignmentController.kt | 2 +- .../kotlin/nebulosa/api/atlas/Location.kt | 18 +++ .../nebulosa/api/atlas/SkyAtlasController.kt | 26 +-- .../nebulosa/api/atlas/SkyAtlasService.kt | 31 ++-- .../beans/configurations/BeanConfiguration.kt | 6 +- .../{indi => device}/DeviceDeserializer.kt | 2 +- .../{indi => device}/DeviceOrEntityParam.kt | 2 +- ...viceOrEntityParamMethodArgumentResolver.kt | 6 +- .../converters/location/LocationParam.kt | 5 + .../LocationParamMethodArgumentResolver.kt | 37 +++++ .../calibration/CalibrationFrameController.kt | 2 +- .../nebulosa/api/cameras/CameraController.kt | 2 +- .../api/cameras/CameraDeserializer.kt | 2 +- .../api/focusers/FocuserController.kt | 2 +- .../api/focusers/FocuserDeserializer.kt | 2 +- .../api/guiding/GuideOutputController.kt | 2 +- .../api/guiding/GuideOutputDeserializer.kt | 2 +- .../nebulosa/api/image/ImageController.kt | 7 +- .../kotlin/nebulosa/api/image/ImageService.kt | 5 +- .../nebulosa/api/indi/INDIController.kt | 2 +- .../api/locations/LocationController.kt | 36 ----- .../nebulosa/api/locations/LocationEntity.kt | 27 ---- .../api/locations/LocationRepository.kt | 30 ---- .../api/locations/LocationSeedTask.kt | 17 -- .../nebulosa/api/locations/LocationService.kt | 42 ----- .../nebulosa/api/mounts/MountController.kt | 2 +- .../nebulosa/api/mounts/MountDeserializer.kt | 2 +- .../api/sequencer/SequencerController.kt | 2 +- .../nebulosa/api/wheels/WheelController.kt | 2 +- .../nebulosa/api/wheels/WheelDeserializer.kt | 2 +- .../api/wizard/flat/FlatWizardController.kt | 2 +- desktop/src/app/app.module.ts | 8 +- desktop/src/app/atlas/atlas.component.ts | 26 +-- desktop/src/app/home/home.component.ts | 18 ++- .../src/app/settings/settings.component.html | 8 +- .../src/app/settings/settings.component.ts | 62 ++++--- .../interceptors/location.interceptor.ts | 20 +++ desktop/src/shared/services/api.service.ts | 22 --- .../src/shared/services/preference.service.ts | 15 +- desktop/src/shared/types/atlas.types.ts | 4 +- 41 files changed, 272 insertions(+), 390 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/atlas/Location.kt rename api/src/main/kotlin/nebulosa/api/beans/converters/{indi => device}/DeviceDeserializer.kt (94%) rename api/src/main/kotlin/nebulosa/api/beans/converters/{indi => device}/DeviceOrEntityParam.kt (72%) rename api/src/main/kotlin/nebulosa/api/beans/converters/{indi => device}/DeviceOrEntityParamMethodArgumentResolver.kt (91%) create mode 100644 api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParam.kt create mode 100644 api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParamMethodArgumentResolver.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/locations/LocationController.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/locations/LocationEntity.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/locations/LocationRepository.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/locations/LocationSeedTask.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/locations/LocationService.kt create mode 100644 desktop/src/shared/interceptors/location.interceptor.ts diff --git a/api/schemas/objectbox.json b/api/schemas/objectbox.json index 6697bd99f..a3669305b 100644 --- a/api/schemas/objectbox.json +++ b/api/schemas/objectbox.json @@ -4,125 +4,81 @@ "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", "entities": [ { - "id": "1:2141918888386721824", - "lastPropertyId": "7:637271438293072650", - "name": "LocationEntity", - "properties": [ - { - "id": "1:3442525931231983774", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:759171631592640168", - "name": "name", - "type": 9 - }, - { - "id": "3:8579542454327527012", - "name": "latitude", - "type": 8 - }, - { - "id": "4:2278417754998832727", - "name": "longitude", - "type": 8 - }, - { - "id": "5:6340857252773714708", - "name": "elevation", - "type": 8 - }, - { - "id": "6:8178041138715870006", - "name": "offsetInMinutes", - "type": 5 - }, - { - "id": "7:637271438293072650", - "name": "selected", - "type": 1 - } - ], - "relations": [] - }, - { - "id": "2:2045817682728620153", - "lastPropertyId": "13:7087599727202298624", + "id": "1:8996632906249699640", + "lastPropertyId": "13:4967132491159177650", "name": "CalibrationFrameEntity", "properties": [ { - "id": "1:278364626282462565", + "id": "1:8753104016604228424", "name": "id", "type": 6, "flags": 1 }, { - "id": "2:2256350506731837179", + "id": "2:5256997905701910721", "name": "type", - "indexId": "4:817263978142134714", + "indexId": "1:6629699679938480062", "type": 5, "flags": 8 }, { - "id": "3:3456302856844566424", + "id": "3:4250539975904011338", "name": "camera", - "indexId": "1:3662625594835691874", + "indexId": "2:8670761666150034104", "type": 9, "flags": 2048 }, { - "id": "4:5972230499024785383", + "id": "4:2964126873299902795", "name": "filter", - "indexId": "2:1025779831315419041", + "indexId": "3:356806529647771872", "type": 9, "flags": 2048 }, { - "id": "5:6361954738111255053", + "id": "5:6592821044234392872", "name": "exposureTime", "type": 6 }, { - "id": "6:8528955891035480680", + "id": "6:7841731947961734124", "name": "temperature", "type": 8 }, { - "id": "7:2574616483728323822", + "id": "7:8769358817044866175", "name": "width", "type": 5 }, { - "id": "8:8865939992938062812", + "id": "8:9066846022258802237", "name": "height", "type": 5 }, { - "id": "9:975912299719394995", + "id": "9:6089591003549470592", "name": "binX", "type": 5 }, { - "id": "10:1271977543915641201", + "id": "10:1137944585964286888", "name": "binY", "type": 5 }, { - "id": "11:5411887422831392953", + "id": "11:75379120605439289", "name": "gain", "type": 8 }, { - "id": "12:5768939074601408853", + "id": "12:5234537218429949481", "name": "path", - "indexId": "3:3193767946870807856", + "indexId": "4:1409612170773192505", "type": 9, "flags": 2080 }, { - "id": "13:7087599727202298624", + "id": "13:4967132491159177650", "name": "enabled", "type": 1 } @@ -130,25 +86,25 @@ "relations": [] }, { - "id": "3:6517804651010773363", - "lastPropertyId": "3:7280575610200271256", + "id": "2:2865903592621070186", + "lastPropertyId": "3:4231519923961266979", "name": "PreferenceEntity", "properties": [ { - "id": "1:7536416243834995627", + "id": "1:6437649959717305879", "name": "id", "type": 6, "flags": 1 }, { - "id": "2:1965090070669971323", + "id": "2:3424721012607374437", "name": "key", - "indexId": "5:4282004812167689322", + "indexId": "5:3959175721933196667", "type": 9, "flags": 34848 }, { - "id": "3:7280575610200271256", + "id": "3:4231519923961266979", "name": "value", "type": 9 } @@ -156,28 +112,28 @@ "relations": [] }, { - "id": "4:3737128326466279707", - "lastPropertyId": "4:2231211530557374123", + "id": "3:7591326030822090985", + "lastPropertyId": "4:960749109935496711", "name": "SatelliteEntity", "properties": [ { - "id": "1:6295515048769926146", + "id": "1:8984524405419355357", "name": "id", "type": 6, "flags": 129 }, { - "id": "2:2455064913731043963", + "id": "2:954886680255875455", "name": "name", "type": 9 }, { - "id": "3:4151339193253592643", + "id": "3:2209800562197387575", "name": "tle", "type": 9 }, { - "id": "4:2231211530557374123", + "id": "4:960749109935496711", "name": "groups", "type": 30 } @@ -185,68 +141,68 @@ "relations": [] }, { - "id": "6:3705054558003767840", - "lastPropertyId": "12:762260734150852642", + "id": "4:1799461706223884117", + "lastPropertyId": "12:1425111719526355640", "name": "SimbadEntity", "properties": [ { - "id": "1:2815331295543596023", + "id": "1:8675363815775912010", "name": "id", "type": 6, "flags": 129 }, { - "id": "2:1094957247301775448", + "id": "2:9134078346895015096", "name": "name", "type": 9 }, { - "id": "3:2894803910674914590", + "id": "3:5687549887167089900", "name": "type", "type": 5 }, { - "id": "4:2941887692366753803", + "id": "4:425502224150658936", "name": "rightAscensionJ2000", "type": 8 }, { - "id": "5:9102733480395399072", + "id": "5:2116112963954541453", "name": "declinationJ2000", "type": 8 }, { - "id": "6:5928907297748334710", + "id": "6:3944877011180871841", "name": "magnitude", "type": 8 }, { - "id": "7:6938045857158270084", + "id": "7:7502412627527780934", "name": "pmRA", "type": 8 }, { - "id": "8:3191952939943328844", + "id": "8:2354824452575366292", "name": "pmDEC", "type": 8 }, { - "id": "9:116139679953849730", + "id": "9:266214111788703179", "name": "parallax", "type": 8 }, { - "id": "10:8499347473053691215", + "id": "10:3283290633306994233", "name": "radialVelocity", "type": 8 }, { - "id": "11:5618236643604972886", + "id": "11:2537767302764251008", "name": "redshift", "type": 8 }, { - "id": "12:762260734150852642", + "id": "12:1425111719526355640", "name": "constellation", "type": 5 } @@ -254,23 +210,15 @@ "relations": [] } ], - "lastEntityId": "6:3705054558003767840", - "lastIndexId": "6:9080720220858934797", + "lastEntityId": "4:1799461706223884117", + "lastIndexId": "5:3959175721933196667", "lastRelationId": "0:0", "lastSequenceId": "0:0", "modelVersion": 5, "modelVersionParserMinimum": 5, - "retiredEntityUids": [ - 6518840186314177945 - ], - "retiredIndexUids": [ - 9080720220858934797 - ], - "retiredPropertyUids": [ - 5740207060374171983, - 4684765207346563658, - 7171122916482173681 - ], + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], "retiredRelationUids": [], "version": 1 } \ No newline at end of file diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/PolarAlignmentController.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/PolarAlignmentController.kt index a9ac9310e..487ee934b 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/PolarAlignmentController.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/PolarAlignmentController.kt @@ -2,7 +2,7 @@ package nebulosa.api.alignment.polar import nebulosa.api.alignment.polar.darv.DARVStartRequest import nebulosa.api.alignment.polar.tppa.TPPAStartRequest -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.guide.GuideOutput import nebulosa.indi.device.mount.Mount diff --git a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt new file mode 100644 index 000000000..ba9cefe29 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt @@ -0,0 +1,18 @@ +package nebulosa.api.atlas + +import nebulosa.math.deg +import nebulosa.math.m +import nebulosa.nova.position.GeographicPosition +import nebulosa.nova.position.Geoid + +data class Location( + val latitude: Double = 0.0, // deg. + val longitude: Double = 0.0, // deg. + val elevation: Double = 0.0, // m. + val offsetInMinutes: Int = 0, +) { + + fun geographicPosition(): GeographicPosition { + return Geoid.IERS2010.lonLat(longitude.deg, latitude.deg, elevation.m) + } +} diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt index 8f06f8846..a0ee377b6 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt @@ -4,9 +4,9 @@ import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import jakarta.validation.constraints.Min import jakarta.validation.constraints.NotBlank -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam +import nebulosa.api.beans.converters.location.LocationParam import nebulosa.api.beans.converters.time.DateAndTimeParam -import nebulosa.api.locations.LocationEntity import nebulosa.math.deg import nebulosa.math.hours import nebulosa.nova.astrometry.Constellation @@ -28,26 +28,26 @@ class SkyAtlasController( @GetMapping("sun/position") fun positionOfSun( - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, ) = skyAtlasService.positionOfSun(location, dateTime) @GetMapping("sun/altitude-points") fun altitudePointsOfSun( - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, ) = skyAtlasService.altitudePointsOfSun(location, dateTime, stepSize) @GetMapping("moon/position") fun positionOfMoon( - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, ) = skyAtlasService.positionOfMoon(location, dateTime) @GetMapping("moon/altitude-points") fun altitudePointsOfMoon( - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") stepSize: Int, ) = skyAtlasService.altitudePointsOfMoon(location, dateTime, stepSize) @@ -55,14 +55,14 @@ class SkyAtlasController( @GetMapping("planets/{code}/position") fun positionOfPlanet( @PathVariable code: String, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, ) = skyAtlasService.positionOfPlanet(location, code, dateTime) @GetMapping("planets/{code}/altitude-points") fun altitudePointsOfPlanet( @PathVariable code: String, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") stepSize: Int, ) = skyAtlasService.altitudePointsOfPlanet(location, code, dateTime, stepSize) @@ -73,14 +73,14 @@ class SkyAtlasController( @GetMapping("sky-objects/{id}/position") fun positionOfSkyObject( @PathVariable id: Long, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, ) = skyAtlasService.positionOfSkyObject(location, id, dateTime) @GetMapping("sky-objects/{id}/altitude-points") fun altitudePointsOfSkyObject( @PathVariable id: Long, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") stepSize: Int, ) = skyAtlasService.altitudePointsOfSkyObject(location, id, dateTime, stepSize) @@ -106,14 +106,14 @@ class SkyAtlasController( @GetMapping("satellites/{satellite}/position") fun positionOfSatellite( @DeviceOrEntityParam satellite: SatelliteEntity, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, ) = skyAtlasService.positionOfSatellite(location, satellite, dateTime) @GetMapping("satellites/{satellite}/altitude-points") fun altitudePointsOfSatellite( @DeviceOrEntityParam satellite: SatelliteEntity, - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") stepSize: Int, ) = skyAtlasService.altitudePointsOfSatellite(location, satellite, dateTime, stepSize) @@ -126,7 +126,7 @@ class SkyAtlasController( @GetMapping("twilight") fun twilight( - @DeviceOrEntityParam location: LocationEntity, + @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, ) = skyAtlasService.twilight(location, dateTime) } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index 944eb8345..3b80d4895 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -3,7 +3,6 @@ package nebulosa.api.atlas import jakarta.servlet.http.HttpServletResponse import nebulosa.api.atlas.ephemeris.BodyEphemerisProvider import nebulosa.api.atlas.ephemeris.HorizonsEphemerisProvider -import nebulosa.api.locations.LocationEntity import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity import nebulosa.log.loggerFor @@ -45,7 +44,7 @@ class SkyAtlasService( private val httpClient: OkHttpClient, ) { - private val positions = HashMap() + private val positions = HashMap() private val cachedSimbadEntities = HashMap() @Volatile private var sunImage = ByteArray(0) @@ -56,19 +55,19 @@ class SkyAtlasService( output.outputStream.write(sunImage) } - fun positionOfSun(location: LocationEntity, dateTime: LocalDateTime): BodyPosition { + fun positionOfSun(location: Location, dateTime: LocalDateTime): BodyPosition { return positionOfBody(SUN, location, dateTime)!! } - fun positionOfMoon(location: LocationEntity, dateTime: LocalDateTime): BodyPosition { + fun positionOfMoon(location: Location, dateTime: LocalDateTime): BodyPosition { return positionOfBody(MOON, location, dateTime)!! } - fun positionOfPlanet(location: LocationEntity, code: String, dateTime: LocalDateTime): BodyPosition { + fun positionOfPlanet(location: Location, code: String, dateTime: LocalDateTime): BodyPosition { return positionOfBody(code, location, dateTime)!! } - fun positionOfSkyObject(location: LocationEntity, id: Long, dateTime: LocalDateTime): BodyPosition { + fun positionOfSkyObject(location: Location, id: Long, dateTime: LocalDateTime): BodyPosition { val target = cachedSimbadEntities[id] ?: simbadEntityRepository.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cannot found sky object: [$id]") cachedSimbadEntities[id] = target @@ -77,18 +76,18 @@ class SkyAtlasService( .copy(magnitude = target.magnitude, constellation = target.constellation, distance = distance.toLightYears, distanceUnit = "ly") } - fun positionOfSatellite(location: LocationEntity, satellite: SatelliteEntity, dateTime: LocalDateTime): BodyPosition { + fun positionOfSatellite(location: Location, satellite: SatelliteEntity, dateTime: LocalDateTime): BodyPosition { return positionOfBody("TLE@${satellite.tle}", location, dateTime)!! } - private fun positionOfBody(target: Any, location: LocationEntity, dateTime: LocalDateTime): BodyPosition? { + private fun positionOfBody(target: Any, location: Location, dateTime: LocalDateTime): BodyPosition? { val position = positions.getOrPut(location, location::geographicPosition) return bodyEphemeris(target, location, dateTime) .withLocationAndDateTime(location, dateTime) ?.let { BodyPosition.of(it, position) } } - private fun bodyEphemeris(target: Any, location: LocationEntity, dateTime: LocalDateTime): List { + private fun bodyEphemeris(target: Any, location: Location, dateTime: LocalDateTime): List { val position = positions.getOrPut(location, location::geographicPosition) val offsetInSeconds = location.offsetInMinutes * 60 val zoneId = ZoneOffset.ofTotalSeconds(offsetInSeconds) @@ -100,7 +99,7 @@ class SkyAtlasService( return satelliteRepository.search(text.ifBlank { null }, groups) } - fun twilight(location: LocationEntity, date: LocalDate): Twilight { + fun twilight(location: Location, date: LocalDate): Twilight { val civilDusk = doubleArrayOf(0.0, 0.0) val nauticalDusk = doubleArrayOf(0.0, 0.0) val astronomicalDusk = doubleArrayOf(0.0, 0.0) @@ -133,22 +132,22 @@ class SkyAtlasService( ) } - fun altitudePointsOfSun(location: LocationEntity, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSun(location: Location, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(SUN, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfMoon(location: LocationEntity, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfMoon(location: Location, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(MOON, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfPlanet(location: LocationEntity, code: String, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfPlanet(location: Location, code: String, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(code, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfSkyObject(location: LocationEntity, id: Long, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSkyObject(location: Location, id: Long, date: LocalDate, stepSize: Int): List { val target = cachedSimbadEntities[id] ?: simbadEntityRepository.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cannot found sky object: [$id]") cachedSimbadEntities[id] = target @@ -156,7 +155,7 @@ class SkyAtlasService( return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfSatellite(location: LocationEntity, satellite: SatelliteEntity, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSatellite(location: Location, satellite: SatelliteEntity, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris("TLE@${satellite.tle}", location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } @@ -220,7 +219,7 @@ class SkyAtlasService( } @JvmStatic - private fun List.withLocationAndDateTime(location: LocationEntity, dateTime: LocalDateTime): HorizonsElement? { + private fun List.withLocationAndDateTime(location: Location, dateTime: LocalDateTime): HorizonsElement? { return let { HorizonsElement.of(it, dateTime.minusMinutes(location.offsetInMinutes.toLong())) } } diff --git a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt index 8ce437070..f04275e1d 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt @@ -10,7 +10,6 @@ import nebulosa.api.atlas.SatelliteEntity import nebulosa.api.atlas.SimbadEntity import nebulosa.api.calibration.CalibrationFrameEntity import nebulosa.api.database.MyObjectBox -import nebulosa.api.locations.LocationEntity import nebulosa.api.preferences.PreferenceEntity import nebulosa.batch.processing.AsyncJobLauncher import nebulosa.common.json.PathDeserializer @@ -172,9 +171,6 @@ class BeanConfiguration { .name("simbad") .build()!! - @Bean - fun locationBox(boxStore: BoxStore) = boxStore.boxFor(LocationEntity::class.java)!! - @Bean fun calibrationFrameBox(boxStore: BoxStore) = boxStore.boxFor(CalibrationFrameEntity::class.java)!! @@ -193,6 +189,7 @@ class BeanConfiguration { dateAndTimeParamMethodArgumentResolver: HandlerMethodArgumentResolver, angleParamMethodArgumentResolver: HandlerMethodArgumentResolver, durationUnitMethodArgumentResolver: HandlerMethodArgumentResolver, + locationParamMethodArgumentResolver: HandlerMethodArgumentResolver, ) = object : WebMvcConfigurer { override fun extendMessageConverters(converters: MutableList>) { @@ -213,6 +210,7 @@ class BeanConfiguration { resolvers.add(dateAndTimeParamMethodArgumentResolver) resolvers.add(angleParamMethodArgumentResolver) resolvers.add(durationUnitMethodArgumentResolver) + resolvers.add(locationParamMethodArgumentResolver) } } diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceDeserializer.kt similarity index 94% rename from api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceDeserializer.kt rename to api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceDeserializer.kt index 11a3bf16a..e6383e7ec 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceDeserializer.kt @@ -1,4 +1,4 @@ -package nebulosa.api.beans.converters.indi +package nebulosa.api.beans.converters.device import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.DeserializationContext diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParam.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParam.kt similarity index 72% rename from api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParam.kt rename to api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParam.kt index 93cfaede3..620851126 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParam.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParam.kt @@ -1,4 +1,4 @@ -package nebulosa.api.beans.converters.indi +package nebulosa.api.beans.converters.device @Retention @Target(AnnotationTarget.VALUE_PARAMETER) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParamMethodArgumentResolver.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParamMethodArgumentResolver.kt similarity index 91% rename from api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParamMethodArgumentResolver.kt rename to api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParamMethodArgumentResolver.kt index ededcf082..85c6c2eff 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/indi/DeviceOrEntityParamMethodArgumentResolver.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/device/DeviceOrEntityParamMethodArgumentResolver.kt @@ -1,12 +1,10 @@ -package nebulosa.api.beans.converters.indi +package nebulosa.api.beans.converters.device import nebulosa.api.atlas.SatelliteEntity import nebulosa.api.atlas.SatelliteRepository import nebulosa.api.beans.converters.annotation import nebulosa.api.beans.converters.parameter import nebulosa.api.connection.ConnectionService -import nebulosa.api.locations.LocationEntity -import nebulosa.api.locations.LocationRepository import nebulosa.indi.device.Device import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.filterwheel.FilterWheel @@ -25,13 +23,11 @@ import org.springframework.web.server.ResponseStatusException @Component class DeviceOrEntityParamMethodArgumentResolver( - private val locationRepository: LocationRepository, private val satelliteRepository: SatelliteRepository, private val connectionService: ConnectionService, ) : HandlerMethodArgumentResolver { private val entityResolvers = mapOf, (String) -> Any?>( - LocationEntity::class.java to { locationRepository.find(it.toLong()) }, SatelliteEntity::class.java to { satelliteRepository.find(it.toLong()) }, Device::class.java to { connectionService.device(it) }, Camera::class.java to { connectionService.camera(it) }, diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParam.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParam.kt new file mode 100644 index 000000000..e2c1a1bf5 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParam.kt @@ -0,0 +1,5 @@ +package nebulosa.api.beans.converters.location + +@Retention +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class LocationParam diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParamMethodArgumentResolver.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParamMethodArgumentResolver.kt new file mode 100644 index 000000000..0605fca66 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/location/LocationParamMethodArgumentResolver.kt @@ -0,0 +1,37 @@ +package nebulosa.api.beans.converters.location + +import com.fasterxml.jackson.databind.ObjectMapper +import nebulosa.api.atlas.Location +import nebulosa.api.beans.converters.hasAnnotation +import org.springframework.core.MethodParameter +import org.springframework.stereotype.Component +import org.springframework.web.bind.support.WebDataBinderFactory +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.method.support.HandlerMethodArgumentResolver +import org.springframework.web.method.support.ModelAndViewContainer + +@Component +class LocationParamMethodArgumentResolver( + private val objectMapper: ObjectMapper +) : HandlerMethodArgumentResolver { + + override fun supportsParameter(parameter: MethodParameter): Boolean { + return parameter.hasAnnotation() + } + + override fun resolveArgument( + parameter: MethodParameter, + mavContainer: ModelAndViewContainer?, + webRequest: NativeWebRequest, + binderFactory: WebDataBinderFactory?, + ): Location? { + // val param = parameter.annotation()!! + val headerValue = webRequest.getHeader("X-Location")?.ifBlank { null } ?: return null + return CACHED_LOCATIONS.getOrPut(headerValue) { objectMapper.readValue(headerValue, Location::class.java) } + } + + companion object { + + @JvmStatic private val CACHED_LOCATIONS = HashMap(8) + } +} diff --git a/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameController.kt b/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameController.kt index 13f25f69b..c52f57053 100644 --- a/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameController.kt +++ b/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameController.kt @@ -1,6 +1,6 @@ package nebulosa.api.calibration -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.indi.device.camera.Camera import org.springframework.web.bind.annotation.* import java.nio.file.Path diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt index b62e6ee42..76b0d6dc5 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt @@ -1,7 +1,7 @@ package nebulosa.api.cameras import jakarta.validation.Valid -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.camera.Camera import org.hibernate.validator.constraints.Range diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraDeserializer.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraDeserializer.kt index bbac37188..263d80c84 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraDeserializer.kt @@ -1,6 +1,6 @@ package nebulosa.api.cameras -import nebulosa.api.beans.converters.indi.DeviceDeserializer +import nebulosa.api.beans.converters.device.DeviceDeserializer import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.camera.Camera import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt b/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt index fab973b38..c412debe7 100644 --- a/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt +++ b/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt @@ -2,7 +2,7 @@ package nebulosa.api.focusers import jakarta.validation.Valid import jakarta.validation.constraints.PositiveOrZero -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.focuser.Focuser import org.springframework.web.bind.annotation.* diff --git a/api/src/main/kotlin/nebulosa/api/focusers/FocuserDeserializer.kt b/api/src/main/kotlin/nebulosa/api/focusers/FocuserDeserializer.kt index 7bb27a1bf..326e9d6a4 100644 --- a/api/src/main/kotlin/nebulosa/api/focusers/FocuserDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/focusers/FocuserDeserializer.kt @@ -1,6 +1,6 @@ package nebulosa.api.focusers -import nebulosa.api.beans.converters.indi.DeviceDeserializer +import nebulosa.api.beans.converters.device.DeviceDeserializer import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.focuser.Focuser import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt index ddce26f75..0899829ae 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt @@ -1,6 +1,6 @@ package nebulosa.api.guiding -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.connection.ConnectionService import nebulosa.guiding.GuideDirection import nebulosa.indi.device.guide.GuideOutput diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputDeserializer.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputDeserializer.kt index 6ede536fb..bf17f269e 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputDeserializer.kt @@ -1,6 +1,6 @@ package nebulosa.api.guiding -import nebulosa.api.beans.converters.indi.DeviceDeserializer +import nebulosa.api.beans.converters.device.DeviceDeserializer import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.guide.GuideOutput import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt index ae4e0184e..49e12d6e0 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt @@ -2,7 +2,9 @@ package nebulosa.api.image import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.atlas.Location +import nebulosa.api.beans.converters.device.DeviceOrEntityParam +import nebulosa.api.beans.converters.location.LocationParam import nebulosa.imaging.ImageChannel import nebulosa.imaging.algorithms.transformation.ProtectionMethod import nebulosa.indi.device.camera.Camera @@ -61,7 +63,8 @@ class ImageController( @RequestParam(required = false, defaultValue = "true") starsAndDSOs: Boolean, @RequestParam(required = false, defaultValue = "false") minorPlanets: Boolean, @RequestParam(required = false, defaultValue = "12.0") minorPlanetMagLimit: Double, - ) = imageService.annotations(path, starsAndDSOs, minorPlanets, minorPlanetMagLimit) + @LocationParam location: Location? = null, + ) = imageService.annotations(path, starsAndDSOs, minorPlanets, minorPlanetMagLimit, location) @GetMapping("coordinate-interpolation") fun coordinateInterpolation(@RequestParam path: Path): CoordinateInterpolation? { diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index 04e79fe42..4b813faa2 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -2,11 +2,11 @@ package nebulosa.api.image import com.fasterxml.jackson.databind.ObjectMapper import jakarta.servlet.http.HttpServletResponse +import nebulosa.api.atlas.Location import nebulosa.api.atlas.SimbadEntityRepository import nebulosa.api.calibration.CalibrationFrameService import nebulosa.api.connection.ConnectionService import nebulosa.api.framing.FramingService -import nebulosa.api.locations.LocationService import nebulosa.fits.* import nebulosa.imaging.Image import nebulosa.imaging.ImageChannel @@ -54,7 +54,6 @@ class ImageService( private val threadPoolTaskExecutor: ThreadPoolTaskExecutor, private val connectionService: ConnectionService, private val starDetector: StarDetector, - private val locationService: LocationService, ) { val fovCameras: ByteArray by lazy { @@ -145,6 +144,7 @@ class ImageService( path: Path, starsAndDSOs: Boolean, minorPlanets: Boolean, minorPlanetMagLimit: Double = 12.0, + location: Location? = null, ): List { val (image, calibration) = imageBucket[path] ?: return emptyList() @@ -166,7 +166,6 @@ class ImageService( if (minorPlanets) { threadPoolTaskExecutor.submitCompletable { - val location = locationService.selected val latitude = image.header.latitude ?: location?.latitude ?: 0.0 val longitude = image.header.longitude ?: location?.longitude ?: 0.0 diff --git a/api/src/main/kotlin/nebulosa/api/indi/INDIController.kt b/api/src/main/kotlin/nebulosa/api/indi/INDIController.kt index f69a95d6a..ea9f2621b 100644 --- a/api/src/main/kotlin/nebulosa/api/indi/INDIController.kt +++ b/api/src/main/kotlin/nebulosa/api/indi/INDIController.kt @@ -1,7 +1,7 @@ package nebulosa.api.indi import jakarta.validation.Valid -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.indi.device.Device import nebulosa.indi.device.PropertyVector import org.springframework.web.bind.annotation.* diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt deleted file mode 100644 index 6469966ce..000000000 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationController.kt +++ /dev/null @@ -1,36 +0,0 @@ -package nebulosa.api.locations - -import jakarta.validation.Valid -import org.springframework.web.bind.annotation.* - -@RestController -@RequestMapping("locations") -class LocationController( - private val locationService: LocationService, -) { - - @GetMapping - fun locations(): List { - return locationService.locations() - } - - @GetMapping("{id}") - fun location(@PathVariable id: Long): LocationEntity { - return locationService.location(id) - } - - @GetMapping("selected") - fun selected(): LocationEntity? { - return locationService.selected - } - - @PutMapping - fun saveLocation(@RequestBody @Valid body: LocationEntity): LocationEntity { - return locationService.save(body) - } - - @DeleteMapping("{id}") - fun deleteLocation(@PathVariable id: Long) { - locationService.delete(id) - } -} diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationEntity.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationEntity.kt deleted file mode 100644 index be1bcc29a..000000000 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationEntity.kt +++ /dev/null @@ -1,27 +0,0 @@ -package nebulosa.api.locations - -import io.objectbox.annotation.Entity -import io.objectbox.annotation.Id -import jakarta.validation.constraints.NotBlank -import nebulosa.api.database.BoxEntity -import nebulosa.math.deg -import nebulosa.math.m -import nebulosa.nova.position.GeographicPosition -import nebulosa.nova.position.Geoid -import org.hibernate.validator.constraints.Range - -@Entity -data class LocationEntity( - @Id override var id: Long = 0L, - @field:NotBlank var name: String = "", - @field:Range(min = -90, max = 90) var latitude: Double = 0.0, // deg. - @field:Range(min = -180, max = 180) var longitude: Double = 0.0, // deg. - @field:Range(min = -1000, max = 10000) var elevation: Double = 0.0, // m. - @field:Range(min = -720, max = 720) var offsetInMinutes: Int = 0, - var selected: Boolean = false, -) : BoxEntity { - - fun geographicPosition(): GeographicPosition { - return Geoid.IERS2010.lonLat(longitude.deg, latitude.deg, elevation.m) - } -} diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationRepository.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationRepository.kt deleted file mode 100644 index 1f1525257..000000000 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationRepository.kt +++ /dev/null @@ -1,30 +0,0 @@ -package nebulosa.api.locations - -import io.objectbox.Box -import nebulosa.api.repositories.BoxRepository -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.stereotype.Component - -@Component -class LocationRepository(@Qualifier("locationBox") override val box: Box) : BoxRepository() { - - fun findFirstByOrderById(): LocationEntity? { - return box.query() - .order(LocationEntity_.id) - .build() - .use { it.findFirst() } - } - - fun findFirstBySelectedTrueOrderById(): LocationEntity? { - return box.query() - .equal(LocationEntity_.selected, true) - .order(LocationEntity_.id) - .build() - .use { it.findFirst() } - } - - @Synchronized - fun unselectedAll() { - box.put(onEach { it.selected = false }) - } -} diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationSeedTask.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationSeedTask.kt deleted file mode 100644 index 2ed8a5bde..000000000 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationSeedTask.kt +++ /dev/null @@ -1,17 +0,0 @@ -package nebulosa.api.locations - -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.stereotype.Component -import java.util.concurrent.TimeUnit - -@Component -class LocationSeedTask(private val locationRepository: LocationRepository) : Runnable { - - @Scheduled(fixedDelay = Long.MAX_VALUE, timeUnit = TimeUnit.SECONDS) - override fun run() { - if (locationRepository.isEmpty()) { - val location = LocationEntity(0, "Null Island", 0.0, 0.0, 0.0, selected = true) - locationRepository.save(location) - } - } -} diff --git a/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt b/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt deleted file mode 100644 index 1ea2a9f15..000000000 --- a/api/src/main/kotlin/nebulosa/api/locations/LocationService.kt +++ /dev/null @@ -1,42 +0,0 @@ -package nebulosa.api.locations - -import org.springframework.stereotype.Service - -@Service -class LocationService( - private val locationRepository: LocationRepository, -) { - - fun locations(): List { - return locationRepository.findAll() - } - - fun location(id: Long): LocationEntity { - return locationRepository.find(id)!! - } - - val selected - get() = locationRepository.findFirstBySelectedTrueOrderById() - - @Synchronized - fun save(location: LocationEntity): LocationEntity { - if (location.selected) locationRepository.unselectedAll() - locationRepository.save(location) - return location - } - - @Synchronized - fun delete(id: Long) { - if (id > 0L && locationRepository.size > 1) { - var location = location(id) - - locationRepository.delete(location) - - if (location.selected) { - location = locationRepository.findFirstByOrderById()!! - location.selected = true - save(location) - } - } - } -} diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt index f147096be..9b448aa0b 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt @@ -3,7 +3,7 @@ package nebulosa.api.mounts import jakarta.validation.Valid import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.PositiveOrZero -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.beans.converters.time.DateAndTimeParam import nebulosa.api.connection.ConnectionService import nebulosa.guiding.GuideDirection diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountDeserializer.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountDeserializer.kt index edfacb29e..211545d6c 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountDeserializer.kt @@ -1,6 +1,6 @@ package nebulosa.api.mounts -import nebulosa.api.beans.converters.indi.DeviceDeserializer +import nebulosa.api.beans.converters.device.DeviceDeserializer import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.mount.Mount import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerController.kt b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerController.kt index 579ff2f82..67ed86dc8 100644 --- a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerController.kt +++ b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerController.kt @@ -1,7 +1,7 @@ package nebulosa.api.sequencer import jakarta.validation.Valid -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.indi.device.camera.Camera import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt index 72b1aacc2..4be8c9184 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt @@ -3,7 +3,7 @@ package nebulosa.api.wheels import jakarta.validation.Valid import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.PositiveOrZero -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.filterwheel.FilterWheel import org.springframework.web.bind.annotation.* diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelDeserializer.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelDeserializer.kt index 35809545c..3bced98db 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelDeserializer.kt @@ -1,6 +1,6 @@ package nebulosa.api.wheels -import nebulosa.api.beans.converters.indi.DeviceDeserializer +import nebulosa.api.beans.converters.device.DeviceDeserializer import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.filterwheel.FilterWheel import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardController.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardController.kt index d1149b2bc..5beecd7bd 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardController.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardController.kt @@ -1,7 +1,7 @@ package nebulosa.api.wizard.flat import jakarta.validation.Valid -import nebulosa.api.beans.converters.indi.DeviceOrEntityParam +import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.indi.device.camera.Camera import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index 6219d3926..93db2828d 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -1,6 +1,6 @@ import { DragDropModule } from '@angular/cdk/drag-drop' import { CommonModule } from '@angular/common' -import { HttpClientModule } from '@angular/common/http' +import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http' import { LOCALE_ID, NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' import { BrowserModule } from '@angular/platform-browser' @@ -49,6 +49,7 @@ import { MoonComponent } from '../shared/components/moon/moon.component' import { LocationDialog } from '../shared/dialogs/location/location.dialog' import { NoDropdownDirective } from '../shared/directives/no-dropdown.directive' import { StopPropagationDirective } from '../shared/directives/stop-propagation.directive' +import { LocationInterceptor } from '../shared/interceptors/location.interceptor' import { AnglePipe } from '../shared/pipes/angle.pipe' import { EnumPipe } from '../shared/pipes/enum.pipe' import { EnvPipe } from '../shared/pipes/env.pipe' @@ -172,6 +173,11 @@ import { SettingsComponent } from './settings/settings.component' provide: LOCALE_ID, useValue: 'en-US', }, + { + provide: HTTP_INTERCEPTORS, + useClass: LocationInterceptor, + multi: true, + }, ], bootstrap: [AppComponent] }) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index ed1e9c9dc..ae5191bc9 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -14,7 +14,7 @@ import { SkyObjectPipe } from '../../shared/pipes/skyObject.pipe' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' -import { LocalStorageService } from '../../shared/services/local-storage.service' +import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' import { Angle, CONSTELLATIONS, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' import { Mount } from '../../shared/types/mount.types' @@ -425,7 +425,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private browserWindow: BrowserWindowService, private route: ActivatedRoute, electron: ElectronService, - private storage: LocalStorageService, + private preference: PreferenceService, private skyObjectPipe: SkyObjectPipe, private prime: PrimeService, ngZone: NgZone, @@ -452,7 +452,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async ngOnInit() { - const preference = this.storage.get(ATLAS_KEY, {}) + const preference = this.preference.skyAtlasPreference.get() for (const group of SATELLITE_GROUPS) { const satellite = preference.satellites?.find(e => e.group === group) @@ -463,7 +463,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.skyObjectFilter.types.push(... await this.api.skyObjectTypes()) } - async ngAfterContentInit() { + ngAfterContentInit() { // const canvas = this.chart.getCanvas() as HTMLCanvasElement // const chart = this.chart.chart as Chart @@ -481,8 +481,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } }) - await this.refreshTab() - this.route.queryParams.subscribe(e => { const data = JSON.parse(decodeURIComponent(e.data)) as SkyAtlasData this.loadTabFromData(data) @@ -490,6 +488,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } ngAfterViewInit() { + this.refreshTab() + this.calendarPanel.onOverlayClick = (e) => { e.stopImmediatePropagation() } @@ -598,13 +598,13 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.refreshing = true try { - const preference = this.storage.get(ATLAS_KEY, {}) + const preference = this.preference.skyAtlasPreference.get() preference.satellites = SATELLITE_GROUPS.map(group => { return { group, enabled: this.satelliteSearchGroup.get(group) ?? false } }) - this.storage.set(ATLAS_KEY, preference) + this.preference.skyAtlasPreference.set(preference) const groups = SATELLITE_GROUPS.filter(e => this.satelliteSearchGroup.get(e)) this.satelliteItems = await this.api.searchSatellites(this.satelliteSearchText, groups) @@ -614,7 +614,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } resetSatelliteFilter() { - const preference = this.storage.get(ATLAS_KEY, {}) + const preference = this.preference.skyAtlasPreference.get() preference.satellites = [] @@ -624,7 +624,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.satelliteSearchGroup.set(group, enabled) } - this.storage.set(ATLAS_KEY, preference) + this.preference.skyAtlasPreference.set(preference) } async filterSatellite() { @@ -669,7 +669,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, refreshChart: boolean = false, location?: Location, ) { - location ??= await this.api.selectedLocation() + location ??= this.preference.selectedLocation.get() this.refreshing = true this.refreshTabCount++ @@ -686,6 +686,10 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.app.subTitle = `${location.name} · ${moment(this.dateTime).format('YYYY-MM-DD HH:mm')}` try { + if (this.tab === undefined) { + this.tab = SkyAtlasTab.SUN + } + // Sun. if (this.tab === SkyAtlasTab.SUN) { this.name = 'Sun' diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index 3159dd0b4..5da43e10d 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -204,17 +204,19 @@ export class HomeComponent implements AfterContentInit, OnDestroy { }) this.connections = preference.connections.get() - this.connections.forEach(e => e.connected = false) + this.connections.forEach(e => { e.id = undefined; e.connected = false }) this.connection = this.connections[0] } async ngAfterContentInit() { - this.updateConnection() + await this.updateConnection() - this.cameras = await this.api.cameras() - this.mounts = await this.api.mounts() - this.focusers = await this.api.focusers() - this.wheels = await this.api.wheels() + if (this.connection?.connected) { + this.cameras = await this.api.cameras() + this.mounts = await this.api.mounts() + this.focusers = await this.api.focusers() + this.wheels = await this.api.wheels() + } } @HostListener('window:unload') @@ -325,11 +327,11 @@ export class HomeComponent implements AfterContentInit, OnDestroy { private async openImage(force: boolean = false) { if (force || this.cameras.length === 0) { - const defaultPath = this.preference.homeImageDefaultDirectory.get() + const defaultPath = this.preference.homeImageDirectory.get() const filePath = await this.electron.openFits({ defaultPath }) if (filePath) { - this.preference.homeImageDefaultDirectory.set(path.dirname(filePath)) + this.preference.homeImageDirectory.set(path.dirname(filePath)) this.browserWindow.openImage({ path: filePath, source: 'PATH' }) } } else { diff --git a/desktop/src/app/settings/settings.component.html b/desktop/src/app/settings/settings.component.html index 347a84a90..6cb984b27 100644 --- a/desktop/src/app/settings/settings.component.html +++ b/desktop/src/app/settings/settings.component.html @@ -1,6 +1,6 @@
-
@@ -11,7 +11,7 @@
-
+
-
+
@@ -85,7 +85,7 @@
-
+
e.id === result.id) + + if (result.id === 0) { + result.id = Date.now() + } + + if (index >= 0) { + Object.assign(this.locations[index], result) + this.location = this.locations[index] + } else { + this.locations.push(result) + this.location = result + } - private async loadLocations() { - this.locations = await this.api.locations() - this.location = this.locations.find(e => e.selected) ?? this.locations[0] ?? structuredClone(EMPTY_LOCATION) + this.preference.locations.set(this.locations) + this.preference.selectedLocation.set(this.location) - if (this.location.id && !this.location.selected) { - this.location.selected = true - this.api.saveLocation(this.location) + this.electron.send('LOCATION.CHANGED', this.location) } } async deleteLocation() { - await this.api.deleteLocation(this.location) - await this.loadLocations() - this.electron.send('LOCATION.CHANGED', this.location) + if (this.locations.length > 1) { + const index = this.locations.findIndex(e => e.id === this.location.id) + + if (index >= 0) { + this.locations.splice(index, 1) + this.location = this.locations[0] + + this.preference.locations.set(this.locations) + this.preference.selectedLocation.set(this.location) + + this.electron.send('LOCATION.CHANGED', this.location) + } + } } locationChanged() { - this.locations.forEach(e => e.selected = false) - this.location.selected = true - this.locations.forEach(e => this.api.saveLocation(e)) + this.preference.selectedLocation.set(this.location) this.electron.send('LOCATION.CHANGED', this.location) } diff --git a/desktop/src/shared/interceptors/location.interceptor.ts b/desktop/src/shared/interceptors/location.interceptor.ts new file mode 100644 index 000000000..3ee9339ea --- /dev/null +++ b/desktop/src/shared/interceptors/location.interceptor.ts @@ -0,0 +1,20 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' +import { PreferenceService } from '../services/preference.service' + +@Injectable({ providedIn: 'root' }) +export class LocationInterceptor implements HttpInterceptor { + + constructor(private preference: PreferenceService) { } + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const selectedLocation = this.preference.selectedLocation.get() + + req = req.clone({ + headers: req.headers.set('X-Location', JSON.stringify(selectedLocation)) + }) + + return next.handle(req) + } +} \ No newline at end of file diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 54b1b2680..809093cb1 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -361,28 +361,6 @@ export class ApiService { return this.http.get(`indi/${device.name}/log`) } - // LOCATION - - locations() { - return this.http.get(`locations`) - } - - location(id: number) { - return this.http.get(`locations/${id}`) - } - - selectedLocation() { - return this.http.get(`locations/selected`) - } - - saveLocation(location: Location) { - return this.http.put(`locations`, location) - } - - deleteLocation(location: Location) { - return this.http.delete(`locations/${location.id}`) - } - // SKY ATLAS positionOfSun(location: Location, dateTime: Date) { diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index 94785897e..f96c721f9 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -1,5 +1,7 @@ import { Injectable } from '@angular/core' +import { SkyAtlasPreference } from '../../app/atlas/atlas.component' import { AlignmentPreference, EMPTY_ALIGNMENT_PREFERENCE } from '../types/alignment.types' +import { EMPTY_LOCATION, Location } from '../types/atlas.types' import { Camera, CameraPreference, CameraStartCapture, EMPTY_CAMERA_PREFERENCE } from '../types/camera.types' import { ConnectionDetails } from '../types/home.types' import { EMPTY_IMAGE_PREFERENCE, FOV, ImagePreference } from '../types/image.types' @@ -9,7 +11,11 @@ import { LocalStorageService } from './local-storage.service' export class PreferenceData { - constructor(private storage: LocalStorageService, private key: string, private defaultValue: T | (() => T)) { } + constructor( + private storage: LocalStorageService, + private key: string, + private defaultValue: T | (() => T), + ) { } has() { return this.storage.has(this.key) @@ -57,9 +63,12 @@ export class PreferenceService { return new PreferenceData(this.storage, `settings.plateSolver.${type}`, () => { ...EMPTY_PLATE_SOLVER_OPTIONS, type }) } + readonly locations = new PreferenceData(this.storage, 'locations', () => [structuredClone(EMPTY_LOCATION)]) + readonly selectedLocation = new PreferenceData(this.storage, 'locations.selected', () => structuredClone(EMPTY_LOCATION)) readonly imagePreference = new PreferenceData(this.storage, 'image', () => structuredClone(EMPTY_IMAGE_PREFERENCE)) - readonly alignmentPreference = new PreferenceData(this.storage, `alignment`, () => structuredClone(EMPTY_ALIGNMENT_PREFERENCE)) + readonly skyAtlasPreference = new PreferenceData(this.storage, 'atlas', () => {}) + readonly alignmentPreference = new PreferenceData(this.storage, 'alignment', () => structuredClone(EMPTY_ALIGNMENT_PREFERENCE)) readonly connections = new PreferenceData(this.storage, 'home.connections', () => []) - readonly homeImageDefaultDirectory = new PreferenceData(this.storage, 'home.image.directory', '') + readonly homeImageDirectory = new PreferenceData(this.storage, 'home.image.directory', '') readonly imageFOVs = new PreferenceData(this.storage, 'image.fovs', () => []) } \ No newline at end of file diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index bb1487567..e3d81d7e8 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -262,17 +262,15 @@ export interface Location { longitude: number elevation: number offsetInMinutes: number - selected: boolean } export const EMPTY_LOCATION: Location = { id: 0, - name: '', + name: 'Null Island', latitude: 0, longitude: 0, elevation: 0, offsetInMinutes: 0, - selected: false, } export interface SkyAtlasUpdated extends NotificationEvent { From 107c2db35890c447b9a88cb416fda1cb9faf785f Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 11 Mar 2024 22:31:21 -0300 Subject: [PATCH 13/40] [api]: Don't generate not-null assertions --- build.gradle.kts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1074c3d77..19f7ae816 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,12 +60,15 @@ subprojects { } tasks.withType { - kotlinOptions.jvmTarget = JavaVersion.VERSION_17.toString() - kotlinOptions.freeCompilerArgs = listOf( - "-Xjvm-default=all", "-Xjsr305=strict", - "-opt-in=kotlin.io.path.ExperimentalPathApi", - "-opt-in=kotlin.io.encoding.ExperimentalEncodingApi", - ) + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + freeCompilerArgs = listOf( + "-Xjvm-default=all", "-Xjsr305=strict", + "-opt-in=kotlin.io.path.ExperimentalPathApi", + "-opt-in=kotlin.io.encoding.ExperimentalEncodingApi", + "-Xno-param-assertions", "-Xno-call-assertions", "-Xno-receiver-assertions", + ) + } } tasks.withType { From 89fbcb4497bca35a4f84b8eb28bbc3ac1b5f8fba Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 12 Mar 2024 23:10:15 -0300 Subject: [PATCH 14/40] [api]: Implement SBDB Close-Approach Data API --- .editorconfig | 2 +- .../kotlin/nebulosa/sbd/SmallBodyDatabase.kt | 9 ++- .../nebulosa/sbd/SmallBodyDatabaseService.kt | 23 ++++---- .../SmallBodyCloseApprochServiceTest.kt | 57 +++++++++++++++++++ 4 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt diff --git a/.editorconfig b/.editorconfig index d0ed4ce8d..00bd20fda 100644 --- a/.editorconfig +++ b/.editorconfig @@ -24,8 +24,8 @@ trim_trailing_whitespace = false ij_kotlin_line_break_after_multiline_when_entry = false ij_kotlin_variable_annotation_wrap = off ij_kotlin_field_annotation_wrap = off +ij_kotlin_continuation_indent_size = 8 [*.py] ij_python_wrap_long_lines = false ij_python_method_parameters_wrap = off - diff --git a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt index cbb80b233..93ba22bb7 100644 --- a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt +++ b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt @@ -19,7 +19,12 @@ internal interface SmallBodyDatabase { @Query("obs-time") dateTime: String, @Query("lat") lat: Double, @Query("lon") lon: Double, @Query("alt") alt: Double, @Query("fov-ra-center") fovRA: String, @Query("fov-dec-center") fovDEC: String, - @Query("fov-ra-hwidth") fovRAWidth: Double, @Query("fov-dec-hwidth") fovDECWidth: Double, - @Query("vmag-lim") magLimit: Double, + @Query("fov-ra-hwidth") fovRAWidth: Double, @Query("fov-dec-hwidth") fovDECWidth: Double = fovRAWidth, + @Query("vmag-lim") magLimit: Double = 12.0, + ): Call + + @GET("cad.api?neo=false&diameter=true") + fun closeApproaches( + @Query("date-min") dateMin: String, @Query("date-max") dateMax: String, @Query("dist-max") distMax: String, ): Call } diff --git a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt index f17377082..b07e7004e 100644 --- a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt +++ b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt @@ -3,8 +3,9 @@ package nebulosa.sbd import nebulosa.math.* import nebulosa.retrofit.RetrofitService import okhttp3.OkHttpClient -import retrofit2.Call +import okhttp3.logging.HttpLoggingInterceptor import retrofit2.create +import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -27,6 +28,8 @@ class SmallBodyDatabaseService( response } } + + builder.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)) } fun search(text: String) = service.search(text) @@ -36,16 +39,16 @@ class SmallBodyDatabaseService( latitude: Angle, longitude: Angle, elevation: Distance = 0.m, centerRA: Angle, centerDEC: Angle, fov: Angle = DEFAULT_FOV, magLimit: Double = 12.0, - ): Call { - val fovDeg = fov.toDegrees + ) = service.identify( + dateTime.format(DATE_TIME_FORMAT), + latitude.toDegrees, longitude.toDegrees, elevation.toKilometers, + centerRA.format(RA_FORMAT), centerDEC.format(DEC_FORMAT), fovRAWidth = fov.toDegrees, + magLimit = magLimit, + ) - return service.identify( - dateTime.format(DATE_TIME_FORMAT), - latitude.toDegrees, longitude.toDegrees, elevation.toKilometers, - centerRA.format(RA_FORMAT), centerDEC.format(DEC_FORMAT), fovDeg, fovDeg, - magLimit, - ) - } + fun closeApproaches( + days: Int = 7, distance: Int = 2, date: LocalDate? = null, + ) = service.closeApproaches(date?.toString() ?: "now", "+$days", "${distance}LD") companion object { diff --git a/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt new file mode 100644 index 000000000..da70f26ec --- /dev/null +++ b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt @@ -0,0 +1,57 @@ +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.doubles.plusOrMinus +import io.kotest.matchers.ints.shouldBeGreaterThanOrEqual +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import nebulosa.constants.AU_KM +import nebulosa.sbd.SmallBodyDatabaseService +import java.time.LocalDate + +class SmallBodyCloseApprochServiceTest : StringSpec() { + + init { + val service = SmallBodyDatabaseService() + + "search" { + val data = service.closeApproaches(distance = 10, date = LocalDate.of(2024, 3, 13)).execute().body() + + data.shouldNotBeNull() + data.count shouldBeGreaterThanOrEqual 1 + + data.fields shouldHaveSize 13 + data.data shouldHaveSize 10 + + data.data[0][0] shouldBe "2024 EC3" + data.data[0][3] shouldBe "2024-Mar-13 07:22" + data.data[0][4].toDouble() shouldBe (2.29 * 384400 / AU_KM plusOrMinus 1e-2) + + data.data.map { it[0] } shouldContainAll listOf( + "2024 EC3", "2024 EL1", "2024 EH3", + "2024 EK3", "2024 EQ", "2024 EK", "2024 EX2", "2024 ED3", + "2024 EN", "2020 FD" + ) + + // https://minorplanetcenter.net/ + // ############# Close Approaches ############ + // 2024 EC3 Mar 13 07:22 2.29 4-11 + // 2024 EL1 Mar 13 13:10 8.48 9-30 + // 2024 EH3 Mar 14 16:16 6.5 16-50 + // 2024 EK3 Mar 15 03:10 1.62 3-11 + // 2020 FU Mar 15 21:29 14.84 10-31 + // 2024 CJ8 Mar 16 01:25 17.21 43-140 + // 2024 EQ Mar 16 06:31 6.92 12-37 + // 2022 EK1 Mar 16 09:08 45.25 22-69 + // 2024 EK Mar 16 15:29 6.96 8-26 + // 2024 EX2 Mar 16 16:03 5.82 10-32 + // 2004 FK2 Mar 17 23:18 24.01 24-75 + // 2024 EW Mar 18 07:55 32.45 14-43 + // 2024 ED3 Mar 18 08:37 3.5 17-54 + // 2024 CH6 Mar 18 08:42 47.08 61-190 + // 2024 EN Mar 18 18:34 3.87 23-74 + // 2020 FD Mar 18 19:11 4.52 5-17 + // 2011 BY24 Mar 18 22:50 26.14 56-180 + } + } +} From 98a841df095426be3a38ba53e57a996130393c60 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 13 Mar 2024 02:03:10 -0300 Subject: [PATCH 15/40] [api][desktop]: Add "Close Approaches" tab in Sky Atlas --- .../nebulosa/api/atlas/CloseApproach.kt | 47 ++++++ .../nebulosa/api/atlas/SkyAtlasController.kt | 10 ++ .../nebulosa/api/atlas/SkyAtlasService.kt | 5 + .../beans/converters/time/DateAndTimeParam.kt | 1 + .../DateAndTimeParamMethodArgumentResolver.kt | 14 +- desktop/src/app/atlas/atlas.component.html | 135 ++++++++++++------ desktop/src/app/atlas/atlas.component.scss | 6 +- desktop/src/app/atlas/atlas.component.ts | 25 +++- desktop/src/shared/services/api.service.ts | 8 +- desktop/src/shared/types/atlas.types.ts | 8 ++ desktop/src/styles.scss | 6 +- .../kotlin/nebulosa/sbd/SmallBodyDatabase.kt | 2 +- .../nebulosa/sbd/SmallBodyDatabaseService.kt | 7 +- .../SmallBodyCloseApprochServiceTest.kt | 2 +- 14 files changed, 206 insertions(+), 70 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/atlas/CloseApproach.kt diff --git a/api/src/main/kotlin/nebulosa/api/atlas/CloseApproach.kt b/api/src/main/kotlin/nebulosa/api/atlas/CloseApproach.kt new file mode 100644 index 000000000..06914286a --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/atlas/CloseApproach.kt @@ -0,0 +1,47 @@ +package nebulosa.api.atlas + +import nebulosa.constants.AU_KM +import nebulosa.sbd.SmallBodyIdentified +import java.time.LocalDateTime +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter +import java.util.* + +data class CloseApproach( + val name: String = "", + val designation: String = "", + val dateTime: Long = 0, + val distance: Double = 0.0, + val absoluteMagnitude: Double = 0.0, +) { + + companion object { + + @JvmStatic val EMPTY = CloseApproach() + + @JvmStatic private val DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-LLL-dd HH:mm", Locale.ENGLISH) + + @JvmStatic + fun of(body: SmallBodyIdentified): List { + val data = ArrayList(body.count) + + val nameIdx = body.fields.indexOf("fullname") + val desIdx = body.fields.indexOf("des") + val cdIdx = body.fields.indexOf("cd") + val distIdx = body.fields.indexOf("dist") + val hIdx = body.fields.indexOf("h") + + for (entry in body.data) { + val name = entry[nameIdx].trim() + val designation = entry[desIdx].trim() + val dateTime = LocalDateTime.parse(entry[cdIdx].trim(), DATE_TIME_FORMAT).toEpochSecond(ZoneOffset.UTC) * 1000L + val distance = entry[distIdx].trim().toDouble() * AU_KM / 384400.0 + val absoluteMagnitude = entry[hIdx].trim().toDouble() + + data.add(CloseApproach(name, designation, dateTime, distance, absoluteMagnitude)) + } + + return data + } + } +} diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt index a0ee377b6..11decdf91 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import jakarta.validation.constraints.Min import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Positive import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.beans.converters.location.LocationParam import nebulosa.api.beans.converters.time.DateAndTimeParam @@ -11,10 +12,12 @@ import nebulosa.math.deg import nebulosa.math.hours import nebulosa.nova.astrometry.Constellation import nebulosa.skycatalog.SkyObjectType +import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import java.time.LocalDate import java.time.LocalDateTime +@Validated @RestController @RequestMapping("sky-atlas") class SkyAtlasController( @@ -70,6 +73,13 @@ class SkyAtlasController( @GetMapping("minor-planets") fun searchMinorPlanet(@RequestParam @Valid @NotBlank text: String) = skyAtlasService.searchMinorPlanet(text) + @GetMapping("minor-planets/close-approaches") + fun closeApproachesForMinorPlanets( + @RequestParam(required = false, defaultValue = "7") @Valid @Positive days: Long, + @RequestParam(required = false, defaultValue = "10") @Valid @Positive distance: Int, + @DateAndTimeParam(nullable = true) dateTime: LocalDate?, + ) = skyAtlasService.closeApproachesForMinorPlanets(days, distance, dateTime) + @GetMapping("sky-objects/{id}/position") fun positionOfSkyObject( @PathVariable id: Long, diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index 3b80d4895..fef5b731e 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -176,6 +176,11 @@ class SkyAtlasService( ?.let(MinorPlanet::of) ?: MinorPlanet.EMPTY + fun closeApproachesForMinorPlanets(days: Long, distance: Int, date: LocalDate?) = smallBodyDatabaseService + .closeApproaches(days, distance, date).execute().body() + ?.let(CloseApproach::of) + ?: emptyList() + fun searchSkyObject( text: String? = null, rightAscension: Angle = 0.0, declination: Angle = 0.0, radius: Angle = 0.0, diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParam.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParam.kt index 42f1beaeb..cdcc85c38 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParam.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParam.kt @@ -6,4 +6,5 @@ annotation class DateAndTimeParam( val datePattern: String = "yyyy-MM-dd", val timePattern: String = "HH:mm", val noSeconds: Boolean = true, + val nullable: Boolean = false, ) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParamMethodArgumentResolver.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParamMethodArgumentResolver.kt index a6675f700..539204254 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParamMethodArgumentResolver.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/time/DateAndTimeParamMethodArgumentResolver.kt @@ -31,22 +31,22 @@ class DateAndTimeParamMethodArgumentResolver : HandlerMethodArgumentResolver { val dateAndTimeParam = parameter.annotation()!! val type = parameter.parameterType - val dateValue = webRequest.parameter("date") - val timeValue = webRequest.parameter("time") + val dateValue = webRequest.parameter("date")?.ifBlank { null } + val timeValue = webRequest.parameter("time")?.ifBlank { null } - val date = dateValue?.ifBlank { null } + val date = dateValue ?.let { LocalDate.parse(it, DateTimeFormatter.ofPattern(dateAndTimeParam.datePattern)) } - ?: LocalDate.now() + ?: if (dateAndTimeParam.nullable) null else LocalDate.now() if (type === LocalDate::class.java) return date - val time = timeValue?.ifBlank { null } + val time = timeValue ?.let { LocalTime.parse(it, DateTimeFormatter.ofPattern(dateAndTimeParam.timePattern)) } - ?: LocalTime.now() + ?: if (dateAndTimeParam.nullable) null else LocalTime.now() if (type === LocalTime::class.java) return time - return LocalDateTime.of(date, time) + return LocalDateTime.of(date ?: LocalDate.now(), time ?: LocalTime.now()) .let { if (dateAndTimeParam.noSeconds) it.withSecond(0).withNano(0) else it } } } diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 27d9cbf85..7b16f9fe8 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -1,7 +1,7 @@
- - + +
@@ -14,7 +14,7 @@
- +
@@ -24,7 +24,7 @@
- +
@@ -32,8 +32,7 @@
+ dataKey="code" styleClass="p-datatable-sm p-datatable-striped"> Name @@ -49,44 +48,88 @@
- +
-
-
- - - - - -
-
-
- - - - Name - Description - Value - - - - - {{ item.name }} - {{ item.description }} - {{ item.value }} {{ item.unit }} - - - -
+ + +
+
+ + + + + +
+
+
+ + + + Name + Description + Value + + + + + {{ item.name }} + {{ item.description }} + {{ item.value }} {{ item.unit }} + + + +
+
+ +
+
+ + + + + + + + + +
+
+
+ + + + Name + Date/Time (Local) + Distance (LD) + H (mag) + + + + + {{ item.name }} + {{ item.dateTime | date:'yyyy-MM-dd HH:mm' }} + {{ item.distance.toFixed(2) }} + {{ item.absoluteMagnitude.toFixed(2) }} + + + +
+
+
- +
@@ -106,9 +149,9 @@
+ (selectionChange)="skyObjectChanged()" selectionMode="single" dataKey="id" + styleClass="p-datatable-sm p-datatable-striped" [paginator]="true" [rows]="100" [pageLinks]="3" + [showCurrentPageReport]="true" currentPageReportTemplate="{first}-{last} / {totalRecords}"> Name @@ -128,7 +171,7 @@
- +
@@ -151,7 +194,7 @@
@@ -294,20 +337,20 @@
- +
- +
+ inputStyleClass="p-inputtext-sm border-0 w-full" locale="en" [(ngModel)]="skyObjectFilter.radius" />
diff --git a/desktop/src/app/atlas/atlas.component.scss b/desktop/src/app/atlas/atlas.component.scss index d304e8880..5f6c0f61e 100644 --- a/desktop/src/app/atlas/atlas.component.scss +++ b/desktop/src/app/atlas/atlas.component.scss @@ -4,7 +4,7 @@ height: 100vh; ::ng-deep { - .main.p-tabview { + .p-tabview { padding-left: 0.21rem; padding-right: 0.21rem; @@ -13,7 +13,7 @@ } p-table.minorPlanet .p-datatable-wrapper { - height: 189px; + height: 154px; } p-table.skyObject .p-datatable-wrapper, @@ -21,7 +21,7 @@ height: 143px; } - .p-tabview-nav li { + .p-tabview-nav li.main { width: calc(100% / 6) !important; .p-tabview-nav-link { diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index ae5191bc9..ba695d008 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -16,7 +16,7 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' -import { Angle, CONSTELLATIONS, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' +import { Angle, CONSTELLATIONS, CloseApproach, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' import { Mount } from '../../shared/types/mount.types' import { AppComponent } from '../app.component' @@ -128,10 +128,15 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, { name: '4 Vesta', type: 'Asteroid', code: '4;' }, ] + minorPlanetTab = 0 minorPlanet?: MinorPlanet minorPlanetSearchText = '' minorPlanetChoiceItems: { name: string, pdes: string }[] = [] showMinorPlanetChoiceDialog = false + closeApproach?: CloseApproach + closeApproaches: CloseApproach[] = [] + closeApproachDays = 7 + closeApproachDistance = 10 skyObject?: DeepSkyObject skyObjectItems: DeepSkyObject[] = [] @@ -550,6 +555,24 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.showMinorPlanetChoiceDialog = false } + async closeApproachesForMinorPlanets() { + this.refreshing = true + + try { + this.closeApproaches = await this.api.closeApproachesForMinorPlanets(this.closeApproachDays, this.closeApproachDistance, this.dateTime) + } finally { + this.refreshing = false + } + } + + closeApproachChanged() { + if (this.closeApproach) { + this.minorPlanetSearchText = this.closeApproach.designation + this.minorPlanetTab = 0 + this.searchMinorPlanet() + } + } + async starChanged() { await this.refreshTab(false, true) } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 809093cb1..bcf4c4b57 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core' import moment from 'moment' import { DARVStart, TPPAStart } from '../types/alignment.types' -import { Angle, BodyPosition, ComputedLocation, Constellation, DeepSkyObject, Location, MinorPlanet, Satellite, SatelliteGroupType, SkyObjectType, Twilight } from '../types/atlas.types' +import { Angle, BodyPosition, CloseApproach, ComputedLocation, Constellation, DeepSkyObject, Location, MinorPlanet, Satellite, SatelliteGroupType, SkyObjectType, Twilight } from '../types/atlas.types' import { CalibrationFrame, CalibrationFrameGroup } from '../types/calibration.types' import { Camera, CameraStartCapture } from '../types/camera.types' import { Device, INDIProperty, INDISendProperty } from '../types/device.types' @@ -453,6 +453,12 @@ export class ApiService { return this.http.get(`sky-atlas/minor-planets?${query}`) } + closeApproachesForMinorPlanets(days: number = 7, distance: number = 10, dateTime?: Date | string) { + const date = !dateTime || typeof dateTime === 'string' ? dateTime : moment(dateTime).format('YYYY-MM-DD') + const query = this.http.query({ days, distance, date }) + return this.http.get(`sky-atlas/minor-planets/close-approaches?${query}`) + } + annotationsOfImage( path: string, starsAndDSOs: boolean = true, minorPlanets: boolean = false, diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index e3d81d7e8..f5a4b7e3a 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -176,6 +176,14 @@ export interface OrbitalPhysicalParameter { value: string } +export interface CloseApproach { + name: string + designation: string + dateTime: number + distance: number + absoluteMagnitude: number +} + export interface AstronomicalObject extends EquatorialCoordinateJ2000 { id: number name: string diff --git a/desktop/src/styles.scss b/desktop/src/styles.scss index c11bf3a89..b960c8ae2 100644 --- a/desktop/src/styles.scss +++ b/desktop/src/styles.scss @@ -207,13 +207,9 @@ i.mdi { } .p-tabview { - .p-tabview-title { - line-height: 0; - } - .p-tabview-nav li .p-tabview-nav-link { border-color: transparent !important; - min-height: 32px; + min-height: 28px; } } diff --git a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt index 93ba22bb7..85398208d 100644 --- a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt +++ b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabase.kt @@ -23,7 +23,7 @@ internal interface SmallBodyDatabase { @Query("vmag-lim") magLimit: Double = 12.0, ): Call - @GET("cad.api?neo=false&diameter=true") + @GET("cad.api?neo=false&diameter=true&fullname=true") fun closeApproaches( @Query("date-min") dateMin: String, @Query("date-max") dateMax: String, @Query("dist-max") distMax: String, ): Call diff --git a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt index b07e7004e..3aae611d4 100644 --- a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt +++ b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt @@ -3,7 +3,6 @@ package nebulosa.sbd import nebulosa.math.* import nebulosa.retrofit.RetrofitService import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor import retrofit2.create import java.time.LocalDate import java.time.LocalDateTime @@ -28,8 +27,6 @@ class SmallBodyDatabaseService( response } } - - builder.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)) } fun search(text: String) = service.search(text) @@ -47,8 +44,8 @@ class SmallBodyDatabaseService( ) fun closeApproaches( - days: Int = 7, distance: Int = 2, date: LocalDate? = null, - ) = service.closeApproaches(date?.toString() ?: "now", "+$days", "${distance}LD") + days: Long = 7L, distance: Int = 2, date: LocalDate? = null, + ) = service.closeApproaches(date?.toString() ?: "now", date?.plusDays(days)?.toString() ?: "+$days", "${distance}LD") companion object { diff --git a/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt index da70f26ec..267d7c7b0 100644 --- a/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt +++ b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt @@ -20,7 +20,7 @@ class SmallBodyCloseApprochServiceTest : StringSpec() { data.shouldNotBeNull() data.count shouldBeGreaterThanOrEqual 1 - data.fields shouldHaveSize 13 + data.fields shouldHaveSize 14 data.data shouldHaveSize 10 data.data[0][0] shouldBe "2024 EC3" From 226fc6ec4461033526bf08e2262fe70fb23ed008 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 13 Mar 2024 02:07:07 -0300 Subject: [PATCH 16/40] [api]: Use double instead of int on distance parameter of close approach endpoint --- api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt | 2 +- api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt | 2 +- .../src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt index 11decdf91..5251bfee0 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt @@ -76,7 +76,7 @@ class SkyAtlasController( @GetMapping("minor-planets/close-approaches") fun closeApproachesForMinorPlanets( @RequestParam(required = false, defaultValue = "7") @Valid @Positive days: Long, - @RequestParam(required = false, defaultValue = "10") @Valid @Positive distance: Int, + @RequestParam(required = false, defaultValue = "10") @Valid @Positive distance: Double, @DateAndTimeParam(nullable = true) dateTime: LocalDate?, ) = skyAtlasService.closeApproachesForMinorPlanets(days, distance, dateTime) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index fef5b731e..79339d00f 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -176,7 +176,7 @@ class SkyAtlasService( ?.let(MinorPlanet::of) ?: MinorPlanet.EMPTY - fun closeApproachesForMinorPlanets(days: Long, distance: Int, date: LocalDate?) = smallBodyDatabaseService + fun closeApproachesForMinorPlanets(days: Long, distance: Double, date: LocalDate?) = smallBodyDatabaseService .closeApproaches(days, distance, date).execute().body() ?.let(CloseApproach::of) ?: emptyList() diff --git a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt index 3aae611d4..d0aeb0e7a 100644 --- a/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt +++ b/nebulosa-sbd/src/main/kotlin/nebulosa/sbd/SmallBodyDatabaseService.kt @@ -44,7 +44,7 @@ class SmallBodyDatabaseService( ) fun closeApproaches( - days: Long = 7L, distance: Int = 2, date: LocalDate? = null, + days: Long = 7L, distance: Double = 2.0, date: LocalDate? = null, ) = service.closeApproaches(date?.toString() ?: "now", date?.plusDays(days)?.toString() ?: "+$days", "${distance}LD") companion object { From 6c2fbd5029d3b5f960b8fc910a363ae3cca9e523 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 14 Mar 2024 00:42:29 -0300 Subject: [PATCH 17/40] [desktop]: Fix auto resize window Why did it stop working? setSize() -> setContentSize() --- desktop/app/main.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index 78d99f933..d059de45a 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -476,12 +476,12 @@ try { ipcMain.handle('WINDOW.RESIZE', (event, data: number) => { const window = findWindowById(event.sender.id)?.window - if (!window || window.isResizable()) return false + if (!window || (!serve && window.isResizable())) return false - const size = window.getSize() + const size = window.getContentSize() const maxHeight = screen.getPrimaryDisplay().workAreaSize.height const height = Math.max(0, Math.min(data, maxHeight)) - window.setSize(size[0], height) + window.setContentSize(size[0], height) console.info('window auto resized:', size[0], height) return true From 6fc526ff33165825250936a80ed272005510a091 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 16 Mar 2024 01:50:49 -0300 Subject: [PATCH 18/40] [desktop]: Move @angular/language-service to devDependencies --- desktop/package-lock.json | 6 ++++-- desktop/package.json | 3 +-- desktop/tsconfig.json | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 630425501..e166055a7 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -10,13 +10,11 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@angular/animations": "17.2.3", "@angular/cdk": "17.2.1", "@angular/common": "17.2.3", "@angular/compiler": "17.2.3", "@angular/core": "17.2.3", "@angular/forms": "17.2.3", - "@angular/language-service": "17.2.3", "@angular/platform-browser": "17.2.3", "@angular/platform-browser-dynamic": "17.2.3", "@angular/router": "17.2.3", @@ -42,6 +40,7 @@ "@angular-devkit/build-angular": "17.2.2", "@angular/cli": "17.2.2", "@angular/compiler-cli": "17.2.3", + "@angular/language-service": "17.2.3", "@types/leaflet": "1.9.8", "@types/node": "20.11.24", "@types/uuid": "9.0.8", @@ -420,6 +419,8 @@ "version": "17.2.3", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.3.tgz", "integrity": "sha512-eQcN6hC/dXISEYC/TjRuQJgfdZieBROBlXrS+BxRbsy9T4/QeKxChC3yiNxTmdxl5mvjLKvQTXHR8X0AWc07/Q==", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -578,6 +579,7 @@ "version": "17.2.3", "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.2.3.tgz", "integrity": "sha512-H4LUs2Ftdlk1iqHqC7jRcbHmnNRy53OUlBYNkjRkTsthOI4WqsiSqAp5Frrni3erBqpZ2ik86cbMEyEXcfjRhw==", + "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0" } diff --git a/desktop/package.json b/desktop/package.json index 91d2d23f1..733492d7e 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -29,13 +29,11 @@ "lint": "ng lint" }, "dependencies": { - "@angular/animations": "17.2.3", "@angular/cdk": "17.2.1", "@angular/common": "17.2.3", "@angular/compiler": "17.2.3", "@angular/core": "17.2.3", "@angular/forms": "17.2.3", - "@angular/language-service": "17.2.3", "@angular/platform-browser": "17.2.3", "@angular/platform-browser-dynamic": "17.2.3", "@angular/router": "17.2.3", @@ -61,6 +59,7 @@ "@angular-devkit/build-angular": "17.2.2", "@angular/cli": "17.2.2", "@angular/compiler-cli": "17.2.3", + "@angular/language-service": "17.2.3", "@types/leaflet": "1.9.8", "@types/node": "20.11.24", "@types/uuid": "9.0.8", diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index cb5fa6c16..769bcafb9 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -11,6 +11,7 @@ "experimentalDecorators": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, + "noUncheckedIndexedAccess": false, "allowJs": true, "skipLibCheck": true, "target": "ES2022", From 1d48e7efa6c1601a0a89c85de0f0badfaac9d650 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 18 Mar 2024 20:42:27 -0300 Subject: [PATCH 19/40] [api]: Returns a sorted list of devices --- api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt | 2 +- .../main/kotlin/nebulosa/api/focusers/FocuserController.kt | 2 +- .../main/kotlin/nebulosa/api/guiding/GuideOutputController.kt | 2 +- api/src/main/kotlin/nebulosa/api/mounts/MountController.kt | 2 +- api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt | 2 +- .../src/main/kotlin/nebulosa/indi/device/Device.kt | 4 +++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt index 76b0d6dc5..6f558a993 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt @@ -16,7 +16,7 @@ class CameraController( @GetMapping fun cameras(): List { - return connectionService.cameras() + return connectionService.cameras().sorted() } @GetMapping("{camera}") diff --git a/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt b/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt index c412debe7..2e344a369 100644 --- a/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt +++ b/api/src/main/kotlin/nebulosa/api/focusers/FocuserController.kt @@ -16,7 +16,7 @@ class FocuserController( @GetMapping fun focusers(): List { - return connectionService.focusers() + return connectionService.focusers().sorted() } @GetMapping("{focuser}") diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt index 0899829ae..e7f790faa 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputController.kt @@ -18,7 +18,7 @@ class GuideOutputController( @GetMapping fun guideOutputs(): List { - return connectionService.guideOutputs() + return connectionService.guideOutputs().sorted() } @GetMapping("{guideOutput}") diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt index 9b448aa0b..c3d8d1d67 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt @@ -28,7 +28,7 @@ class MountController( @GetMapping fun mounts(): List { - return connectionService.mounts() + return connectionService.mounts().sorted() } @GetMapping("{mount}") diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt index 4be8c9184..417204e75 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelController.kt @@ -17,7 +17,7 @@ class WheelController( @GetMapping fun wheels(): List { - return connectionService.wheels() + return connectionService.wheels().sorted() } @GetMapping("{wheel}") diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt index 2e575b3cf..c936a63ab 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt @@ -4,7 +4,7 @@ import nebulosa.indi.protocol.* import nebulosa.indi.protocol.parser.INDIProtocolHandler import java.io.Closeable -interface Device : INDIProtocolHandler, Closeable { +interface Device : INDIProtocolHandler, Closeable, Comparable { val sender: MessageSender @@ -114,4 +114,6 @@ interface Device : INDIProtocolHandler, Closeable { sendMessageToServer(vector) } + + override fun compareTo(other: Device) = name.compareTo(other.name) } From a2698822cc6f01d7d0e18dfd46802fc4626f0537 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 18 Mar 2024 23:18:29 -0300 Subject: [PATCH 20/40] [desktop]: Use button instead of dropdown to display a list of devices --- desktop/alignment.png | Bin 23242 -> 24012 bytes desktop/flat-wizard.png | Bin 20931 -> 21942 bytes desktop/sequencer.png | Bin 44854 -> 64819 bytes .../app/alignment/alignment.component.html | 28 +++-------- desktop/src/app/app.module.ts | 2 + .../flat-wizard/flat-wizard.component.html | 17 ++----- desktop/src/app/guider/guider.component.html | 9 +--- desktop/src/app/home/home.component.html | 4 +- desktop/src/app/home/home.component.ts | 26 +++++++--- .../app/sequencer/sequencer.component.html | 27 ++--------- .../device-list-button.component.html | 15 ++++++ .../device-list-button.component.scss | 0 .../device-list-button.component.ts | 45 ++++++++++++++++++ .../device-list-menu.component.ts | 4 +- .../shared/services/browser-window.service.ts | 2 +- desktop/src/styles.scss | 8 +++- 16 files changed, 109 insertions(+), 78 deletions(-) create mode 100644 desktop/src/shared/components/device-list-button/device-list-button.component.html create mode 100644 desktop/src/shared/components/device-list-button/device-list-button.component.scss create mode 100644 desktop/src/shared/components/device-list-button/device-list-button.component.ts diff --git a/desktop/alignment.png b/desktop/alignment.png index 02e17291f180c1c8d2acef5027996530cc12b17b..49564e86406f2c26bc0bd1acde0a2884ad3b5ffc 100644 GIT binary patch literal 24012 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 literal 23242 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�D}`jwg=n(s1!!U$8UEKz3Uq&6a#Bam+|-a zpjUns7rz1P5MZs&b%wtlEQN%L8l@b9@I4HWBy_EU+yRJCh-zl5mH$jxR@rkBfWL(F z;u4=EH8t@7a|enMfzP07T3geC&}+?!`~T|X%A=v&`}j~OL?cO)v5e)4dqdVNWf@x` zN=SB+J29ke$r5FhU8Myv)E(JX$U62VcWACOwy}mA*VyGYHQw*sbKZa6&U@c`-gD** z#&e!$&htFK?`NHXer`;8xpK-;Q>^o2S{XG_Tn_~{xS5%mzPGoW(~*bacwx8zz-j24 zeyD#fbm`91Ze`T?PZH_+>!b3CjZA)s~-Z4-Brlgl>GZ zbHU&$Bvxz#37i|ha}$9>FE7F(_jx5|1FmriO2RMqt^1fZ6KJ!~@QBi<30g|PzxMu8l8PP+l=)C{f#zKYdO%u1ffwxf0CGl7 zP6}*kM6{l`$s?|R{`^4&MMVf9?@Ua%0gWCF8INFGK7nQZ0sLN69VZO73Iw0l&d!tt zRbl1&>#9wr5)ro`Bl858v!I}$>2g^EH^S`nX+qCT3rGe8qP@MHE%7lJOgR(^VE#|_ zD3R9(?SRirO-+@9ZdOxQpWL9i5{7&`AogBnF_+-&xB)}ig0fzHO#&7j_~|#uPGf^pegj!j~~QHtiYP7Hn^9THmRbgLd_n|`Fxo5 z(p_ra^2F)$H#Wc8)K@Uhr_ka#AD>9vLEeMP>phwEdas@lbCN>-CAW4{fweMC8+;RX z*jw-0-S9%kJpDPr>82vh9ecy>IihcIZEwnH_(yU1!^E=7Fho%`ELKK1HZDH?mdCrj z$TVwy6b2)7*T4viHB|Y}jlGJ-iml}xN;2Z*5x^|W(q%@lkuSxl&{Qh0Rfyw9+8|Py zdd^iZvhKvomv?Q99T`Ewp}0iI+IeuWTJ-;W;P2k$OG^2Wjb}$9+0EeLk;ii#kXFy4xtaaw`hhSDAAEBWn>K_c5SZD6R;PY0>NTCMbODtrrLHR^noj}>DgdTZL9?{3 zaPHs{xYg~o>JS3GW6-tOGM9$btgJ*Z1y^eKAcOe8hPf$Y4!C?1b`{ozh!j#=yfXj( zu*Fl|gD}PbqIf_bsJOT6yaAydly8@!7m7A{C670pIB{2>&IH(JnF2$|;gcWdOkTlF7qoG$C56)TIh znMhk`aL&k0lQB=GzK z>A6rH9Y5!ER)){`+O^kwi1~$u2>OBfJlK8F z)ArkHHM&9PBI4;M9-N%Xe;Von1KTh7AAmMVyKF29R)$}e0f+Qd^_3`G_#j)hd?l`?eSKs+o1s9$e69Rw* z`trFCR%-}7$ey4y2t|Rl&5NtN+aG{vB8=W=r zn2usZ!@ll?%>_&~4F&tP&IC5&D%|^cj+O7?f6^Gi#3(2fQpz9&3-&iH8Zdle+v29& z^`RO*Ah45*tGh}sZ^V5!YE|1jeVMYk6relD@BP&t6W1YFo4=XC&G%)y-)%j4mr=_) z!Hr*Ca<1P<>y3^C0)BV1I3re7I-GQBt_<^qCI73dDmtmsyMDE8B>vlC!|zm`wutq$ z)%%(&o8#Mu92*{KIv>L$HAMN9Gbs>Rf;Z%Y#|JAd^pgaE@xr3V;c&UO3P^Erfov-DT`N52Q`s%LbeU$4ifgqg*y>hk)av8;qROpP^PPkBy8DuX zEEn;b7g^GSuT*%Jp7|L!6ETVAcUzy`UkTk3+)gA2nNHnlCmT@(FNOxRSQoQA4i}3k zHZsXkZ$>&z$1#ct({$qj~d)zQfg|# zaGydJbh~v@AEw6W!pZbog@p=EG=|1erG zeeMcTNH3hAPh9T{ROF83P*+!HEF1++t_-)xV++O%oJYqJ5xIN2;Y^$4BkhXzOG!zU zJC+30IF(c_1l9mHz$aCPovdUIh*MKfum7=S( z0ZWPqF($=NQ(c`1-mtDVW>QOHPtb7kT2w>+Mo1}>mz<-?p`CAMo$^sLV%g*KXOsL2 z`eNkICpieMRN2|+)FCtRKi75V1s?sC*XHM;cT$WY=*twN1n*|bC5=Sw-9d*|PzzIbl%#E$ErG{=X{{n5q B?LzF#cjZkTJo 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 F0sum>ofH57 diff --git a/desktop/sequencer.png b/desktop/sequencer.png index c9a022abe14a47ecf943b6f4c73fe7215bc70230..a3926c5839550cc86e29672b1b627b257788fd2e 100644 GIT binary patch literal 64819 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 ADgXcg literal 44854 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 diff --git a/desktop/src/app/alignment/alignment.component.html b/desktop/src/app/alignment/alignment.component.html index 08c56d023..8df3eff29 100644 --- a/desktop/src/app/alignment/alignment.component.html +++ b/desktop/src/app/alignment/alignment.component.html @@ -1,35 +1,21 @@

-
- - - - +
+ -
-
- - - - + @if (tab === 0) { + -
-
- - - - + } @else { + + }
diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index 93db2828d..423d76b89 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -40,6 +40,7 @@ import { TieredMenuModule } from 'primeng/tieredmenu' import { ToastModule } from 'primeng/toast' import { TooltipModule } from 'primeng/tooltip' import { CameraExposureComponent } from '../shared/components/camera-exposure/camera-exposure.component' +import { DeviceListButtonComponent } from '../shared/components/device-list-button/device-list-button.component' import { DeviceListMenuComponent } from '../shared/components/device-list-menu/device-list-menu.component' import { DialogMenuComponent } from '../shared/components/dialog-menu/dialog-menu.component' import { HistogramComponent } from '../shared/components/histogram/histogram.component' @@ -89,6 +90,7 @@ import { SettingsComponent } from './settings/settings.component' CalibrationComponent, CameraComponent, CameraExposureComponent, + DeviceListButtonComponent, DeviceListMenuComponent, DialogMenuComponent, EnumPipe, diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.html b/desktop/src/app/flat-wizard/flat-wizard.component.html index 0b82d55d5..817820416 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.html +++ b/desktop/src/app/flat-wizard/flat-wizard.component.html @@ -1,19 +1,10 @@
-
- - - - +
+ -
-
- - - - + + -
- - - - - +
+ Connection - - + +
diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index 5da43e10d..04279e459 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -123,13 +123,13 @@ export class HomeComponent implements AfterContentInit, OnDestroy { ) { this.electron.on(`${type}.ATTACHED`, event => { this.ngZone.run(() => { - onAdd(event.device as any) + onAdd(event.device as never) }) }) this.electron.on(`${type}.DETACHED`, event => { this.ngZone.run(() => { - onRemove(event.device as any) + onRemove(event.device as never) }) }) } @@ -211,7 +211,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { async ngAfterContentInit() { await this.updateConnection() - if (this.connection?.connected) { + if (this.connected) { this.cameras = await this.api.cameras() this.mounts = await this.api.mounts() this.focusers = await this.api.focusers() @@ -220,7 +220,9 @@ export class HomeComponent implements AfterContentInit, OnDestroy { } @HostListener('window:unload') - ngOnDestroy() { } + ngOnDestroy() { + this.disconnect() + } addConnection() { this.newConnection = [structuredClone(EMPTY_CONNECTION_DETAILS), undefined] @@ -269,15 +271,25 @@ export class HomeComponent implements AfterContentInit, OnDestroy { async connect() { try { - if (this.connection && this.connection.connected) { - await this.api.disconnect(this.connection.id!) - } else if (this.connection) { + if (this.connection && !this.connection.connected) { this.connection.id = await this.api.connect(this.connection.host, this.connection.port, this.connection.type) } } catch (e) { console.error(e) this.message.add({ severity: 'error', detail: 'Connection failed' }) + } finally { + await this.updateConnection() + } + } + + async disconnect() { + try { + if (this.connection && this.connection.connected) { + await this.api.disconnect(this.connection.id!) + } + } catch (e) { + console.error(e) } finally { this.updateConnection() } diff --git a/desktop/src/app/sequencer/sequencer.component.html b/desktop/src/app/sequencer/sequencer.component.html index 0819149cd..60950253d 100644 --- a/desktop/src/app/sequencer/sequencer.component.html +++ b/desktop/src/app/sequencer/sequencer.component.html @@ -134,29 +134,10 @@
-
- - - - -
-
- - - - -
-
- - - - +
+ + +
diff --git a/desktop/src/shared/components/device-list-button/device-list-button.component.html b/desktop/src/shared/components/device-list-button/device-list-button.component.html new file mode 100644 index 000000000..dfa81f6b4 --- /dev/null +++ b/desktop/src/shared/components/device-list-button/device-list-button.component.html @@ -0,0 +1,15 @@ + +
+ +
+ {{ title }} + @if (device && device.id) { + {{ device.name }} + } @else { + {{noDeviceMessage || 'Choose a device' }} + } +
+
+
+ + \ No newline at end of file diff --git a/desktop/src/shared/components/device-list-button/device-list-button.component.scss b/desktop/src/shared/components/device-list-button/device-list-button.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/desktop/src/shared/components/device-list-button/device-list-button.component.ts b/desktop/src/shared/components/device-list-button/device-list-button.component.ts new file mode 100644 index 000000000..1b5eb96ef --- /dev/null +++ b/desktop/src/shared/components/device-list-button/device-list-button.component.ts @@ -0,0 +1,45 @@ +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core' +import { Device } from '../../types/device.types' +import { DeviceListMenuComponent } from '../device-list-menu/device-list-menu.component' + +@Component({ + selector: 'neb-device-list-button', + templateUrl: './device-list-button.component.html', + styleUrls: ['./device-list-button.component.scss'], +}) +export class DeviceListButtonComponent { + + @Input({ required: true }) + readonly title!: string + + @Input() + readonly noDeviceMessage?: string + + @Input({ required: true }) + readonly icon!: string + + @Input({ required: true }) + readonly devices!: Device[] + + @Input() + device?: Device + + @Output() + readonly deviceChange = new EventEmitter() + + @ViewChild('deviceMenu') + private readonly deviceMenu!: DeviceListMenuComponent + + async show() { + const device = await this.deviceMenu.show(this.devices) + + if (device) { + this.device = device + this.deviceChange.emit(device) + } + } + + hide() { + this.deviceMenu.hide() + } +} \ No newline at end of file diff --git a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts index c9a973ec0..b854775fe 100644 --- a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts +++ b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts @@ -19,7 +19,7 @@ export class DeviceListMenuComponent { readonly modelAtFirst: boolean = true @Input() - readonly disableIfNotConnected: boolean = true + readonly disableIfDeviceIsNotConnected: boolean = true @ViewChild('menu') private readonly menu!: DialogMenuComponent @@ -52,7 +52,7 @@ export class DeviceListMenuComponent { model.push({ icon: 'mdi mdi-connection', label: device.name, - disabled: this.disableIfNotConnected && !device.connected, + disabled: this.disableIfDeviceIsNotConnected && !device.connected, command: () => { resolve(device) }, diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index a4d2490bc..40cf0bc35 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -99,7 +99,7 @@ export class BrowserWindowService { } openFlatWizard(options: OpenWindowOptions = {}) { - Object.assign(options, { icon: 'star', width: 410, height: 326 }) + Object.assign(options, { icon: 'star', width: 410, height: 331 }) this.openWindow({ ...options, id: 'flat-wizard', path: 'flat-wizard', data: undefined }) } diff --git a/desktop/src/styles.scss b/desktop/src/styles.scss index b960c8ae2..72f564196 100644 --- a/desktop/src/styles.scss +++ b/desktop/src/styles.scss @@ -133,8 +133,12 @@ p-dropdown, border: 1px solid rgba(255, 255, 255, 0) !important; } -.p-button.p-button-icon-only { - min-width: fit-content; +.p-button { + white-space: nowrap; + + &.p-button-icon-only { + min-width: fit-content; + } } p-calendar.border-0 .p-calendar-w-btn { From 5f8dba29da119ca351f3b687afb8879d6473af17 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 18 Mar 2024 23:19:06 -0300 Subject: [PATCH 21/40] [api][desktop]: Add endpoint to snoop devices for Camera --- .../nebulosa/api/cameras/CameraController.kt | 13 +++++++ .../nebulosa/api/cameras/CameraService.kt | 5 +++ desktop/src/shared/services/api.service.ts | 6 +++ .../nebulosa/indi/client/device/INDIDevice.kt | 39 +++++++++---------- .../indi/client/device/cameras/INDICamera.kt | 2 + .../client/device/focusers/INDIFocuser.kt | 2 + .../indi/client/device/mounts/INDIMount.kt | 2 + .../client/device/wheels/INDIFilterWheel.kt | 2 + 8 files changed, 51 insertions(+), 20 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt index 6f558a993..7b283dcf5 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraController.kt @@ -4,6 +4,9 @@ import jakarta.validation.Valid import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.connection.ConnectionService import nebulosa.indi.device.camera.Camera +import nebulosa.indi.device.filterwheel.FilterWheel +import nebulosa.indi.device.focuser.Focuser +import nebulosa.indi.device.mount.Mount import org.hibernate.validator.constraints.Range import org.springframework.web.bind.annotation.* @@ -34,6 +37,16 @@ class CameraController( cameraService.disconnect(camera) } + @PutMapping("{camera}/snoop") + fun snoop( + @DeviceOrEntityParam camera: Camera, + @DeviceOrEntityParam(required = false) mount: Mount?, + @DeviceOrEntityParam(required = false) wheel: FilterWheel?, + @DeviceOrEntityParam(required = false) focuser: Focuser?, + ) { + cameraService.snoop(camera, mount, wheel, focuser) + } + @PutMapping("{camera}/cooler") fun cooler( @DeviceOrEntityParam camera: Camera, diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraService.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraService.kt index 987940b1a..b400834f7 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraService.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraService.kt @@ -1,5 +1,6 @@ package nebulosa.api.cameras +import nebulosa.indi.device.Device import nebulosa.indi.device.camera.Camera import org.springframework.stereotype.Service import java.nio.file.Path @@ -20,6 +21,10 @@ class CameraService( camera.disconnect() } + fun snoop(camera: Camera, vararg devices: Device?) { + camera.snoop(devices.toList()) + } + fun setpointTemperature(camera: Camera, temperature: Double) { camera.temperature(temperature) } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index bcf4c4b57..3898b17e4 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -67,6 +67,12 @@ export class ApiService { return this.http.get(`cameras/${camera.name}/capturing`) } + // TODO: Rotator + cameraSnoop(camera: Camera, mount?: Mount, wheel?: FilterWheel, focuser?: Focuser) { + const query = this.http.query({ mount: mount?.name, wheel: wheel?.name, focuser: focuser?.name }) + return this.http.put(`cameras/${camera.name}/snoop?${query}`) + } + cameraCooler(camera: Camera, enabled: boolean) { return this.http.put(`cameras/${camera.name}/cooler?enabled=${enabled}`) } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt index 7f37048fc..d0aacfe6e 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt @@ -4,10 +4,8 @@ import nebulosa.indi.client.INDIClient import nebulosa.indi.client.device.cameras.INDICamera import nebulosa.indi.device.* import nebulosa.indi.device.camera.Camera -import nebulosa.indi.device.dome.Dome import nebulosa.indi.device.filterwheel.FilterWheel import nebulosa.indi.device.focuser.Focuser -import nebulosa.indi.device.gps.GPS import nebulosa.indi.device.mount.Mount import nebulosa.indi.device.rotator.Rotator import nebulosa.indi.protocol.* @@ -185,24 +183,25 @@ internal abstract class INDIDevice : Device { } override fun snoop(devices: Iterable) { - val message = devices.mapNotNull { - when (it) { - is Camera -> "ACTIVE_CCD" - is Mount -> "ACTIVE_TELESCOPE" - is Focuser -> "ACTIVE_FOCUSER" - is FilterWheel -> "ACTIVE_FILTER" - is Rotator -> "ACTIVE_ROTATOR" - is Dome -> "ACTIVE_DOME" - is GPS -> "ACTIVE_GPS" - else -> return@mapNotNull null - } to it.name - } - - // TODO:ACTIVE_SKYQUALITY, ACTIVE_WEATHER - - LOG.info("$name is snooping the devices: $message") - - sendNewText("ACTIVE_DEVICES", message) + val ccd = devices.firstOrNull { it is Camera }?.name ?: "" + val telescope = devices.firstOrNull { it is Mount }?.name ?: "" + val focuser = devices.firstOrNull { it is Focuser }?.name ?: "" + val filter = devices.firstOrNull { it is FilterWheel }?.name ?: "" + val rotator = devices.firstOrNull { it is Rotator }?.name ?: "" + + LOG.info( + "$name is snooping devices. ccd={}, telescope={}, focuser={}, filter={}, rotator={}", + ccd, telescope, focuser, filter, rotator + ) + + sendNewText( + "ACTIVE_DEVICES", + "ACTIVE_CCD" to ccd, + "ACTIVE_TELESCOPE" to telescope, + "ACTIVE_ROTATOR" to rotator, + "ACTIVE_FOCUSER" to focuser, + "ACTIVE_FILTER" to filter, + ) } override fun connect() { diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt index d3b5620a4..30cafe4b6 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt @@ -11,6 +11,8 @@ import nebulosa.io.Base64InputStream import nebulosa.log.loggerFor import java.time.Duration +// https://github.com/indilib/indi/blob/master/libs/indibase/indiccd.cpp + internal open class INDICamera( override val sender: INDIClient, override val name: String, diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt index 3dfa9d22e..c3f85c2b9 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt @@ -8,6 +8,8 @@ import nebulosa.indi.device.thermometer.ThermometerAttached import nebulosa.indi.device.thermometer.ThermometerDetached import nebulosa.indi.protocol.* +// https://github.com/indilib/indi/blob/master/libs/indibase/indifocuser.cpp + internal open class INDIFocuser( override val sender: INDIClient, override val name: String, diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt index 84fe447bf..630f44325 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt @@ -15,6 +15,8 @@ import java.time.Duration import java.time.OffsetDateTime import java.time.ZoneOffset +// https://github.com/indilib/indi/blob/master/libs/indibase/inditelescope.cpp + internal open class INDIMount( override val sender: INDIClient, override val name: String, diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt index cb0cd3658..bd95e4c43 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt @@ -5,6 +5,8 @@ import nebulosa.indi.client.device.INDIDevice import nebulosa.indi.device.filterwheel.* import nebulosa.indi.protocol.* +// https://github.com/indilib/indi/blob/master/libs/indibase/indifilterwheel.cpp + internal open class INDIFilterWheel( override val sender: INDIClient, override val name: String, From b153eaea2cedc1f664c054398c5f062de726bcc4 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 00:46:12 -0300 Subject: [PATCH 22/40] [api][desktop]: Send snoop devices when camera start capture --- desktop/camera.png | Bin 38958 -> 42031 bytes desktop/src/app/camera/camera.component.html | 14 ++- desktop/src/app/camera/camera.component.ts | 107 +++++++++++++++++- .../src/shared/services/preference.service.ts | 7 +- desktop/src/shared/types/home.types.ts | 13 +++ .../nebulosa/indi/client/device/INDIDevice.kt | 15 ++- 6 files changed, 145 insertions(+), 11 deletions(-) diff --git a/desktop/camera.png b/desktop/camera.png index dda83d68ee9117f2ace53297a67370882a75ffd1..c0d16bdb5a808b1d286f2e79bc13521f3ba0559a 100644 GIT binary patch literal 42031 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 diff --git a/desktop/src/app/camera/camera.component.html b/desktop/src/app/camera/camera.component.html index 5edb6afc9..e5d94e013 100644 --- a/desktop/src/app/camera/camera.component.html +++ b/desktop/src/app/camera/camera.component.html @@ -199,7 +199,19 @@
-
+
+
+ + {{ equipment.mount?.name }} + + + {{ equipment.wheel?.name }} + + + {{ equipment.focuser?.name }} + +
diff --git a/desktop/src/app/camera/camera.component.ts b/desktop/src/app/camera/camera.component.ts index 8ffcdb140..df728c345 100644 --- a/desktop/src/app/camera/camera.component.ts +++ b/desktop/src/app/camera/camera.component.ts @@ -7,6 +7,9 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { Camera, CameraDialogInput, CameraDialogMode, CameraPreference, CameraStartCapture, EMPTY_CAMERA, EMPTY_CAMERA_START_CAPTURE, ExposureMode, ExposureTimeUnit, FrameType, updateCameraStartCaptureFromCamera } from '../../shared/types/camera.types' +import { Focuser } from '../../shared/types/focuser.types' +import { Equipment } from '../../shared/types/home.types' +import { Mount } from '../../shared/types/mount.types' import { FilterWheel } from '../../shared/types/wheel.types' import { AppComponent } from '../app.component' @@ -18,6 +21,7 @@ import { AppComponent } from '../app.component' export class CameraComponent implements AfterContentInit, OnDestroy { readonly camera = structuredClone(EMPTY_CAMERA) + equipment: Equipment = {} savePath = '' capturesPath = '' @@ -75,6 +79,27 @@ export class CameraComponent implements AfterContentInit, OnDestroy { this.showDitherDialog = true }, }, + { + icon: 'mdi mdi-connection', + label: 'Snoop Devices', + items: [ + { + icon: 'mdi mdi-telescope', + label: 'Mount', + items: [], + }, + { + icon: 'mdi mdi-palette', + label: 'Filter Wheel', + items: [], + }, + { + icon: 'mdi mdi-image-filter-center-focus', + label: 'Focuser', + items: [], + }, + ] + }, ] hasDewHeater = false @@ -160,6 +185,8 @@ export class CameraComponent implements AfterContentInit, OnDestroy { }) } }) + + this.cameraModel[1].visible = !app.modal } async ngAfterContentInit() { @@ -172,6 +199,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy { this.cameraChanged(decodedData) } }) + + if (!this.app.modal) { + this.loadEquipment() + } } @HostListener('window:unload') @@ -222,6 +253,76 @@ export class CameraComponent implements AfterContentInit, OnDestroy { } } + private async loadEquipment() { + const makeMountItem = (mount?: Mount) => { + return { + icon: mount ? 'mdi mdi-connection' : 'mdi mdi-close', + label: mount?.name ?? 'None', + command: () => { + this.equipment.mount = mount + this.preference.equipmentForDevice(this.camera).set(this.equipment) + this.electron.autoResizeWindow() + }, + } + } + + const mounts = await this.api.mounts() + + this.cameraModel[1].items![0].items!.push(makeMountItem()) + + for (const mount of mounts) { + this.cameraModel[1].items![0].items!.push(makeMountItem(mount)) + } + + this.equipment.mount = mounts.find(e => e.name === this.equipment.mount?.name) + + const makeWheelItem = (wheel?: FilterWheel) => { + return { + icon: wheel ? 'mdi mdi-connection' : 'mdi mdi-close', + label: wheel?.name ?? 'None', + command: () => { + this.equipment.wheel = wheel + this.preference.equipmentForDevice(this.camera).set(this.equipment) + this.electron.autoResizeWindow() + }, + } + } + + const wheels = await this.api.wheels() + + this.cameraModel[1].items![1].items!.push(makeWheelItem()) + + for (const wheel of wheels) { + this.cameraModel[1].items![1].items!.push(makeWheelItem(wheel)) + } + + this.equipment.wheel = wheels.find(e => e.name === this.equipment.wheel?.name) + + const makeFocuserItem = (focuser?: Focuser) => { + return { + icon: focuser ? 'mdi mdi-connection' : 'mdi mdi-close', + label: focuser?.name ?? 'None', + command: () => { + this.equipment.focuser = focuser + this.preference.equipmentForDevice(this.camera).set(this.equipment) + this.electron.autoResizeWindow() + }, + } + } + + const focusers = await this.api.focusers() + + this.cameraModel[1].items![2].items!.push(makeFocuserItem()) + + for (const focuser of focusers) { + this.cameraModel[1].items![2].items!.push(makeFocuserItem(focuser)) + } + + this.equipment.focuser = focusers.find(e => e.name === this.equipment.focuser?.name) + + this.electron.autoResizeWindow() + } + connect() { if (this.camera.connected) { this.api.cameraDisconnect(this.camera) @@ -305,7 +406,9 @@ export class CameraComponent implements AfterContentInit, OnDestroy { async startCapture() { await this.openCameraImage() - this.api.cameraStartCapture(this.camera, this.makeCameraStartCapture()) + await this.api.cameraSnoop(this.camera, this.equipment.mount, this.equipment.wheel, this.equipment.focuser) + await this.api.cameraStartCapture(this.camera, this.makeCameraStartCapture()) + this.preference.equipmentForDevice(this.camera).set(this.equipment) } abortCapture() { @@ -410,6 +513,8 @@ export class CameraComponent implements AfterContentInit, OnDestroy { this.request.dither!.raOnly = preference.dither?.raOnly ?? false this.request.dither!.amount = preference.dither?.amount ?? 1.5 this.request.dither!.afterExposures = preference.dither?.afterExposures ?? 1 + + this.equipment = this.preference.equipmentForDevice(this.camera).get() } } diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index f96c721f9..666a9ad08 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -3,7 +3,8 @@ import { SkyAtlasPreference } from '../../app/atlas/atlas.component' import { AlignmentPreference, EMPTY_ALIGNMENT_PREFERENCE } from '../types/alignment.types' import { EMPTY_LOCATION, Location } from '../types/atlas.types' import { Camera, CameraPreference, CameraStartCapture, EMPTY_CAMERA_PREFERENCE } from '../types/camera.types' -import { ConnectionDetails } from '../types/home.types' +import { Device } from '../types/device.types' +import { ConnectionDetails, Equipment } from '../types/home.types' import { EMPTY_IMAGE_PREFERENCE, FOV, ImagePreference } from '../types/image.types' import { EMPTY_PLATE_SOLVER_OPTIONS, PlateSolverOptions, PlateSolverType } from '../types/settings.types' import { FilterWheel, WheelPreference } from '../types/wheel.types' @@ -63,6 +64,10 @@ export class PreferenceService { return new PreferenceData(this.storage, `settings.plateSolver.${type}`, () => { ...EMPTY_PLATE_SOLVER_OPTIONS, type }) } + equipmentForDevice(device: Device) { + return new PreferenceData(this.storage, `equipment.${device.name}`, () => {}) + } + readonly locations = new PreferenceData(this.storage, 'locations', () => [structuredClone(EMPTY_LOCATION)]) readonly selectedLocation = new PreferenceData(this.storage, 'locations.selected', () => structuredClone(EMPTY_LOCATION)) readonly imagePreference = new PreferenceData(this.storage, 'image', () => structuredClone(EMPTY_IMAGE_PREFERENCE)) diff --git a/desktop/src/shared/types/home.types.ts b/desktop/src/shared/types/home.types.ts index a85f81787..690178ff7 100644 --- a/desktop/src/shared/types/home.types.ts +++ b/desktop/src/shared/types/home.types.ts @@ -1,3 +1,8 @@ +import { Camera } from './camera.types' +import { Focuser } from './focuser.types' +import { Mount } from './mount.types' +import { FilterWheel } from './wheel.types' + export type HomeWindowType = 'CAMERA' | 'MOUNT' | 'GUIDER' | 'WHEEL' | 'FOCUSER' | 'DOME' | 'ROTATOR' | 'SWITCH' | 'SKY_ATLAS' | 'ALIGNMENT' | 'SEQUENCER' | 'IMAGE' | 'FRAMING' | 'INDI' | 'SETTINGS' | 'CALCULATOR' | 'ABOUT' | 'FLAT_WIZARD' @@ -28,3 +33,11 @@ export const EMPTY_CONNECTION_DETAILS: ConnectionDetails = { export interface ConnectionClosed { id: string } + +export interface Equipment { + camera?: Camera + guider?: Camera + mount?: Mount + focuser?: Focuser + wheel?: FilterWheel +} diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt index d0aacfe6e..d8abf136e 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt @@ -194,14 +194,13 @@ internal abstract class INDIDevice : Device { ccd, telescope, focuser, filter, rotator ) - sendNewText( - "ACTIVE_DEVICES", - "ACTIVE_CCD" to ccd, - "ACTIVE_TELESCOPE" to telescope, - "ACTIVE_ROTATOR" to rotator, - "ACTIVE_FOCUSER" to focuser, - "ACTIVE_FILTER" to filter, - ) + if (this is Camera) { + sendNewText( + "ACTIVE_DEVICES", + "ACTIVE_TELESCOPE" to telescope, "ACTIVE_ROTATOR" to rotator, + "ACTIVE_FOCUSER" to focuser, "ACTIVE_FILTER" to filter, + ) + } } override fun connect() { From 122a44ec6a39255ca9332877396639cab442ab73 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 01:46:58 -0300 Subject: [PATCH 23/40] [desktop]: Save focus offset and sent it when filter change --- desktop/filter-wheel.png | Bin 14262 -> 16176 bytes .../filterwheel/filterwheel.component.html | 26 +++--- .../app/filterwheel/filterwheel.component.ts | 82 ++++++++++++++++-- .../src/shared/services/preference.service.ts | 5 ++ desktop/src/shared/types/wheel.types.ts | 1 - 5 files changed, 97 insertions(+), 17 deletions(-) diff --git a/desktop/filter-wheel.png b/desktop/filter-wheel.png index 0918caf9afccbef0465bc1eb52145e8c5d922a22..9e2bc2e32bd0c13a0b8adf92c4bf058e167bf0ff 100644 GIT binary patch literal 16176 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 diff --git a/desktop/src/app/filterwheel/filterwheel.component.html b/desktop/src/app/filterwheel/filterwheel.component.html index 0c0ab0aee..bebbb37c1 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.html +++ b/desktop/src/app/filterwheel/filterwheel.component.html @@ -20,12 +20,12 @@
+ emptyMessage="No filter found" [autoDisplayFirst]="false" (ngModelChange)="filterChanged()" appendTo="body">
- + {{ filter?.name }} @@ -35,7 +35,7 @@
- + {{ item.name }} @@ -51,24 +51,28 @@
-
+
-
+
+ +
+
+ + - +
-
- -
diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index c68cb6d34..9e749ff22 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -7,6 +7,7 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { CameraStartCapture, EMPTY_CAMERA_START_CAPTURE } from '../../shared/types/camera.types' +import { Focuser } from '../../shared/types/focuser.types' import { EMPTY_WHEEL, FilterSlot, FilterWheel, WheelDialogInput, WheelDialogMode, WheelPreference } from '../../shared/types/wheel.types' import { AppComponent } from '../app.component' @@ -20,6 +21,12 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { readonly wheel = structuredClone(EMPTY_WHEEL) readonly request = structuredClone(EMPTY_CAMERA_START_CAPTURE) + focusers: Focuser[] = [] + focuser?: Focuser + focusOffset = 0 + focusOffsetMin = 0 + focusOffsetMax = 0 + moving = false position = 0 filters: FilterSlot[] = [] @@ -68,7 +75,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { this.update() if (wasConnected !== event.device.connected) { - electron.autoResizeWindow() + electron.autoResizeWindow(1000) } }) } @@ -82,6 +89,29 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { } }) + electron.on('FOCUSER.UPDATED', event => { + if (event.device.id === this.focuser?.id) { + ngZone.run(() => { + Object.assign(this.focuser!, event.device) + }) + } + }) + + electron.on('FOCUSER.DETACHED', event => { + if (event.device.id === this.focuser?.id) { + ngZone.run(() => { + this.focuser = undefined + this.updateFocusOffset() + + const index = this.focusers.findIndex(e => e.id === event.device.id) + + if (index >= 0) { + this.focusers.splice(index, 1) + } + }) + } + }) + this.subscription = this.filterChangedPublisher .pipe(debounceTime(1500)) .subscribe((filter) => { @@ -103,6 +133,13 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { this.wheelChanged(decodedData) } }) + + this.focusers = await this.api.focusers() + + if (this.focusers.length === 1) { + this.focuser = this.focusers[0] + this.focuserChanged() + } } @HostListener('window:unload') @@ -117,6 +154,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { this.loadPreference() this.update() + this.electron.autoResizeWindow() } if (this.app) { @@ -132,9 +170,23 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { } } + filterChanged() { + this.updateFocusOffset() + } + async moveTo(filter: FilterSlot) { - await this.api.wheelMoveTo(this.wheel, filter.position) - this.moving = true + try { + this.moving = true + + await this.api.wheelMoveTo(this.wheel, filter.position) + + if (this.focuser && this.focuser?.connected && this.focusOffset !== 0) { + if (this.focusOffset < 0) this.api.focuserMoveIn(this.focuser, this.focusOffset) + else this.api.focuserMoveOut(this.focuser, this.focusOffset) + } + } catch { + this.moving = false + } } shutterToggled(filter: FilterSlot, event: CheckboxChangeEvent) { @@ -148,8 +200,26 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { } } - focusOffsetChanged(filter: FilterSlot) { - this.filterChangedPublisher.next(structuredClone(filter)) + focuserChanged() { + this.focusOffsetMax = this.focuser?.maxPosition ?? 0 + this.focusOffsetMin = -this.focusOffsetMax + this.updateFocusOffset() + } + + focusOffsetForFilter(filter: FilterSlot) { + return this.focuser ? this.preference.focusOffset(this.wheel, this.focuser, filter.position).get() : 0 + } + + private updateFocusOffset() { + if (this.filter) { + this.focusOffset = this.focuser ? this.preference.focusOffset(this.wheel, this.focuser, this.filter.position).get() : 0 + } + } + + focusOffsetChanged() { + if (this.filter && this.focuser) { + this.preference.focusOffset(this.wheel, this.focuser, this.filter.position).set(this.focusOffset) + } } private update() { @@ -187,6 +257,8 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { this.filters = filters this.filter = filters[this.position - 1] ?? filters[0] + + this.updateFocusOffset() } private loadPreference() { diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index 666a9ad08..72606f75f 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -4,6 +4,7 @@ import { AlignmentPreference, EMPTY_ALIGNMENT_PREFERENCE } from '../types/alignm import { EMPTY_LOCATION, Location } from '../types/atlas.types' import { Camera, CameraPreference, CameraStartCapture, EMPTY_CAMERA_PREFERENCE } from '../types/camera.types' import { Device } from '../types/device.types' +import { Focuser } from '../types/focuser.types' import { ConnectionDetails, Equipment } from '../types/home.types' import { EMPTY_IMAGE_PREFERENCE, FOV, ImagePreference } from '../types/image.types' import { EMPTY_PLATE_SOLVER_OPTIONS, PlateSolverOptions, PlateSolverType } from '../types/settings.types' @@ -68,6 +69,10 @@ export class PreferenceService { return new PreferenceData(this.storage, `equipment.${device.name}`, () => {}) } + focusOffset(wheel: FilterWheel, focuser: Focuser, position: number) { + return new PreferenceData(this.storage, `focusOffset.${wheel.name}.${position}.${focuser.name}`, () => 0) + } + readonly locations = new PreferenceData(this.storage, 'locations', () => [structuredClone(EMPTY_LOCATION)]) readonly selectedLocation = new PreferenceData(this.storage, 'locations.selected', () => structuredClone(EMPTY_LOCATION)) readonly imagePreference = new PreferenceData(this.storage, 'image', () => structuredClone(EMPTY_IMAGE_PREFERENCE)) diff --git a/desktop/src/shared/types/wheel.types.ts b/desktop/src/shared/types/wheel.types.ts index 141bdf170..00e2f2ec2 100644 --- a/desktop/src/shared/types/wheel.types.ts +++ b/desktop/src/shared/types/wheel.types.ts @@ -37,5 +37,4 @@ export interface FilterSlot { position: number name: string dark: boolean - offset: number } From b59b129483da543d309c161a011f2bcf9c82ef61 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 10:46:06 -0300 Subject: [PATCH 24/40] [api][desktop]: Fix retrieve connection status at startup --- .../api/connection/ConnectionService.kt | 6 +++--- .../api/connection/ConnectionStatus.kt | 1 + desktop/src/app/home/home.component.html | 2 +- desktop/src/app/home/home.component.ts | 18 ++++++++++++++++++ desktop/src/shared/types/home.types.ts | 1 + .../client/connection/INDISocketConnection.kt | 19 ++++++++++++++++--- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt b/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt index 2485b2e72..3fc34e50c 100644 --- a/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt +++ b/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt @@ -30,7 +30,7 @@ class ConnectionService( private val messageService: MessageService, ) : Closeable { - private val providers = LinkedHashMap() + private val providers = linkedMapOf() fun connectionStatuses(): List { return providers.keys.map { connectionStatus(it)!! } @@ -41,12 +41,12 @@ class ConnectionService( is INDIClient -> { when (val connection = client.connection) { is INDISocketConnection -> { - return ConnectionStatus(id, ConnectionType.INDI, connection.host, connection.port) + return ConnectionStatus(id, ConnectionType.INDI, connection.remoteHost, connection.remotePort, connection.remoteIP) } } } is AlpacaClient -> { - return ConnectionStatus(id, ConnectionType.INDI, client.host, client.port) + return ConnectionStatus(id, ConnectionType.ALPACA, client.host, client.port) } } diff --git a/api/src/main/kotlin/nebulosa/api/connection/ConnectionStatus.kt b/api/src/main/kotlin/nebulosa/api/connection/ConnectionStatus.kt index 5d3802bc3..2eba3f9ae 100644 --- a/api/src/main/kotlin/nebulosa/api/connection/ConnectionStatus.kt +++ b/api/src/main/kotlin/nebulosa/api/connection/ConnectionStatus.kt @@ -4,4 +4,5 @@ data class ConnectionStatus( val id: String, val type: ConnectionType, val host: String, val port: Int, + val ip: String? = null, ) diff --git a/desktop/src/app/home/home.component.html b/desktop/src/app/home/home.component.html index 7074d23cd..e2d0d059e 100644 --- a/desktop/src/app/home/home.component.html +++ b/desktop/src/app/home/home.component.html @@ -191,4 +191,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index 04279e459..04e3407b2 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -422,6 +422,24 @@ export class HomeComponent implements AfterContentInit, OnDestroy { this.rotators = [] this.switches = [] } + } else { + const statuses = await this.api.connectionStatuses() + + for (const status of statuses) { + for (const connection of this.connections) { + if (!connection.connected && + (status.host === connection.host || status.ip === connection.host) && + status.port === connection.port) { + connection.connected = true + this.connection = connection + break + } + } + + if (this.connection?.connected) { + break + } + } } } } diff --git a/desktop/src/shared/types/home.types.ts b/desktop/src/shared/types/home.types.ts index 690178ff7..a52fb11d9 100644 --- a/desktop/src/shared/types/home.types.ts +++ b/desktop/src/shared/types/home.types.ts @@ -14,6 +14,7 @@ export interface ConnectionDetails { name: string host: string port: number + ip?: string type: ConnectionType connected: boolean connectedAt?: number diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/connection/INDISocketConnection.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/connection/INDISocketConnection.kt index 2098f2a50..70f1fc169 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/connection/INDISocketConnection.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/connection/INDISocketConnection.kt @@ -4,6 +4,7 @@ import nebulosa.indi.client.io.INDIProtocolFactory import nebulosa.indi.protocol.INDIProtocol import nebulosa.indi.protocol.io.INDIConnection import nebulosa.log.loggerFor +import java.net.InetAddress import java.net.InetSocketAddress import java.net.Socket @@ -14,10 +15,22 @@ data class INDISocketConnection(private val socket: Socket) : INDIConnection { socket.connect(InetSocketAddress(host, port), 30000) } - val host: String - get() = socket.localAddress.hostName + val remoteAddress + get() = socket.remoteSocketAddress as InetSocketAddress - val port + val localAddress: InetAddress + get() = socket.localAddress + + val remoteHost: String + get() = remoteAddress.hostName + + val remoteIP: String + get() = remoteAddress.address.hostAddress + + val remotePort + get() = socket.port + + val localPort get() = socket.localPort override val input by lazy { INDIProtocolFactory.createInputStream(socket.getInputStream()) } From 6dfe653a337084785ab0806b6b75e226230476f1 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 10:51:26 -0300 Subject: [PATCH 25/40] [desktop]: Compute focus offset taking account the current filter --- .../app/filterwheel/filterwheel.component.html | 2 +- .../src/app/filterwheel/filterwheel.component.ts | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/desktop/src/app/filterwheel/filterwheel.component.html b/desktop/src/app/filterwheel/filterwheel.component.html index bebbb37c1..a07845795 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.html +++ b/desktop/src/app/filterwheel/filterwheel.component.html @@ -13,7 +13,7 @@
{{ moving ? 'moving' : 'idle' }} - +
diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index 9e749ff22..61d7c1acf 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -50,7 +50,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { return this.mode !== 'CAPTURE' } - get selectedFilter(): FilterSlot | undefined { + get currentFilter(): FilterSlot | undefined { return this.filters[this.position - 1] } @@ -178,11 +178,18 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy { try { this.moving = true + const currentFocusOffset = this.focusOffsetForFilter(this.currentFilter!) + const nextFocusOffset = this.focusOffsetForFilter(filter) + await this.api.wheelMoveTo(this.wheel, filter.position) - if (this.focuser && this.focuser?.connected && this.focusOffset !== 0) { - if (this.focusOffset < 0) this.api.focuserMoveIn(this.focuser, this.focusOffset) - else this.api.focuserMoveOut(this.focuser, this.focusOffset) + const offset = nextFocusOffset - currentFocusOffset + + if (this.focuser && offset !== 0) { + console.info('moving focuser %d steps', offset) + + if (offset < 0) this.api.focuserMoveIn(this.focuser, -offset) + else this.api.focuserMoveOut(this.focuser, offset) } } catch { this.moving = false From b32af06e2be2dbfe30321eb4ccb2473a5187e6a8 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 10:59:47 -0300 Subject: [PATCH 26/40] [desktop]: Improve Focuser layout --- desktop/focuser.png | Bin 13065 -> 12783 bytes .../src/app/focuser/focuser.component.html | 27 +++++++++--------- .../shared/services/browser-window.service.ts | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/desktop/focuser.png b/desktop/focuser.png index 98a5db5531cc8bf9332fd3839c300d1c8b617a12..501293c901a5271cc23f7626ea81b2017aabf874 100644 GIT binary patch literal 12783 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 z
-
- - {{ moving ? 'moving' : 'idle' }} +
+
+ + {{ moving ? 'moving' : 'idle' }} +
+
+ + {{ temperature }}°C +
-
-
+
+
-
- - - - -
-
+
@@ -46,7 +45,7 @@
-
+
diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 40cf0bc35..e2d03831a 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -40,7 +40,7 @@ export class BrowserWindowService { } openFocuser(options: OpenWindowOptionsWithData) { - Object.assign(options, { icon: 'focus', width: 348, height: 202 }) + Object.assign(options, { icon: 'focus', width: 252, height: 252 }) this.openWindow({ ...options, id: `focuser.${options.data.name}`, path: 'focuser' }) } From d8dc8e82897d4fbfba7dde7e256ad183acb043e3 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 11:16:48 -0300 Subject: [PATCH 27/40] [desktop]: Improve connection button --- desktop/camera.png | Bin 42031 -> 41677 bytes desktop/filter-wheel.png | Bin 16176 -> 16871 bytes desktop/focuser.png | Bin 12783 -> 12662 bytes desktop/home.png | Bin 37319 -> 36806 bytes desktop/mount.png | Bin 38784 -> 39088 bytes desktop/src/app/camera/camera.component.html | 4 ++-- .../filterwheel/filterwheel.component.html | 4 ++-- .../src/app/focuser/focuser.component.html | 4 ++-- desktop/src/app/home/home.component.html | 14 ++++++++------ desktop/src/app/mount/mount.component.html | 4 ++-- 10 files changed, 16 insertions(+), 14 deletions(-) diff --git a/desktop/camera.png b/desktop/camera.png index c0d16bdb5a808b1d286f2e79bc13521f3ba0559a..8487d530ddb57e219528f1b13f2ac860057d66c5 100644 GIT binary patch literal 41677 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

4yZ_~fsoS&PkeiTdj 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 z�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 NaNMFA9zW|+w#p3_~ diff --git a/desktop/src/app/camera/camera.component.html b/desktop/src/app/camera/camera.component.html index e5d94e013..95d300c34 100644 --- a/desktop/src/app/camera/camera.component.html +++ b/desktop/src/app/camera/camera.component.html @@ -6,9 +6,9 @@ + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" />

P|mDvCzx+=jF^9PXv`Q&<1S4WeP& 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 x|C@dH{|(aYJG07su92I(mv`P^nM?~U`$ zxcA-r9D|{57HiKn=O17En~=|P5^rANzk)y@Z=@u}6d@2eBJf3m2oGNI$V9gRf4#65 zky1tke>@NkgTept96qW$C|MgjIP2LNK}@WyzZo&w8`v2cS=pOfI~+ZS34x2Ko-Pu# zGtzS~v$i5tHv47-aWJwYW#uLPre{aW#=^!y%F4>e%E`yZT8cPT3W1P9q{KcbyQCg0 zIJ;m@JanC0U7m{|X83;&Cq>)A{qR#VmhNM=G}cR|S2`bxGvUPc-!Ofbti!xf$i{yW zPe=L+&KHv59|Q4?O1CV(zmn*erg-0LEZTZ?As}SzY&@8X)BsK8WjBe)6c5Me@<(fx zilfwqBWrK_C?bKlqKwWbf|wgK{8oe~zCN3tRLoX^E-P9w1w4zF4wudmznyZUQo@Ee zpfau)(NOWEk=hPs6V3R%y1VMDx~G|Uz=@B;fsYf`Da%$dS~iotp+rdGAeQ_~)xy^P zLL^@qtB#>)601rxRES+gQ?TPbU(Cn++>z~Ln=41j<@L{WDlWCRnIqeTs=vFbGRUPl z!Icdu@@4Tyhns$yMU2&_B;x3Nnd6EyakX`BShrsDT1}s6)(cl@jE=eU$J+$Ix9P1QSL>8dap-Df|ABm6Sae8 z+=GQ`0(v6hTt*&K#>AjH{ZT%09$pkbx8p@$H8D46bsZnuI-b~U(@reV#M5bM3;ggD zMh#_~k0u;CED>7iO4?V`kc!r-RSrFvdy@+L+TB!8@JwEa`-j5c-`36;*0k4)`Vr#j zqJrjAMUYzu0gV#6JY){5byS=J#gb|iCNcDA_)kAPEJcbYvH#Jj=$Td(<9^Z@E!&3} zmFC2fhbDQZs8?9Mv6w8{4>)wp_QIKd^HIj^^cx|}HG*g~fzi(cFgnvi=uGD(vCF_!B>%6W~-oJCxz{=Cilk6eHy~BxB*KS%eWkDPh3AL@fajK=kr-^beqvU#|v#FK@hvaXk?y|tfZ zp%FUb9AnZZoq$C32IML4qFM#Pq=VEVd;BjT4!@KpaucX-wGQqQW*XVIsv&Tt?P#`i z@c+1eo8$@Wlr`MI4zLgprjrJX9In3%+Ecu{IJy{m?B=GQiuySlF(O}+^IiATY*oP< zzHJVsFgYK&mx0S&W-IQA|4iliuANo+@+MwdZm1j$jx+0I4+^7qx_HqVz%wknz{%xK zm=lQ`7`I$9+tIdVU<_SqjLo=U{e6FzoHEPWu?Tvc|`#swp z#EKd*B{I`ipIi_262G=63(dj&AFU1s6NhdVszsiyK$&SjFR$-6SO!Mmgu7q03){V! z8^S+S-(9K{PHQ4pf9Sh;ca)D@gH=)M>cKr%V{LMKxge(1e1_x7?}v9>BC$n$QCogX zdZL_j*8Si=X(5~I?J2Gvc?<2&7EfJo?0C(r`#c&Z@l`T>SuzfVnVBfC8}Z$d%1a9l z1e8u6>o0*}mNIKm)nRVlD5AT#!8C@Ry>#(xB;NEFT{G3>@x@2py%vmub-1?vg#oqi zKj(QSD*ArwI=eZ&33Fp`mKlW|a9}gPF_1K14$`7zY|BuBBuIK`HKgEb(_}qN#QxI# zeRi5U(5}2IKOLkO=Ead7taLKZU+q(i_|BlBkN;GHPF_^$g*Uan4I`J0tm!!3{7WSzW3?G2%@S6#9s zLgnDA_9Eh}W}W_Z3G(FIC0st(B*{XA8s5#OlRlwxV)>jZ=Cf|Alg74OG6I*QHu;rs zsjwRecJm@cJ7nJRSC(q-NZ6hmlt2Gsj<@D3d$ilu`0mlYc)965qJzv7>rGm9J4h2< z1bCG0op_o6%j)l(gN5gJs3nzGkeaW79@n%@#h(31k@9G#=D1A-I7iKAhAdxekGy>< zzVLdVSTDv7Mt<<{pwk&}8`)9l`dyK#6QbBP)`l8S2Mu>nF%oCe7^;P@Y04GuJLRS- zD?8l_v;XpUua9ZNeF-}>x$@lq*+dOT&qNUW-m|n#W2m_&+no`1nw>1O{>&R96;eN; zpFJ2mtQ2rbnd%Ls(Z$S$ELZ%xzr%XJZtg=_u}alH9i+?RFW~EjA}OL&tcN;^aT9lC zpYC0MwTBzJpg%VhC)+z=v9~{~7CvAW7AS;Q>Ui^Brb10PD{&WH$Fb5M#v9`5P4SiC zeNDtjT!0Q#ahWd>zV6x9z`#tda?QmF51mWzGa89@&?7ZyL6uA}K?G{EnGf9@% zPf{GQo|@2+xt}N`|0Z`Y%eOXiyYD1fIEzRi-7C`V7i;?09SMtLqDL%2ZEN(~E)k(y zGHjo04o1hH9Dld=k*q9Jdt_xz)4f8Ig_e$!H#ir~Q`_G-lEQUj5K0xiANUKI&q`qP z#B0Qz^notvNGo?V_v3lQ)+DYg%Zd&Vuep|$F>5-LBfw@Lo>0v#4^^CY#xsUg>Wf>2S6eM9YuA?E^|6=tzkcYA{0d~~ zwTKpq`ADw0-t-5p*GWb~DKve|gvFo}`S-c&c|=FgZ2}rGR-bj~lx?Oe^S_$|qs_{E z50`xfH=&K^hBo>g=X1^DRB{ZrVS|P$1Y8EBQY6Q%39gNyCEk3*T6wn1dRHy_kSyqG1!2fyNK|;h+K=iL}r4E?{ z@HuO%C~-#l{B%q@wL%!KH@I7P{)cLm{h=(KGVt5$-xZ%QB=?Y%aHnpN*{yHy2-rXQ zM4yKl#>C3{goNFC$}w^We>#wcg?#$kM0Ln*-7uhw_1>rJ&7c-S?T2%$?axS7n+i2S zAuUN7r5~UW+?$KSo;$a>J$4Hmo8ORI%#Ui-U-)jmRzm1l7V3M#*)5W94jq2OxMS;t zH%GpIemUy>53~Ln?zehGYQ66yJ=F7=Dmhg=zb57KVRS=DCuN)$5!>{6he`iE?N6;H z_ymG^NmSBObRSeszva#g5hC+seJ+ADKKNc5r7<4a8LOT7#E|K;9b|m|;5F+ay)}&3 zB=!bsyiN)fru06dH%KxJ1c^|+yLH}5IF3%!NiVF|Z_di-`|wcGx4S|sOroM!BHWG7 zm-@;xdF-;N*Nlaw6<;OARGC_(lhwDr?-a)9m_I^cGn*$gR{!f_NeR_XMDT?(G|tIV zwFvbz{XSt%#!m0;DYW{~dq`=2^7(UN6#$;tdqSh^G1>8J?@{kTAzSD-Cdd1?u1_y4 z3T5zJ`}zbt*^`m8O(^uL_^jrAz)b|nkz(`z=)7a*1>clqNeR!+q2|lBpE2#HU=&o) z)(0et@mwATE6q8?gWqcby8kzfSBni_6W zMj|r*SgCD9vQ+8+#t2l(Q2ajA#cwYh(efSG zeD&`Aa?pf?&PLZW2usR9Z9{_r2mZcc9R>HyuAE(KfgMM z9duh;TMp|*!jyr|i@lk%>ZAc>O_y_X<9m(G03jtO_p5i@TXfV0566N3=G$C#hk2EL zmF7XNp2<);B`fPlvz3U*GqG;cS(~c(Ha$QWEay=qTcwH^F{>s+}*w7&;m|Mwca>(@2CvM z(@9)@6B8F7E!7h>pD5_~$!P)ZY1HbEbR{?u5+2^6UuJW$tHPw)jBE&XS{MMqQ|ool zhe0j3o@|odGB6PSDTQn0;9wwIDi#q5=|kbfqN6(*A?232sod2E4I`*!2~AeNwzhT- zy9y#gnL2~fsd=8LM6%2>;tG$^{jGBKoGnPwi2q1i3I~5QIm!%je;Ya^kg!Vm9-f{{ zFIjMr1DGg;ugWUT#sY2EI!8e8%vOJsnXCRbQ(=N?-E@HsVkO6ZYfw2~F`zGzc`Wne zYegj`R{Ymoxs|GgM%%*~=le6UT;FEDvfu`Xhv#_SUMd%BB_|~%wGzL>ppqr!;!3Ej ztQ1JZsU8$r?@)kdMMO?+=<7eL_HI1-J%X;81)ms;el}msQ(J2|#CSBWhjx2;&|q-9 zP7U?2>v98eTeGC#!CVu`f?>EGQ)<1(M(eH#hgg{gJo*;XLo9ilY3F7TN4 zO~Uq@vR*eEIObEu;WL)M!A5YH4*M)Gf0aw)3utKI2le4U9t`Y3EVcY-jkPYH!}j~B zV(pnG_nM|Z@Ne*=Kw;?!#bHgBZSU-iNl%yCn=H!Ls$*MRTs%Kof=(8F8Ov9qK6evr za=XX`G428q6ASAj2wc;Jdd}$R=-T@F)6Ep?a_1u*%}Udjow3}Jy^F@<*4GY4i)mmh zVnAk&fb`XJygWW$-bmE_EgFOZ;yhd_S1x00$K`6l*=#f$2|qj#T!{7Wim_KnqS67` zn4Ld!@Yrqca=b)2`M^YOEpwz)f0#u;TMM_;1IdlLx?d(cCzgbO%aW9ZCF){tDmE#p zyViD1y~&LeJfFdIsor?L5`qsn`ZMsRo3l<=hYMi@+!4Qik)jaswS#pYnJSoa;0xWK zD;1~|cD9FLAiaJ~E-0AhyyzN4;(d40eDN9)k(7!mP^C~+Ayvcw1}6lvFGjglh7g@Xjy%QWMD=MrO_TU4J24ijmN_~ zE?zVGF>Du@=mz%F3MoK;z=t zZ;xQ|l9Gr-d=9@r#p{O(3s3QZ=W8>sLdU_8u(M+WaRs5Erd~Td^jb2gbvnQ&BO?nV z5hgBDwIFHoa!;dI{nHH|7LLc|m{idHa{aIG^X%WhrI!(N8{(4wMyWim<(94Wu;9C% z_Q^{#*!=CuINK|MEnfMmKN@o2C$pQ#6=TaRHG7_Eaf7l6I$Q*?VDCtl1fH;$z(j#c z-&OPJ*c3WCy2$(Ykh9H!EX5pYP@bu$>{12-XDkO*erw+U<)rBlZU2;Iq?%}zTIc$l z1V?T0V4PEpB(g#bRP!&qh@AiW@BeBo3RwQoHn4r{GsJoJ!3iF=sNZg_6wBXg|iWS z5lm|C@PrM&z}1aa5tz}^sL9Sdk-~}P&_z#$hl?4XVqOym3CxNRf2H&{*pQ|BjENurgZ2QbxA@RRv15O=qRgxov4zjEJ|;ML z>z8z9`Wn&|GqVw447@9{)R@v6I|ZXTX-gB=`Td?+qnH=lkf&5Qz4! zru@P4>03pr=Wd?K@}^`zVmtIdluRYwm<14V-OZR+CG=<@1)xPx67~E)I_dwk9{-m& z?BL`6p|}>IxE9zE6*iz>{|HZ+y)yQEo5hmvaM6oWJ6@zuQfhh2h@I!MZ#Sm+2iny- zAn{vtpYvM_otzu}+%qqVQG5pU#k}uXLZ}~u$W~fXA~r4_)95CAW68-WeItW}R7WS! z-pO~Ih8YIT2J{{Xcfw}G+?OFV%9``fp%kTK-X~t!x7syF3k}ZcXPTdqSm1mB#F*a7 zw#)X09}EwrzVR?+f%jZ7S!=|yPw0r9)vMsOCj6vdl@-7` z%cbVDy{QuZ-Os0$CL8XC6kTJE^IHrlqanr%I;+=%N1yYn=6{4_YWk_-vMGjyKE#@c z549}JK{?qGj!&n8l7*{jIq|F4c9WM}%a1I^t>>TzuXAm7u8E(SbNuSE(6zU@-_qj8 z`54M2dD_Yw-M);KRi3=)JDJ?OF3}Sgwdb zFyW=ibk?rY`@@-M+IM?fD5&aLJ=WTV_O8ICeS0b|Y(6#+#3h)Jv@T()}H9+e5S;C3*+w zO|=DaA4Y~Kv_q-*R&gM4(pW>EG^E8xKNY9)bsui9=g*Z>%QvyaFL8NvY{bIQ>yF(2 z!K%=U2E()F5_xZJ0%+KR0wOxuk0Y+mZG-9>U5~XVOYEk~3zYLkl$9}63*!OA*1zo% zI|8LEOFEve@p?7%e0Sotn%Y#RN;9Gd{lqVk3pdD%apaZ~yKl1a_e6W~s0DuBpS5M- z1&N#ClFHepPdn&wD@Iw3jUdZAYRPu-=Bt|rL9{aRVExKSR?vwz-e%({5A{5Q*YUD!%ww;jdOJ=%;4AH7>3e$}_`V|SZjP;C zprP*~>*b0sDLHCbt~FyuM#`0HxW-V8CAKtX(4aM3_(4H?%D?(}{Y*wRM)Yz`^56K2 zf=RQ8$&P~udf{JoojM)b0ve+#Z{Nu?F)_Vo4QoOd32wyf+lfaLnUDP6Rn7lmME$QX zEpXXlQ==Q%amZ6HSe^gGgdO_Quf=8wq2V=|wD|uZr3ZsS`T>D~qgfKDw|lQ~n4$oo z0{}rmLE#DaXjB*jw5E`EU!Y7kKR-XbcY!V-BH;6b(ZPXlK|3)gCx_K~Q2^3!%zk)y z2snm-fWZD<7!iNM_O_|h{54-o~03eelLt)a8YFV;_V4;lVBD3<_#VL-I% z9YU78ZU^!maYQgbh4}v;leCkTpBf^Fw$>=G)4prvgVj?|%)8gerP=^W{@0YF-22fh zf<#yja3#r4151_7HCJzu6h7NgR=V)43#Fyft3>QegoK4<1B5VMpb`q;0UADjuRjt- zo@P}++a+0h)4CRt3f+bimxNt6CP#5`@u)3*FGFa@J2erazZpuylFPy6vO-G{ln3H~ z(EOJM`u`CMxv1BcqowTHP&~he6z7b-?%`athcS@|!rPGtoj&4E+w5hp)0+>F0c9aDFkx5u!7eTnyN+sbcdb*G5toM`_KMA+-&z zV;9M+b&K=^zR#C;_T-=;+S2v-nTT=Hlpvz>CU)6yc%ttA3RG!^hla{TcV_W6<=EH! z)u>n@PdA+mfAa-qxH^49k=t&+eDz5z?KW*nN5f^w?(|h^d#xe1yl&Tql3M;kDSn&D zc}HO?0>+o2zfoqDC09q*UB@Hcuq%ZuFVd0+=NI%Q)~oF$3NF{RC;IBT!dsA<-^ zLtRUuf#3GZ-48OfZi#rR5Q=U&hAwo>Mfj{8(ha-?_tUlz4<@ghyGW%`!^M@T+BTt> zuU-O7>DTf(??7hVmCv=#b?=pQ06NSr9`4%dMw#tAKWU)z*3#AaF{KR7nOSX7T_ErR z`q;gTTEk*I`1<{2VzZ7Z3q*>$0-+(W$Qw(|8All(3uYzIUl$xIt8s^pP%U11T~rlz z^Ywl41*Y^%{Is9N^9OkG2l+MB;u@4$8d`> z3HP3lL=^afxR393fBEsP& z0$1iu&^Z)qHr@#gZ*u@oOLy?jwx#(K*g0aM!%I(dho2%ODK0F6$VI7yA9*JcGIQAV zkKGwGPOz&iI5X`!X2(nB%Datz=WYX-?Q-YXySlR%F=I$ZFW4Y;ec=6onjj8SJ zMqMybq~EQti1mNZ0(hq-B+1!%&{;eD^wTvW>Ga}2JUUJPC?rQFoq~>3v_MuyQ(O_6a7Xoj=!zjgP}f zTT>1dyZ*mgugHtUU+B_3b*`J!y!zr zLbFbXdk<42UV?6wV0oZXEwRG7jpVWvV^vRaHCIiAZsNCS1DS)TF(w>V!AWPk(MJ?Q z2#zyR%O{IcgPW4}^w70L6@$C2-x)eWjF7F7-Oy$b5@%KeVR=*~eq{{cy%mv`MZ z=cOy;U#hbg?YY;3nfdhCB@`CovZS|>kUbK<#IQpbERda>yW~vdd=<2p5cGYpb#J&U z9$PH1`FO>t#BMa^75AGHzib9VKN`LOk?4{_(I=IwNRxA_9`I!V9)X$@TJhuK>iICz zqnTc`AGHZ?`@y7lS&_20nSJ1g;Gh(djK6^K0r}FSTJA-kj_~J%Ip=<5+)j&54fWx z*Ate909>dKEup8SMFP4ESc(D-CLqT#KYvOC!K}Nt_Z=tagi!KE(U%$;pm2gx2pS{c zx&W?U&3otbHlb(o>|D4#T(6=2yE^jj>MsM$Zlx_qsaT5_ycmgIptop+nhG%Iru%y% zV`D1N3xJgBz(>TD@+P+Dh2awC{??WRP<~HNPF&pG*H%}*>y*^gMA+$Uy=Vn=m^EeK z#>xyU&_9C4p38c%|Ka`?Pr!wx1>k7yadS>`@vvW7b#_1%fL>o;qZcj-2cg}u+b|?F zEd4l<2ZF3$iw{sYt*orJFWlToB2^24T$wqw$BK(=Xl%T?x+BQfmD$EKxXN2Xp|fBFvNlr!Fqz3cT1J|H#Nl&soEifhUpM%*^bgQ0MKF zXg@h5{0Q{euRx3g5=NrS@_Q%YV6b2iBY?+a=;|(sAjqLK>B!gFZLlQEUMkT;z!OR5 zv`$Q5g?4-o4SkJ-g!KN>EV-tp=Ke~L1^4*;oPwVIb&+bQVm?DP1dR6>%>s2&Qc7xN zwIfvShCZEyH?10U_EtkSELt1VTTFU-`n?E=Pk;zpEz}#KR##SX+@5#yX2hQHadLub zoKGD;u)rx?+R&lcT}TIe&_oof0ZyNtlLLNUS~0)QEoW>eiQkzCKYWekfW@d66VM?- zono{OGG5-gadHYzGiy zZ|=^9c!84C($WH=gv)AP5{Pj~K!XC-0x%hXIyVS3t($*)B_rll$b>vm)6?n&Y9(?Y zuz)&E%E=iY6@^ysbnrtYgOr{=G)E@!Nz?C&AVPZesuh5HA0G&lR_)(%qrOrgn%u0% z3fwzf@{|B2zSMkzPL>KI9G^22NTxLL(#6^hoj}q6a_M8XC>b$)&ZbZrP!QQHCK)ad z7y3e(o4a=>3ZDdykdTl{(~;GPi~GB~=`sTZcH{nKAa@I#v|~V?;86+e;pf$oHx$Ty zKn6s(<$8E{@BkU>9}u9>?VWlhHN9n+WdF-_XkI?t3`K1 zL&M>EM~mEhA%B`8;-rMZd#y&7w?5$6pHA#ZJ2Eu1t*>t{;sS{4A)%qq%a6*>&-=Zs zUTD)G83JDPd?Wi}Ac?if``$QpNmqm+I$Np%r1NXx9 zplZrzKV>L0GxNvJb^r}Oanf+l9u<{@A`NDqGM$d=2A0t6K08Prm(>vJ!&;RGs4SII zaXntR_$}=?xS@Kvp;X!AmpEdsl!FXcIXi{s64d@36?5|^_5Io3zP>{BVv!vOzDi9- zpyuaInD0)NcrT&$)Y)(4Ddk4oSNkkBxsR0@NPrdOsg)38(W|~#KItN-7EeBrxR<EUlv z5euE(I57nIN6cR`_Oji0@F$3hP@702xbb^Li&xYSa9=Hi||1;W!^yK2=W8nn2m6W_ZH5r-j__*@w z+FBj3c)+fK+WPnWYaCc+5*q97z3wFUnrbBFDTu!LyL;Ndu$L;QDaxIt_ zkq;oCqhn*q07;h!Ah#p)|F8>0g0n#^H_4pwhkH7hb98u#Yu%|C-^ZiA1C ziBa4ZSs(u>Km&eSrvB9`6Sy1>51!25rX0P_kg44-6Zm(?!~)ZcHR_+Ayjk_K??5)> zuhut8s&r@@{=ads9;ya8{YX(Ru3bN6ojz!+ufxPWwsp4&sr-+P{WxwwkOc zGnA_x{-_qVJ(CSy1@09u$bW!Zo{f9iU{>h3?NCCfC-flb5;RBPaAc5aVk;c;6L0y85Mcz*q$XaI{8AoeG8#S6RxAn$!0&6a{R z{@X3Q17UY}IcJSbA~fFv^W~2>m9T4YIxrp2dkgjYM@vjh%%D{p<@+3=++jx%lrfjP zlddO2HVB0%Qy1n1n(d;;*(ZH{ef27HEJ3&PuYl0k*43SKlSeM^?)DN`H-3OUi#)-PkxZ%2IU<-oN8Zn|>bXWzHv;w;AfxL_>VamrCpK)_`uClQz5 zi2)?MVRsZ6F!s8D= zS?VT(sc^vLqMBlNu>)~Coe0beqSzjwuuxwgx1svNNK&Gw>LUR~1@h6Q!XXIP4pWXN zYxuW36vZ%dr)Nek_&Y#w&%vEmz^;MOy41&qD_AOz?RQYVHtL!I-ZrklGS>yW1^{0w zC{vqmj}vOTjLNPZIbx!@EU@`oM}Jz(R{(+Iu^S^BbcT_!v&VvDS#s2_m`UAh0;2;! zibzgQ1`*ddOadW;%+^>B0c9T-ge<(DFF+CcY{}i--L-pM+*b3Y!t!*aq&^_^<`R=- zsQ^dVF9{bX2Zs#VpREc7`+t0YwG<2R6j(11#y+tUX{^L=@2CKH3g#vt-&17Q%XTDSpH?P(rjeckZ3oW$$e7YskJ0pJLkEYTeT zFx7Q4*+jkBgIDx;LLOO{dB22_ZpZVq;x_sQ}>VAMJ)o zuU8w0YQpii5zSKkjr!F%q>wsMAkrsHGVC`%mumNWPE-NKKil{=@KETmpwOf}Q zgbG_9MPX!;0Z_a}qdN;78$U`6N_Pk|(>ew=S`J`(5yMX^;cvA;-_9t2DT zogAWqxYYj{Xps0KunyvkFRgf(T`mEecc?#s08u8r(t%iCItQJbyM~Q~2SOMB3XsJ( z>6`9E4znGBb_YJ~^dnS!j^KY6dvm&v=VS7q7>sF5WC9OT;PLJZ`07uR;_VQyqM7Yx z_|oJKQgxk;HSdhc`L2(Am+Q^e*0rE!j?R zx(FDk4u|u20U|B(!uRdKhDSt3&ITnIkWKsLzi>`Ri=V)Z4PXy|5wly(^MK%e8dd-W zha6-e;3qafQg??8$`mf0DpVY`_U74j?rGIttY^aB zk`s;1C3t$KMWSPk=m>wHL<~XueQVkboct^W=52nhbIXz5q1#w#NKzdz^d;9^9Uk9KL$PWsVg9Z zLjwRAsM{?-z2yPbo?1RV8;oa}R%wD!)VAtxb70N{*h8TJ)+@riJQEndQ2Czu0ORx= zZ|UQ+Ex61Hvu*a~*CepU(qW@iUi&~mmmykOT0m_T`}h$QOyB=dFQ7n;sIXoV0tuPS zX@RX-bQxg>lI^KB15`)`ri#G8%uM3V%}sPtlBAXvATPrZOn zr2t^D?*qndb93Nh2gzHMr{#pQ_KPcx+_g*YXz($87_82oMrjY)oouKWM!>Qzazf1l*edn*rczbG-Zk@Lp-Kb3mo` zZqgY7jQa4Oc2qe}A@DPU}JJoj!jM#YV(N(C%ykvy(LP zH)ui=Ae*vClXG6ej-Xi}To~=Kz20_8DE_IF&1T3I926#!5!Kg`ISg*V_veqIJ#;YR zTbDYU;8hboMl+%K!e*8F<3=Rmyc=eY;)j%G#%-?Og5Xm{u_OIJj<#9fiUpcq zA+z8B^Age5gWMI5G7~;N?r+6Ypr@+XbDeE1jsdAReSgG%>tP}U>*$-|<8Si1OJUE8 z7n`u=nCodVh{v6vneeg{ABtzM87%P*_#SrL#od&Lo0QM)3IWhNY_NLyNE&odGwv@J zL1ul?xiI&}=a&TiSzD&|zK(q`kapXWj41Br7HZuaM!eqB5NsVRA4g!EyVN}ga&V)5?MA%&1y+I;6 z`OD{|k0Ybn{AmlNZN~Yl;L@En9XY~~c#fSMVO;&Cld3rOze)zSu?m*$@NBAVr5q<8 zPgfuo+pS4I16#tTc>dx=d<`?fxv_jY(Zpf;Mvb>nTtD*j$DJG2CGWa4w~WZo!1;jG z6jQO44IoohC%0spJ(?_aT9*Hk?^~TdRDxV1B-pQ$y`l!0goYPmcHc`ua-Y@I9T(`lu{PZaexSm+u}Jrb?| z-6SWR$8Q-oGJrcixzZos--0{7-or#){(Q}f5(z3*`V8;|8QD|~tP=kEgREt@LJ=mtrPnvS#(w9X$)+PAzH*_@M#`{<6fL5KY){1YwULfI6`zj$VIwb9|ro~nwF8!)&dx@CLiu+iaM zfjT?)c;uD5nMRyzEQz)w<%TVHA8}40n7%Q8#sFUWTr8BP+LTi6IU{sOcdO5(!P9(% z>`CneM|wWfxqtuQ+^a?#B*YjixaVbZ?CqwocS0IRM`m~KMNHhB$~YEJUe`IsD*J0Uhn?k>*=_S4M@h0L!-k;Q@UB9-OEnqn&#e3{ zT*kK65h40#P0N|`4zHZO{$zI9bb&g53yNO!+<*vBMkmGsmOD8Q)m4jQP&epqq6ncs zo0zIS66d}-xFfrf!#tcJzzf;ZD>4%%#q>F3uA*ia3@uvP7t2u{H4-BLMFJP#fzYE% zy}s|d*Y-nZ=7BF*O*Jo7@^OAUm|RGF(KwUhk&gd9Y!z-cQ$edXXi3FMmR9oEG}?T$ zQ)s{BF?G|y1*%n?;2z3|ZMUEEjDRpeO+Xd~K=;XV?4`+Fh$eJBCM+{488cJ2xOGq7 z(Euk|$u#5Kv#Z3eaXZ76?tMSwuA_$zW{UY^&e%8efQ}6$K~}w1|J!1EVu21v3AVr2 z-ZeC%m%Ppt{6#rR%;#@+1BCRwJ#F?B5{71d#0xh!Bw(Im))pmT0hTh zr3y^Cf>wA6`jb+F(>HVsjQ?Cj<#33gdm08zd`46vM|C7qrcG-Pw<2s``;mX4vvR0{ zyl#j6&GwBQLhd*>b5QlY)Id~$zgA{>TjgCx5M#=Q;J*ZMsI|vU!1+E zQ&2R`xN7?DVo2*p*vG8`qxC-z44%${8g9?u%n6AX>U{FuzqR#Ra7h|AA$Y5t%f{S% zOBm!#NKHvb6fZ5c-eRxLsH!#Z=#qFvaj8XEMO-32l*nKDwb!}vSlk&npNEKXeqYG1 z4Z4uRG^pTVGqDEla`x<0(InUhnPa7s49U$Af5I3V``p>qixxd@Cx7zqZqk5BAwcx` zD`iiXC8Z-o!3TZU2GNExSCF-NZmdPtlReUup;P`)h(z3J=a z@FUyR#N&x%)~?HS{f0&-$z0^w1}xzOd}YWF7=rx5yMyY;rgEotKR1#3Bxy1oSlHR0^G+CYFigB+t7SK6&SogmRV+D0(h+wU_bd}OP~euzZU@disj)$0o=vhnB?`OR6$iTYJcvemM#E=pG0 z--Ns7dwD+C^v_o+eJA^QPWw7%1dd!>XD*J8ZL`A`(Bnr#klo7 zEbdeUT`z~?*f*)ArcRC`6?{pS_qvf!@2d~DlCK##IQk-9AxBmxR}y2LqnJ@Z5+yi% zCOyt6&{vnGOm}i}mDzX91>RR7` zB?w=={l!rX5<*l3Q$`Eal%9^=5o(2i$ zCEwRBJj^^*4mRpU`N$aZVxp)uo_*@{PYT-2NLC+x`$A)Xmu~p-gc`QZ&Z(5@-4Zge zCz%#?2J1{e?}{fc4c2_GxrftK8|qNFFQdz*H2zvKBPl;=4+>3Xu_haPIn)@Mo+@~_ zcil__FwBP|q_pYAWfRaE6hZf9_7(_E6vB6zl3QVX?X@!0Wb&B?bNrjaoEL(l7eH=? z#)f)qKUocb?jOzl;i_g_Y#ZJg8rdzefh)atRB{4+tv$T~!PBPIM1TGd@p&Z zLXOw`SfZBR(l(V=vZUStZIF+}O+@l z2Lm>E`D)XreQj^VQ1FRx48FG{u~8-U)!VaCl-4B!#P-Iw?nyx+`M-9v;;&u$-+A=9 zuWlrIPTAz(Km568NF_Gle>w_#hbdZ+NTW9$lZ1=5jlnS96BZ>pl`vd^&?*Aqj1Ntd z<8PQ|(>h;Lq8c-|y<$feiL=Vl!xhUHYC^xs{Y>+va0mecfn$F9y#S}F&!vO!YVo`~ z^o*po1t=`J<^-wBF;;bo+tZsLrEe%Q&d`ALJv#gLr4#$ZD~ZS>2X)t+dU6fSuo=rv z^Quh?O+B(@xOCNNQlwPF)0C?m4{wta-EEym>RT z#knlL3jFY%+Vd6S)bkj9R(hTgJHCjrsa z)Y6y=;ZN<)KN$z}0}KPlsJ4IJ2;sqW4WFOxgxkg14I4Py9W`yIWacRqCA=f@DMd3d zQT_sV3JD*1C!iAL6N1*B@fqTShDn-E;!{cik5A+y{Cx+Gh(=666i!DLol5{NFycQC z?bF^dhP!bh9335Xe!jP73g#ZxS)L^s*gt}^%v5z|Opw>I7xKpSDrp|RFM(N88pxc& zYw_LLAsK+5*qB<4bQjWEXy3Sl3b}Y*r(EYu)k8_&myNhR9h zt(X)~`trc$blifpYQXA`dO2@=?n)tzv8_b~#c(W5oIzvl@zC^6T!JTKM)Hn;w%CMA zs`gjN^fxYEV&akAme#$9%LzEO7*Z-!Joo>$$vPtokg6d^y~JCsWWT20zHg+98*Jzp zy|Xv`c1#30yEkfRjZu!V)PY!}T^Uy&AQOLC|JGW7IBUDXGm15Ar~im|H$C;`vDdur z<6yYt{*2=l2BPb;M#vT9V=Plzj+Guu$g7(vC?p)WM7FQ%JK}?4Xr4!JWUpTr>5?0o z^S0lf=gwSr7`w6lOr{rnst6%5$_(Ih^`Si%9q)XX_VW(z^bJ)9Eq-g;J9c&`+PNr< z%3I5*-k7w2300oZr#H+t2X1sQ&BN7>&~;4?bn?>Nqq{|AZ`|>^R%h#6YZZU3eBigH zcpxOr@wXvHe{D9^&fbcsrT8&XaA8OGSv7&hCM!oo+)3r5+H2byN1wQoZ6TCuBCTVm#!SKYOeO;2tr^pSMz&!I@TkR9G>2N^RliRz4zO$N?;NV&dZZTG$OX4-Iqpk_DSMry z62d&)A-ve~o$@YwGjC6xh9g%K*>65W`0UuPjCy~1F4cz`jVIlrbC89w>@L2qInj3b zQQLC3ef7hWi_`b?{3uV9PcFVW*X|xd!R>IM-4i0yUW~c)d&&^nvKg|s+Fv!&(YY?1 zEBgq4Vj<8|)BHKle;PV84&5P!!kZ+7POUxEFI^ITT__7iR1|scgrOa=KtPJcAEoD~ z_$NV;w_~03VWX)-I^Q&Cb-D_NI$UW^&8tha!k{rty7`Tq|0~YGj=!c7~LHxZKW=8j9x=nf$bGrt_)$)&QR97bOmI z-O4Nc;BtFu?v%C-?1z5w2`PYvQC_hYE;~- zxJ*@1x@8^&KHOazw$tKAI5Y=6S;9x|`!GMxf8=UfBpe(H2y(IVpH=%~aFY^(7B;^Y z|L=h8KAznZJ_xrrZMXESgKQ>BtOOdFl`BNY9IL0Dy?>^yOE?jJxKyI(iO-TFP>V3Y zaF&bA6YrbbKcTw>M(ZzhC7trE1;<7bM>}!%%5G2ScUr04X{tIbDO{mXtYYZ`YP55( zPq0yA*=g$IDUiRYr>B%0ch?zu_~$tlKQsf%B{#cfR@@~lA3_bVS7`{?BeX-YC8|^V zahLh;-p7{{5A!Ce#_n+NU(1;t{bpBj8{&!0Fkpu$q#)h7kqzf|g~6qT>K|sjsYjA9 zdNRez36e6}B5xSs*Du>k;EiX=`9KH5`NXOpESYu~mALWV6Ae>ZxaFKsP||Mgs0XH-6kI&|f_6F0xp z$80En(u8bLr|Ay2@a3Ca9!WGlu}4Qw|B*{e_{mpPTV>9anhbl*$NX`A6>6M~eudd? zdeIflPBUaRbNE{P6K_UT!Kx2*TDk~V=Mh2g{5@v5{t|i|$8Tu?M9<qM?uNI8x`9akEKG`2J@tbQB?D(cI(sL!T6DYKf zwXeY{Ny~qOtT98)W1j1EDdyQDCRuklEnt`p2eidfxvq<(xJskK{;52vl!q|0x{MCn z^D{4}_IXN8rW=VHeM)Ag&UsvqRU3}q)G8ltCS-1j@ArpJ&2~#cxBpC_)meC*Ti!eJ z=3X$B(PGbyc)v0uy*|w4@4~4<>dJlm_>HkU*Q>#b*~&FkT@pbRoWI$ND^s0xaeWh% z&#OYoUm?X3eD?2!!_o0YCh!?9*Kc{E=1sCS3Ub9~Eq8b5%S^iY=}M@kXszX|V#$vt z_n8b_xJ#==9VcGdUSwrIn{f*w&0|UGHOxgSt>-dS%fDfMwzUq52iUZJgpe?LFvSt4Jzeq=JG%D#k=|lk|ZD_7Vv7B}682WL_7y6* zRGoV1<~0z4Z_?%pINq9sox7;sx0|=$2X3>-ck6{v=;Mdok>LetS|0G)YJ2UBk@M_F z3m?faaXzfd_`#v1?)IEW8-}G=hPoSGEbo^SbJ`S;>+$Cc>N4#_7RoM%e5zlg4l*O` zeVFu*XK_GbMoQzZilDdZ`=Y(ptLQ)&k4QuyF8#O}jn-cN{{ff%$Dsx;*HoOGbu9Zt zJ{0RoNl8#9y8y^Z{I@_(46^YhTP{E(^J}(T^oEXDaGUm*g2{-;^R%yFzG&A`DmxU> zVh0BYN9qJ~hx;%Ef0m@X>OiwyoM? z{v)IA8%j#bLammRuih}}PCCZ;MI88t>odFEhcjed)W2^E%{9Ng5z%ax1*>)!&)>G^m$9S{;?xIL8YOCXvq zqs_7vQtR?~XHTX0_s!4TTyhhWI=euHzX|~z{;2B*2M^!270`l31Pu)h1EOe!RONNk z&C8>>yV&hmYI2=zcIR$#xfIABD7uQKRz9or zDb{L{s-xG`b(*xYj`*mlU8kIZ?8{T z%iXuAh;}f6HB&T{ptGy%bkT8nw9-Vrv9Xcn-1prYr3{t)NLF@sneiww)Y$lVzH*7C z*E|Oej1&KGwP4 zv$-@aK@NO;-k_tSj~KH=Q7fZ}ii(Pa5(I*%(SM5#j);p}nzdQExtZg;98M>na-~zdJ373hqJC{BH`}bkfDHkA=m+lj z`t|GIK|wUu_cu3AJiNTOr#*!EDrLmeC0e<*n|=EF`lZh2hJO_cx@RklOcrWw(k~yk zA1R3bWadc=;wlxlZ?s~WC}xteDUr@w{_7hue9orW@;llZ7{oQC9H)s@zD`kyKVK4Y za^eWaVa*T;#(4t^`yLIg_2zV)&?)~tE^c6(_R8Jm{*NY?5C57DsQ!6D!`3>Vlf5UC zNOQlxnwgy~GZ`lX=@`dig6`qrp`xyiRojBLWqWM0(=-ozYobzzkSNk5;?HF-&SMQ_ zURbyzlS}vVNk^aJfLxAAd6TGf|H9Oil4TBp4jGJhdTVZaKMYE`U~)ZXv21a2_&X%6 zN4v6X_I>p&bPjMv>Tq5ZXQqiEV^8kn&H6{vga_|7G%#9A*Ilqx8$)r1gR;-aEUMP z>BBeDqKlN4M}xUalg8^M*PP)d*X!<{9)FzdpOu>!*j?do>Kxs)XmK>z13F8wQ>BH@|-U`X(;E z4pw4oTFcX2`*C4$5xlt$c!!B1^;i^qu2RVE7>|7lgU)MED3ka-Q<~lH$Lj6Pz<>FO zWa^A&2>Uj3llgEub8~OQ4A)Oe+}h)w?wVxnRnqKpLy_Yq%H>B23+4(3VzQV{!2N5Q za2e5Z&6fKPsuVVx`NuHak63g+plp}R?rK2m;CsA~e|UH>o-W3>n5)!TZTEGqt^+Rz zDl({N;Zad9EeZ)WJLcx*F0StQ_kZNekq)KuqqeSg`0vhE zko%+H6O)n(zZO+Vs;OWObh*sF{$ntcKY8%+)-?YuiV6qB(mxK07temM z2+8d1taD!_RhMR#fd1a)z+6M1TJeW(Q-+M>5a|?Go|r2YJ|^~$NO_Z{wzjq}HRS2( z3F_wlUOrvG_w}{w)vS@pQX^;BJXLv3&G36D;qZinKZ%LBP>KagO;$~rnI!S?@gIXl z_NGfh*GjAwnz(R-MJ$(_EpSNwEibo>q_g@^e2>3dNbJs6qwT*#Udi=<=5*lo%WttH z$&Df~ubiY&tyR6#e!b+=Ntq=MS*qFSL{>Un`X*tl)Ku9=&72$L~`^?D5 zh-!b(A4{*t@DUCa4qq(ITC2x^_vCqU*$4p5rs;P5xt($bTlrE;OvZCoL6=P7btU+V zA`sWnl&f%UiNifVv$nZ0aMldXiK*_=rWcb=s}Ds@G_b#v_4?UC@9uy&Hat19qtW{w z`*0b_2zQ=mznGM?oOO-IiqG?zaH?G){;5sS;#vCIuR1IdSs+SQNsRQk5^2COxu&9D z5H_TaCni=|;CH$Be+z^Fa&r2m&#P}V-E%r)2#@dGrX8Z|gNE^RU->K-_0~*|sfSH` z$GA$(4uixe?PNK(F1Sq4s)!Mp8? zl9Ez7^w6S|xWRB2Vr{HlXU8md0s51BKj<;wlg28WLlS9f^YiJ%Lqlg|0XQOp&O&B4 z1R^2X|ABw|Pe_=Dj$f>hUoDzn-H|5QZal*8)UOP~ihq=2y|~!S&BckMM_!Jyu*XjvidsLa;-; zySXccnkFQ)Mmv1t{Sd|$f?nK<9j`d-My+cB&XV;DL2)^j-&jHTWx4B_qXrLeH4N*no#P&_@Ty+1yK&Z1I>*S9= zObMy7W9?Hki#3X;J4J^#ijmJg-1ekbps=xE@teWdJEqQbJYG6jYDxr%0N^N55PkuH zf&JG`uU@^nxx0%1H9Q2L8{}6`ofN6oz0wdFFJ%gy-gcRrnCL@8Q}-@!fvl>k9XT0# zsvqr0PA(eOBl%&^K-*Gp@Jc+i(|W@?joTyVUsltO%io!eBi9x7* zJWaVBBq5}nD*WyVpM65&cB*=FHWX~WKK03JWkFptolnW(?Q^-4tLysF(a`m>=Wx29 zzl8kt()#Xh04M$rBP1^6>C{?jsY2l%;!jt5{vQPsLM4N> zRt*SC_BQ9m{+fwi-hteAg^+5uOS1Yx7KrLDRFqwjz-`}TnVqe0YV_B$Lo=rd50qsk z_m7;8r~&L5j9dB@m;0xkJwjnIkp7HqDj&|c!?Ql)k;N7Ua@b6w=eD-9#iu2%%(4-$ zAgB;R{-H9x9)iCisMI8+Ugk}h)YN7ZIO=joKgcPM5auq{mbGDi-{?`>#6E3AW8P`XS?HC>4OAVYO~Mg<3P4Q2X}Te#QTEaF*+t)|7o; z%(PvS?ZK#%BzFIB9?w^<>kn#urVQ1nLDp7-#!46}*h}b!7`Jc1WQQjvBftDCU`mf7 z+YTNne-~C}i53T<#TZt5a8U)n=i^mQSD25FG3ZL&Jlf56YUE%auFfCjuC;d>ayLNw z$na@6cmvE&VG$7mn|;x$wbnW*mxGDyJ=5&h<%Yv4yh6esJV$my*`t&Dqta52vNhfk zo!OV9hNyDGa!u}qsE>d5wbc73u`+kX_>t*7!L8F4aXN`mFLn5kS1(o#n&(5}>*MJi z`QmpC`-eSL)}Ly~tyE={h6JN54C9g4QY#&YBVBIUZ7;C32fD+eC8m&m)9vEnmLM5OZR^rY++%?*-BcTxPX{) zuuxYqvQB~V=YFfJ-tl2zU_f_D6HZo6j0S?xki~=(>?}fcFkeFtpqG!Y@2inQRp!Q~ zrqhdy&una%RcbHjU6umF$H(VnJJplP^~zjVR~HOu+Mx8I+Pe`6?NW}qa=oQgF2(~> zCY1Sn_2GYvnduIPb3&q`?>~I#@+b882ax`#Y1PHvWFWKA5R^4Qqfa;MsDV=&aHqy% zq>!<(F_lW=cTl^#yAuVlW$;PK(Y%;Nrmh(9klx*e*Vm($t(^>gkV%X z;v7e=2!;eO&ZW|A{g-^!8FDmEDpkJSu9gY^KOWo~-xE ziZ&SXKJt6;XliO2a{HnA)?I&A$d5WQ-_nnvG&Z-e*z7K%s6c}8=7DF0u8{gl;ziQO zbbHH2Z^Dl7f2U;q*HBP>@Etb7wa*a0S1zluqjJFB#qRZaxZ)+3dNfs=YV4`Fh#!f! zrMue7%jwD{%c*!OIK*3U%K(j)z$;c%qaN~6a#2lEwg8bpe(!tMv{^u{Q&d=TU_c## z?13%K(wOr^>#NclyO-;q)3`=J!=@z#^172j=nhSPi>_?S#(vjp$<=v`F`%=CnlMF1 z-mlRgn>ju`%Txc4(qO*KA@VLZ60e^8V1 z@QOr>?Tj$luXQ=%V#U2>&=t|b>*r=jpG2yR=Nfl7e!8Jb4ZT~ss8fTMCiCEqh)y+M z8#oT<;FxFR$)i^?{g8^HVLUf9I~XqFbqS~8`gzz!D}K&f$vt69HD}u3d>yt;2(QUU ztDrszZZA+E-)V*OH@RpmN@l{kRM{1M^eN=b?tX|h3W2nEvmh)c zrL%8EHHd)ApIUji+~B_bULcpkBcbe_tEl>uRc}FI>NU05Q-!bcHqsmInI8I8Tp8S- zo%40{4KPKizl)lXsjB`gdvXqSmG(=hp5gdc`;~2UR5jks{^Xgbj6#^ep{@@y?YKTJ zYO7Eptq(%#oLYS%Y+UCaw%*^v=TqT~d2W6pG4crQEKxjtR{Px}4R(vLQ5O4@V*5^I z;hScu(`)786ob>@<98q2Bbc{Q7@j6?S@Nb|!@^<}7FiJ14-`UZ!+SD!8M5ALR#Bg? zQPW$yc>0)_W2nQb<7wbqLmpiRl5OegQV;Ph%F4#WqSM#6Hs>L@<1v)|nhjPBAa-VE zOspaHt$kv?-BUQC%CHkStf@%1F~9Xl7XLT;I|d0MRQ8;8hFxJpe%ASx|L zy`3V;Io*?y&1`#O9#ec1mcWW5pDibeGhv4E#Z-;Bs`<{7?}5ML!4cL_1z8&xx{JTF^a|>Pdd3i`Srx zpYipaD@S$(PosZzYx7TqI_EfFvEmQwbK9<=(HM8L&{E?*Q>O89>vI}uCBLc4nutL`5%|1#0W2H2i|~6XPf<0FN<%e?c}XLO{XG3gjrCWe zj)a$L_T#Ff936GLe_Ce%G6|2CKE&}F zzpBDf&i)!Whw9EJ5cSp&yZAx}=1c1N>5(qs_HqtPlkwd(s!nP`(ZU!@POmFy@!_GB zm6foT%+Kc}s0%qX*w>a7{&P!(9npM27eQN=ZQWSCYsYdzmpIbctBE@ruq{0?9( zue;bu;xE2_;&P8MncXZf0_QPLSv*;NS2_(>;eiNv+&_hTZ!ejlJy(LtDSbhI*fjmA zb6hgDNN;qk*L>;8BD{KfmkFNVbL8T7V^;&TLV+s^cT7(g`?ZM@=cRb2SnovXf3D)M zxw*NQT#tFDiqv}mN9(-o0{9ug%5_Z^D8s|UQ~Kgy9%!z7ChcK1UkM^UT;G)SFXeX} zojDc`5+Na%KJGpLBQTTNFjKloU0z}TrrIf9>QLnDGNWuFe^a`rx?>jajMk=xo*ANz z#$WUl_Zw04G*2#awPc{P$}Jk5bGTUg--MH_kcY_A@Ug|v7(DuU(aC-~`N z|GE~N4cV-z(8&KLl*9@dMT4#+gX&d0c{K=B+eC*w@woK8AgS)VIGELT2vf1tL83i@br za7}D9{1_74%~#`lrYt)5cj@xGxb)UUd{gI-(9dh_vU?L3u&pIu%|eo93|+$O4KKU# zI2ye`zFObx7z&_147-s((vOY3GnfPPe2e7H)e-i|vC;-P6N@o@0 zz$zx3uc0}Z!i(Fa845I)NOEa1Hny0PlasN(z#b$Z_Lw5&;=&~>E9>OsghoIh1=zIR ziTw9s*%7$xmZi3vVh}F;BDJavz;^2!8rlL$0K&ECjff?{;~@698x16q%e~2UK!gF> zf3(idsQKYc9LyJz;G!?5fj|TlqHmqu_StT3YD7eY+}tFl0ET>i6=cbk{@TKnot<5& zNUaNK4#tc1tWr`^jgMFJb{H4=dmV>(?N92|@c1>_gHK`O-X5|EtY4G5U$6x(Wh z>=Em0YaBLfZx-wANjNy-04K-ja$yXTvDR)Ig<7fb6D4H;&^4G%#y$feJ+cciuIiFj zBN7w%H`HZdYdGvVzF*~Y@Z-n9W42uyny^gNkk_Yi1gtI1?JvNU^(QSaodiM2v?Ch4 zpyhwHW&Kw$`+s7P{trsaiKchB#yOr8vau;H8}q;a8}N+({{0JUfy2BtHfF(5pi=x!kn;t``&E$= z_3;qg=|{@4m=L-A&Y_{=iPx||i_|eP@|UAT<{~1%BE6c=8{Oc~HvRGiD%I@_9?n=tuEv4j`-@JaK58PJ@GqSJTtC&zm;+`Qz+THVI9QA` zMT-fi^10_}weW$_>4kDPN_EH7($WI7KOnkGOBnz;-VL_p_UZmOA1Hg!Fi5Slv+?iA zrAiI@W5zh}i8=)-q7(7eieet`ug5|3Vj#SQ0<{%(1?T{++6*tF*eCX&7+Q4^2M0Dw zOG_Hf#*fm{(qKH>9nFNbv9WQxUUUS)9tJ&q$^W_@gSz;(PO8Eo(D#4dQ4U2?HE9l8wLJO(S{Mq*PA_adcq1E77l@O)Cc1%cB?O=P@psj7nYRt<3M0zOqhobM7vl6 zLIxB_+@Fmvb9VK?ZdgMi=EN+^uGO>G7=!ou(}iQx>W9N?vnd<2>@Q6&wRN#8HkA|Ezggk zjC$P|&dZ<>$rUISp%*5jk?O6qdcAq`W+X!xF@eRT9Za`?7Pl|c5;z)37fcz!1{}Ab z?@-HqeKbs9HH6K4=7ji@bwfz1Nv>I&clw|Jn}muk1Y4#DGW2Rajn{T{|k76FNE zYcNsIz@Q6|tur-NgiwG80CgOA0>mDY2(uK9b~(7X#z6YeX*T`_f(Za{M*qTy+#XJQ z8ZW2Rfq-*9XI65$S5R^`#C`nj+TpZQOj0r%aJv$546l@xm8-3mhvuzXEYw4|dVPT$T6BlS23r((AX|3!%zD^53{RsK}8%`>fZ*X@!_x5Vu3TQz{ zK>HYWboCYR8a1YwDgzGzz>eN*xq)+xbP`9I%4ReMhzpO~O)O34%@5%1ebtI!Y+Gd7 z+S-r^`I3MH#q4yV4NimcZi`TSpCMFfF&_gipQyGExQ?Am7a+nTE^Gs^JCQFB3+3qO zXgXDBqLw?o4-`>m_o-b7SSILF$74;f5&he6vPNpzf5%dA)d52x z1~$prxTy7w19Ow)@`V5|=-S;&?)x9!8!_1S zo}ZPF6x|o9k-LG3kOPV;8Uai@QDV2@^cG`d&VN3z1gxfg^)?_>LP6PCJmdAU*0eWndv*H9_B+(n7b4izhM!CAWYCc>3wv`37CL2hKcKcJb zAgTbB$t&?phmbAzVs?4)P6Yh~S9qHg{!r_j`-SqqVK=8Yq=Metzf} z7@Zlyf&Yev3=d|?-n@PLQfYu)q<3IIA0Wz{d>_zR0eD&mv^WWnzAyKu0iyZ^3Io)O zKtDf^`x7)-bSx}UP!whI6#yL?3R*INXTu{^X3F4Xpg&KPXc7Jd%KqsKk_-<&{iX%0 z;{mqPv{_R^>%7`WlCokd&-tp$kHuUzb{D$YEo;o+ zfH)irddLfcR8qp+pDr;PN&BjAU{D5%JrK!;^W}3nT(4-5aoIZO<`Vea?@Hb89e{TN z)Fj=lfp`|4 zxrdTTd*S6n_k=BIAKX2ut82l!j`cY|Y+Un}m6yM)QaT~7S(O@_<-#`rk7TK$ z%@^yV0kdCixhMu=*mx`p-XE2a3N{akqU%*@0T$6-VKBI~Ph0YPAG zXEd|%YR>G%LFMsyC$Rrw=+N}IH2}`C^z?Mlcz=0&?@krr7OB^4&6Mf+`1`*H^AwO; zK-Rfr!Nb1cnXV;SO1YfDDF4Yn?3a)&Q855hcGu2sm>(rh;u`Wd3l+ElKu5#Tgdb|Y)@$hMG5%zGqqY^q{BGgYnn$4j& zd7%iZs~zmiDTrjsx~%`1GnLj@DOJ?3R(AGUspVZ0s%f=mv46TqnvK+JF%LZu^!iyj$W)Y}PU0pU zCw}&+6V~MEZYPa2R%sz6fgKh|FI^zaBBz7w!A`ViXJqc4djE{?)68vO|nli-{*|tyoas{zwxM(P87>KQuf;XMN7nIX3P`Tue+WtLW|>4F99~ zq1JkhX^L%X!b}YsDmxmz%Kj*}#Ld76=j~K(H!~ktw_p3RHJ>4!di#KNpwYN}mpm7| z(wctxa5AnSg8cL*x{t}`q_e7~Vyxodw?SfNT0{%Kkf;U|rwIsq(RH3;fco@NM07DJ zFDJC)F+z^L_tO6N=}`*=+LpuqSNb_-w`tp0<~J^|&9AERrdr?s3l+R!GaJ!wH}?`wDD&M!4tJvQ~rXa99_-qR>S7@wBXKYm8BGd_n$u|n3{JDYxG z?O>;WK~4|7axzUy&>9{lj|b2B_Dg^4L;k*2rb-WH2FMh0#;2;c3MC2me*+4{4ah>( z2kIrYBEsYUcsJPvOt}wPTn6d@@jfrF~SY`3X{Q0>s%u`#^N~+x2XO#DQ~_Mm1P)`q~7mMq&Zut zU0ZZJ9v5f0Wk)>cz{~!ig}z&;0nPwlKoFLy;L~7oZHEf!Xbr`zj@wDk^&TGIGf8su z3EJ~pjiEE&cF*;a@u7WPhEIM4w=?JS zh#Ml;mdS&iAAg|k7}Z92k1)<$?Xn>I<#M^X3~M@T4hF*4ba8+)onc zM0~I2O9Vp0=Orx!cP=m|XKT>P`l--B04}ZGG|yYinseXpQ+CJ!(HpTQZ(Gx)vSHg0 zY!b*O*mE@LFGGO=!I}C~4gDHw=SfW+u;Vj#9RvzWVqBr-gNVEdX)+Wa`I=DGF%P$f z-M90Pwg=O$?NY^%lg5%+Q>{pyEaAkWfBm$SG+sLAEEYB=+qA@4ZfY2V9GIA$IW+IH zG_rzi&|j`6fqXo>;bo)$1Lg^IFu;lux(h8gyJK@$e*&1p!bDj-iU@N*9M9v1xD3m3 z%tnQJynLXNMnQ?H(8AWW*Dy=J{Hp)3@j+@@AeA8?R`5GG*k5S zKQ#-C zW-pNSbBuIYHW(mt;tP#<(tV2xAP#QQ`|r&=9VJxnT;L}vZva~;3Pu-B+YLDS#*^2e z4N@Oc1u%8%roVSxB?Gz{i*HDum~h2V@R@mL|5%ylqilWC9NRK(?{JmXw_)}<)vV@Q z&hkfT5Z9-mJl0~`c-xJHkz(Ug_g=AjZ z<|Ot#g#yA|)1q%)q_VYj^?DtO2Mwy4bdOHax5ni5>MqybDT8q{bJxAQY3*~zhFWxj z!0xF8*^0Xg^E;Pvrb-rsLg_%w;a7E!HXxZeUTNU2Yt$fgem3UY*br40n3m~C`THR| zZZa>6!0VR?jFD0oRdT_U`q0M+I^DyK&WXD{GZw%sl_sHVmVcbwNXfd=mF5?w&u^v< zscV%BO~biV4pO9&jSB3pU5HbW9%H2aJjB-yF~;kmaYIjgN37!cPsvSLi~o2BYBU?* z&D$iDEUOJoThWq}kVb-hGB|;4iYwKAv+7S5X3HK7Br7JHRXCA1mzzN6y^XPh+*4}e zEPI`5A(PTldaElRTVETZTe&kQaSbbOZ!9f{|IyUr-nh-SoXJ2zPMF>bWaKa9G3NC< zXcW|$@@&RjZy^u?(xNw(Df4cF>;v}QN`K@43$2wqZ;(R?%l1wP|1L}8hYwACN;w63Bg%Pz>T$h_ue_u_qb3fHb2uwT?=X)4d;5N{GxK_7LV42x97M8 z&uFpnaN@GWQq5}HIP(74mMuqzp2Y$6DE>g9%`4T={1XZ5dv@t*o_$M=Cc*xtCn%@s z^A)wuV7GlTA=!(a2Qr(QlCu}x>t>6%_y=$QpXWjCoz`6rP9-PnSB58@O$JZWbRUu> zpp7+JK8jA>5oD2N0eJddyl({*5S4kg$oLfQ1a~#LBUi0lRH3uJ34#lPLNrxufE6&Z%W}H;iADWiTL%joemmim@ zo{)H@1%9AIefV2jx^kGxxb@Lwu>^a`zF=j=eE3(5r-(sz#&Z_kEkQ|t-WR2TrOu~I zQHGDUP9|=mYkEhR`Nf0vEV{d*W_HV*%ukOA{sQ@}1yTmhPWFsLANp2z67Fm3ZCTkt zvl9rNoGI@IGkNVXZu_;tUd?&MukSu4F~+91K*m-*K7=8MpXGdUA;V2eK&V2U8aVY zHRmSLh_$G|7aw+8Nmy$l*W_>Po;i~i@$y$>38JG1;x%v}YP`8u$$G2Lj{}=0abv|H zXwEY;8_i_;F+*MgaHpTfIDyUd|F`w2kHvPSiT#T&TE=I0Z@lxy zedmlfE@S8xSxnZN^ZS1FZ9){}#L-cRP+(wS&?O~A6v6BL^B*Jx@V8P?pDB2ObNno+ zj08Tskc_{B&k3DG)t!`VO`Kc}93U{JHn!FfMn@wD2*k$G%+~1$wp9RJMDu)+umi-v z$=ue4LfPCJ0^ zyt&qUGP2)Rj`E#0^m{{?B~h}JNr*|JTDOCwqonk}pdRN%-ut*Q#tB6>$M+}`12rkq zki6UiPBuJQQTrFzUpS&g5fUG+5ECR{PC6vECv81=Oi2%?ZYH@8xejxWxZ_JoNPH(0 z!bPQUTqcy|UsR6c& zP{B~MuOu|3YkCNo+DeXMbDx4o8@71hr#2-G`&%CphX3H(2X(q zvXGvT?F=`%tQ+fLjq8$HPrqL*?5>Rg%X=!%Kj}2TJV>f zSsUMPfxijqPTdoUU7>$#s5jpJ@UlV7%uU+nnW?lDrrDaP5vd6?yrh=Lc-&GE^J-2Q zfK|gjg#A^zo;ZX2qwo`%RPf4^wJVR`3_g&6X0xo-HVk?yTHD;H4;j3bPluF=&I%2-G`g<8Ug$`=>b6pUBni7J)$f}bEA}0K%ELST zOVs%J+hRv-X=l(HG_`HmajMMyzEK=!C$5V?P`7@MYVq#s_=ezbqvJbX*F)nYKjTog zD~ID^{HNgj51umYv0LHU&Bcj1u)$nTA3_W@)Ur$?s65svIgX@^&%#!5@o}?r->iNa z6Nw@f7s-A);B{jq_E{RvB1@1|Z~69ZLQ^@D)XZbw6a!!Q&VcQEODpNB@K(in98wdS z%LDap)HrpmkJjKQWG{(eRdRPVV9jES!=KWmd_PP@#zyTz@sFS(*`A#ugwhU9*p6xaL7C;_pKl|?e_7z6y##F9n!{s8; zG#NwQPPyn{%IGVpr@As}z4GhDG~DIZ??cO0`l-IGdQA=f&E|T?yVCTtTB9-cs0l2# z-vpB+3I5>e?LLjgG(B?D_$2m%dn8ml#*h7XL@n5sz)Pq$36 z32;Ymmv(YNY->u{AkD{$iRS>Cql^>17iB2aYhatwE&MEqg&8YYtk*2pF znEyghz!os&AFD)lt5K`C$OT7{sAkWB_bbTzur_qyI^}Su1n<_v9a)#Wh7rCS8BkSz-mtHq&k6~6b&H^UMA6> zdwa^NS85eLvmS2dXkl0Q^9|oFgp`8hLQ08T$`>Z84EdF4M31}o(_D3w^q5~hiHH6W zYT_#)7oer(zD1VC8P2l&_%q>MU^d4t?cXb8X=XGEj#KJ0H4;(68=^8gwel4^*E~Va zuQ1%(ayI%qJ+bvyNyF!FWWOl3wMQ+#t629kyxacMTpx8MI4AxlgLyjR@C>HJ)p~Qk zVI=WPV4E1@tx07N=PUp3-kIXN2I*RjZ|X`R3Ig^3W2V*V+TaNS9CeT8E8*R%=o$=h5}9 zjcQXB=GAIN)4xY#=E256ST-YM+oVtb7?;#OQ89)L5FCg3V3iH+i2b|wjh$pk4LA`$ zAtVz{SvE{MvwkBa-_82Qket3imqT1JHNGp*Qr}&!EKSHQq*;1XdslR&NPB!hlg+>h zJZxq@0~M>DYmiC|#j&5xU9X71hD=sa{@)>Cqp zaFLKKE*#EJ`8S<)gQDX7@wtPuS$U$93?{NW1F7}PdeaGeqc7ejzd|{mdBLCTz~4Xb z<-wigfe--|Ln5i+;N^L+n)u<&)F>4|9vUZ{ZWf74w5KjMtRdM7N@Vpo+C$)D=@^z>yH zAy9Ck|DA%H-1*L_Scn@Z6(~c~_|Wg7&rUREQIjZ>H($npgpo1)k~vPw-qEqBmXD7w zwV;4@V7aicuvo{kM9A%lBuOSHC51RQH<$97ueyHiChuhC?n0%@XQ_+zcUzK5+(KK=du*SC9R+`f-| z0f?A+rX%UN`1qCP6Er+7`x5zbX$pnPUZ;KUHvauvve$rbkNyjp)WpQZ1na@I)h+u- zUmY$sIPJVTIXRI@-iSF?%y*^S1{mpPLO5+7f>LEcdvufMF*> zhegELX!C>J*xZbcjTQd%3C73AXMedBT3yY)Y`kix(?=k_i}9}om8fhvQu;h9B0Ql!nyXf-r6 z;Nalwu8$2$bsEL&>^_K!ilPy+egil5Dz;A~TP%X%>S1YV>H6m8q#cnQi;%ES7?Zzi zsoC>|goH#!Qxi$9qU7FmiLDlmtLs(kWeh_4 zBqSu9lovlut~ZjDxA+7f9&rn-&w%q~LDrUAO-=2~$y+YC?6K`1;D^p>$$itY!;O5@ z!I!oCpDf9c=G?{JOjIwKXZZNI;y`5}D#6_DaouEvkvN&}y*)TNuqR!;y%QNiuw)+F zZ`Rh<9#4IQg@xU>GlMM-(6`sug~6jo3niT#H>J{U<nmtnZmONdb&%iOPb<9Wc53e8aemL73iXUyH!}VhMXFf@X_tcyiG}aU0Wh@{d zfSQ@5bE~JK#Cs)ZvDCy(7Z>WdHLRkslqrmu?tQ6odwCG{Idf&LI}8Smm?Qj4w%AD< zET-MfDI{Ess;uc0kC*Ubo9-x5S+vz69f#BKT7ia zqHb;OCF7+$P2#8YAR6LuThzJ~LoIJf&pPzAY z2JA$Hf&8~+@M(q*-X%yJuWCYITP;hy~M&_w}X3p&F5C0J6o<$=ftz9 zb0lo};ka`a_mMeEkn|;S7275n6AJu^QP2A7T1Tv&msBBMq+`Cewl)m!a%W?GJ%Ep) zU~(S`D=P+_-%fA1xDsov=f~^qjSLM9ukX)B2)P}MOYXMk>zIQvNGWM(f;u`rYgU^H zfsTnF=KNPuw`BNmdx1tSKvIBo1z@HKF2AWMwb}EE6+APU`v&$;skiy^&{CIFquxkt z9Gn1crhNPLo~Dx?ViGR9ub_RFFTMLW9h#b(-M7+Q-Hw{CUb7k_adUH9E!0P!ZH=4_ zaW2~}dtZ&^$r3-eyTIeMkysR&_05}R06t}{kGIf!CwNck*7T9%k!fr)l8)d`vD5Cv zllmg%@K7!JcG|aqPKQ2 W!sfCQ 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 JrJwcv|1Vjj{?Pyc literal 12783 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 WZkQyceEr4-EK?J+YcGvllm7!!tUtj3 literal 37319 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

Filter Wheel + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" />
diff --git a/desktop/src/app/focuser/focuser.component.html b/desktop/src/app/focuser/focuser.component.html index b1c93a870..52d394f2f 100644 --- a/desktop/src/app/focuser/focuser.component.html +++ b/desktop/src/app/focuser/focuser.component.html @@ -6,9 +6,9 @@ + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" />
diff --git a/desktop/src/app/home/home.component.html b/desktop/src/app/home/home.component.html index e2d0d059e..019937f3a 100644 --- a/desktop/src/app/home/home.component.html +++ b/desktop/src/app/home/home.component.html @@ -1,6 +1,8 @@
+ @@ -30,9 +32,10 @@ - - - + +
@@ -174,14 +177,13 @@
-
- +
diff --git a/desktop/src/app/mount/mount.component.html b/desktop/src/app/mount/mount.component.html index d0f9e7cd3..ff2761b52 100644 --- a/desktop/src/app/mount/mount.component.html +++ b/desktop/src/app/mount/mount.component.html @@ -6,9 +6,9 @@ + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" />
From 8119774188c0ab4d511b58d509bb4ba551fe518c Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 11:50:17 -0300 Subject: [PATCH 28/40] [desktop]: Fix Dialog Menu layout height when back button is pressed --- .../dialog-menu/dialog-menu.component.ts | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts index 95fc49eee..30667a16e 100644 --- a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts +++ b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts @@ -23,6 +23,8 @@ export class DialogMenuComponent { viewportHeight = 35 + private readonly items: any[][] = [] + show() { this.visible = true this.visibleChange.emit(true) @@ -33,14 +35,34 @@ export class DialogMenuComponent { this.visibleChange.emit(false) } + private computeViewportHeightFromProcessedItem() { + const size = this.items[this.items.length - 1].length + + if (size) { + console.info(size) + this.viewportHeight = 35 * (size + 1) + } else { + this.hide() + } + } + protected onShow() { const onItemClick = this.menu.onItemClick + this.items.push(this.menu.processedItems) + this.menu.onItemClick = (e) => { - const size = e.processedItem.items.length - if (size) this.viewportHeight = 35 * (size + 1) + this.items.push(e.processedItem.items) + this.computeViewportHeightFromProcessedItem() onItemClick.call(this.menu, e) - if (size === 0) this.hide() + } + + const goBack = this.menu.goBack + + this.menu.goBack = (e) => { + this.items.splice(this.items.length - 1, 1) + this.computeViewportHeightFromProcessedItem() + goBack.call(this.menu, e) } } } \ No newline at end of file From 0177469d038c95dd1148152c613a225a80fce1fb Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 11:51:23 -0300 Subject: [PATCH 29/40] [desktop]: Show message when no devices is available to be snooped --- desktop/src/app/camera/camera.component.html | 6 ++++++ desktop/src/shared/services/browser-window.service.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/desktop/src/app/camera/camera.component.html b/desktop/src/app/camera/camera.component.html index 95d300c34..0c4d324ec 100644 --- a/desktop/src/app/camera/camera.component.html +++ b/desktop/src/app/camera/camera.component.html @@ -201,6 +201,7 @@
+ @if (equipment.mount?.id || equipment.wheel?.id || equipment.focuser?.id) { {{ equipment.mount?.name }} @@ -211,6 +212,11 @@ class="mdi mdi-sm mdi-image-filter-center-focus"> {{ equipment.focuser?.name }} + } @else { + + No devices to snoop + + }
) { - Object.assign(options, { icon: 'camera', width: 400, height: 470 }) + Object.assign(options, { icon: 'camera', width: 400, height: 479 }) return this.openWindow({ ...options, id: `camera.${options.data.name}`, path: 'camera' }) } From bc265f1e4598956aeaaf8f0656bed78861996927 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 12:25:00 -0300 Subject: [PATCH 30/40] [api]: Fix retrieve lat/lng from FITS headers and Location --- api/src/main/kotlin/nebulosa/api/image/ImageService.kt | 4 ++-- nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index 4b813faa2..0e65de7c4 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -166,8 +166,8 @@ class ImageService( if (minorPlanets) { threadPoolTaskExecutor.submitCompletable { - val latitude = image.header.latitude ?: location?.latitude ?: 0.0 - val longitude = image.header.longitude ?: location?.longitude ?: 0.0 + val latitude = image.header.latitude ?: location?.latitude?.deg ?: 0.0 + val longitude = image.header.longitude ?: location?.longitude?.deg ?: 0.0 LOG.info( "finding minor planet annotations. dateTime={}, latitude={}, longitude={}, calibration={}", diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt index 50dd6a35c..d7b8b660d 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt @@ -57,10 +57,10 @@ inline val Header.gain get() = getDouble(NOAOExt.GAIN, 0.0) inline val Header.latitude - get() = (getDoubleOrNull(SBFitsExt.SITELAT) ?: getDoubleOrNull("LAT-OBS"))?.deg + get() = (getDoubleOrNull(SBFitsExt.SITELAT)?.deg ?: getDoubleOrNull("LAT-OBS"))?.deg inline val Header.longitude - get() = (getDoubleOrNull(SBFitsExt.SITELONG) ?: getDoubleOrNull("LONG-OBS"))?.deg + get() = (getDoubleOrNull(SBFitsExt.SITELONG)?.deg ?: getDoubleOrNull("LONG-OBS"))?.deg inline val Header.observationDate get() = getStringOrNull(Standard.DATE_OBS)?.let(LocalDateTime::parse) From 7dbe5f65aa9dde506946ee2757f3e887fcfa9bfc Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 12:25:27 -0300 Subject: [PATCH 31/40] [desktop]: Improve Field of View layout --- desktop/src/app/image/image.component.html | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/desktop/src/app/image/image.component.html b/desktop/src/app/image/image.component.html index 2ac264770..e2fb0d440 100644 --- a/desktop/src/app/image/image.component.html +++ b/desktop/src/app/image/image.component.html @@ -409,20 +409,18 @@
-
- Telescope - -
-
+
-
+
+
-
+
@@ -432,7 +430,8 @@ Resolution (px)
- +
Pixel Size (µm) @@ -483,7 +482,7 @@
--> -
+
Date: Tue, 19 Mar 2024 13:44:04 -0300 Subject: [PATCH 32/40] [desktop]: Send Location only if necessary --- desktop/src/app/atlas/atlas.component.ts | 44 +++++++++-------- .../interceptors/location.interceptor.ts | 10 ++-- desktop/src/shared/services/api.service.ts | 48 +++++++++---------- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index ba695d008..c70887e78 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -424,6 +424,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private refreshTimer?: Subscription private refreshTabCount = 0 + private location: Location + constructor( private app: AppComponent, private api: ApiService, @@ -446,13 +448,18 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, }) electron.on('LOCATION.CHANGED', event => { - ngZone.run(() => this.refreshTab(true, true, event)) + ngZone.run(() => { + this.location = event + this.refreshTab(true, true) + }) }) electron.on('DATA.CHANGED', event => { this.loadTabFromData(event) }) + this.location = this.preference.selectedLocation.get() + // TODO: Refresh graph and twilight if hours past 12 (noon) } @@ -690,10 +697,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, async refreshTab( refreshTwilight: boolean = false, refreshChart: boolean = false, - location?: Location, ) { - location ??= this.preference.selectedLocation.get() - this.refreshing = true this.refreshTabCount++ @@ -706,7 +710,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.dateTime.setMinutes(this.dateTimeMinute) } - this.app.subTitle = `${location.name} · ${moment(this.dateTime).format('YYYY-MM-DD HH:mm')}` + this.app.subTitle = `${this.location.name} · ${moment(this.dateTime).format('YYYY-MM-DD HH:mm')}` try { if (this.tab === undefined) { @@ -718,14 +722,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.name = 'Sun' this.tags = [] this.imageOfSun.nativeElement.src = `${this.api.baseUrl}/sky-atlas/sun/image` - const bodyPosition = await this.api.positionOfSun(location!, this.dateTime) + const bodyPosition = await this.api.positionOfSun(this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } // Moon. else if (this.tab === SkyAtlasTab.MOON) { this.name = 'Moon' this.tags = [] - const bodyPosition = await this.api.positionOfMoon(location!, this.dateTime) + const bodyPosition = await this.api.positionOfMoon(this.dateTime) Object.assign(this.bodyPosition, bodyPosition) this.moonIlluminated = this.bodyPosition.illuminated / 100.0 this.moonWaning = this.bodyPosition.leading @@ -736,7 +740,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.planet) { this.name = this.planet.name - const bodyPosition = await this.api.positionOfPlanet(location!, this.planet.code, this.dateTime) + const bodyPosition = await this.api.positionOfPlanet(this.planet.code, this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -754,7 +758,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.minorPlanet.pha) this.tags.push({ title: 'PHA', severity: 'danger' }) if (this.minorPlanet.neo) this.tags.push({ title: 'NEO', severity: 'warning' }) const code = `DES=${this.minorPlanet.spkId};` - const bodyPosition = await this.api.positionOfPlanet(location!, code, this.dateTime) + const bodyPosition = await this.api.positionOfPlanet(code, this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -767,7 +771,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.skyObject) { this.name = this.skyObjectPipe.transform(this.skyObject, 'name') - const bodyPosition = await this.api.positionOfSkyObject(location!, this.skyObject, this.dateTime) + const bodyPosition = await this.api.positionOfSkyObject(this.skyObject, this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -780,7 +784,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.satellite) { this.name = this.satellite.name - const bodyPosition = await this.api.positionOfSatellite(location!, this.satellite, this.dateTime) + const bodyPosition = await this.api.positionOfSatellite(this.satellite, this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -789,7 +793,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } if (this.refreshTabCount === 1 || refreshTwilight) { - const twilight = await this.api.twilight(location!, this.dateTime) + const twilight = await this.api.twilight(this.dateTime) this.altitudeData.datasets[0].data = [[0.0, 90], [twilight.civilDusk[0], 90]] this.altitudeData.datasets[1].data = [[twilight.civilDusk[0], 90], [twilight.civilDusk[1], 90]] this.altitudeData.datasets[2].data = [[twilight.nauticalDusk[0], 90], [twilight.nauticalDusk[1], 90]] @@ -803,29 +807,29 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } if (this.refreshTabCount === 1 || refreshChart) { - await this.refreshChart(location) + await this.refreshChart() } } finally { this.refreshing = false } } - private async refreshChart(location: Location) { + private async refreshChart() { // Sun. if (this.tab === SkyAtlasTab.SUN) { - const points = await this.api.altitudePointsOfSun(location!, this.dateTime) + const points = await this.api.altitudePointsOfSun(this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } // Moon. else if (this.tab === SkyAtlasTab.MOON) { - const points = await this.api.altitudePointsOfMoon(location!, this.dateTime) + const points = await this.api.altitudePointsOfMoon(this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } // Planet. else if (this.tab === SkyAtlasTab.PLANET && this.planet) { - const points = await this.api.altitudePointsOfPlanet(location!, this.planet.code, this.dateTime) + const points = await this.api.altitudePointsOfPlanet(this.planet.code, this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } @@ -833,7 +837,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, else if (this.tab === SkyAtlasTab.MINOR_PLANET) { if (this.minorPlanet) { const code = `DES=${this.minorPlanet.spkId};` - const points = await this.api.altitudePointsOfPlanet(location!, code, this.dateTime) + const points = await this.api.altitudePointsOfPlanet(code, this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } else { @@ -843,7 +847,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, // Sky Object. else if (this.tab === SkyAtlasTab.SKY_OBJECT) { if (this.skyObject) { - const points = await this.api.altitudePointsOfSkyObject(location!, this.skyObject, this.dateTime) + const points = await this.api.altitudePointsOfSkyObject(this.skyObject, this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } else { @@ -853,7 +857,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, // Satellite. else if (this.tab === SkyAtlasTab.SATELLITE) { if (this.satellite) { - const points = await this.api.altitudePointsOfSatellite(location!, this.satellite, this.dateTime) + const points = await this.api.altitudePointsOfSatellite(this.satellite, this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } else { diff --git a/desktop/src/shared/interceptors/location.interceptor.ts b/desktop/src/shared/interceptors/location.interceptor.ts index 3ee9339ea..79efda932 100644 --- a/desktop/src/shared/interceptors/location.interceptor.ts +++ b/desktop/src/shared/interceptors/location.interceptor.ts @@ -9,11 +9,13 @@ export class LocationInterceptor implements HttpInterceptor { constructor(private preference: PreferenceService) { } intercept(req: HttpRequest, next: HttpHandler): Observable> { - const selectedLocation = this.preference.selectedLocation.get() + if (req.urlWithParams.includes('hasLocation')) { + const selectedLocation = this.preference.selectedLocation.get() - req = req.clone({ - headers: req.headers.set('X-Location', JSON.stringify(selectedLocation)) - }) + req = req.clone({ + headers: req.headers.set('X-Location', JSON.stringify(selectedLocation)) + }) + } return next.handle(req) } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 3898b17e4..eda61dc42 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core' import moment from 'moment' import { DARVStart, TPPAStart } from '../types/alignment.types' -import { Angle, BodyPosition, CloseApproach, ComputedLocation, Constellation, DeepSkyObject, Location, MinorPlanet, Satellite, SatelliteGroupType, SkyObjectType, Twilight } from '../types/atlas.types' +import { Angle, BodyPosition, CloseApproach, ComputedLocation, Constellation, DeepSkyObject, MinorPlanet, Satellite, SatelliteGroupType, SkyObjectType, Twilight } from '../types/atlas.types' import { CalibrationFrame, CalibrationFrameGroup } from '../types/calibration.types' import { Camera, CameraStartCapture } from '../types/camera.types' import { Device, INDIProperty, INDISendProperty } from '../types/device.types' @@ -369,51 +369,51 @@ export class ApiService { // SKY ATLAS - positionOfSun(location: Location, dateTime: Date) { + positionOfSun(dateTime: Date) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ location: location.id, date, time }) + const query = this.http.query({ date, time, hasLocation: true }) return this.http.get(`sky-atlas/sun/position?${query}`) } - altitudePointsOfSun(location: Location, dateTime: Date) { + altitudePointsOfSun(dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/sun/altitude-points?${query}`) } - positionOfMoon(location: Location, dateTime: Date) { + positionOfMoon(dateTime: Date) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ location: location.id, date, time }) + const query = this.http.query({ date, time, hasLocation: true }) return this.http.get(`sky-atlas/moon/position?${query}`) } - altitudePointsOfMoon(location: Location, dateTime: Date) { + altitudePointsOfMoon(dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/moon/altitude-points?${query}`) } - positionOfPlanet(location: Location, code: string, dateTime: Date) { + positionOfPlanet(code: string, dateTime: Date) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ location: location.id, date, time }) + const query = this.http.query({ date, time, hasLocation: true }) return this.http.get(`sky-atlas/planets/${encodeURIComponent(code)}/position?${query}`) } - altitudePointsOfPlanet(location: Location, code: string, dateTime: Date) { + altitudePointsOfPlanet(code: string, dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/planets/${encodeURIComponent(code)}/altitude-points?${query}`) } - positionOfSkyObject(location: Location, simbad: DeepSkyObject, dateTime: Date) { + positionOfSkyObject(simbad: DeepSkyObject, dateTime: Date) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ location: location.id, date, time }) + const query = this.http.query({ date, time, hasLocation: true }) return this.http.get(`sky-atlas/sky-objects/${simbad.id}/position?${query}`) } - altitudePointsOfSkyObject(location: Location, simbad: DeepSkyObject, dateTime: Date) { + altitudePointsOfSkyObject(simbad: DeepSkyObject, dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/sky-objects/${simbad.id}/altitude-points?${query}`) } @@ -431,15 +431,15 @@ export class ApiService { return this.http.get(`sky-atlas/sky-objects/types`) } - positionOfSatellite(location: Location, satellite: Satellite, dateTime: Date) { + positionOfSatellite(satellite: Satellite, dateTime: Date) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ location: location.id, date, time }) + const query = this.http.query({ date, time, hasLocation: true }) return this.http.get(`sky-atlas/satellites/${satellite.id}/position?${query}`) } - altitudePointsOfSatellite(location: Location, satellite: Satellite, dateTime: Date) { + altitudePointsOfSatellite(satellite: Satellite, dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/satellites/${satellite.id}/altitude-points?${query}`) } @@ -448,9 +448,9 @@ export class ApiService { return this.http.get(`sky-atlas/satellites?${query}`) } - twilight(location: Location, dateTime: Date) { + twilight(dateTime: Date) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ location: location.id, date }) + const query = this.http.query({ date, hasLocation: true }) return this.http.get(`sky-atlas/twilight?${query}`) } @@ -470,7 +470,7 @@ export class ApiService { starsAndDSOs: boolean = true, minorPlanets: boolean = false, minorPlanetMagLimit: number = 12.0, ) { - const query = this.http.query({ path, starsAndDSOs, minorPlanets, minorPlanetMagLimit }) + const query = this.http.query({ path, starsAndDSOs, minorPlanets, minorPlanetMagLimit, hasLocation: true }) return this.http.get(`image/annotations?${query}`) } From 4fd5fd4d2d7d73ed8024cabe6c521950800ec43e Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 13:45:02 -0300 Subject: [PATCH 33/40] [desktop]: Show warning message if no close approaches was found --- desktop/src/app/atlas/atlas.component.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index c70887e78..71e23c877 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -3,7 +3,7 @@ import { ActivatedRoute } from '@angular/router' import { Chart, ChartData, ChartOptions } from 'chart.js' import zoomPlugin from 'chartjs-plugin-zoom' import moment from 'moment' -import { MenuItem } from 'primeng/api' +import { MenuItem, MessageService } from 'primeng/api' import { UIChart } from 'primeng/chart' import { ListboxChangeEvent } from 'primeng/listbox' import { OverlayPanel } from 'primeng/overlaypanel' @@ -435,6 +435,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private preference: PreferenceService, private skyObjectPipe: SkyObjectPipe, private prime: PrimeService, + private message: MessageService, ngZone: NgZone, ) { app.title = 'Sky Atlas' @@ -567,6 +568,10 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, try { this.closeApproaches = await this.api.closeApproachesForMinorPlanets(this.closeApproachDays, this.closeApproachDistance, this.dateTime) + + if (!this.closeApproaches.length) { + this.message.add({ severity: 'warn', detail: 'No close approaches found for the given days and lunar distance' }) + } } finally { this.refreshing = false } From e8dff8368ff317bb7587449dac2d4ef8b307678a Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 13:52:03 -0300 Subject: [PATCH 34/40] [desktop]: Use PrimeService to show messages --- desktop/src/app/atlas/atlas.component.ts | 5 ++--- desktop/src/app/framing/framing.component.ts | 6 +++--- desktop/src/app/home/home.component.ts | 7 ++++--- desktop/src/app/sequencer/sequencer.component.ts | 9 +++++---- .../device-list-menu/device-list-menu.component.ts | 7 ++++--- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index 71e23c877..b6b430f46 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -3,7 +3,7 @@ import { ActivatedRoute } from '@angular/router' import { Chart, ChartData, ChartOptions } from 'chart.js' import zoomPlugin from 'chartjs-plugin-zoom' import moment from 'moment' -import { MenuItem, MessageService } from 'primeng/api' +import { MenuItem } from 'primeng/api' import { UIChart } from 'primeng/chart' import { ListboxChangeEvent } from 'primeng/listbox' import { OverlayPanel } from 'primeng/overlaypanel' @@ -435,7 +435,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private preference: PreferenceService, private skyObjectPipe: SkyObjectPipe, private prime: PrimeService, - private message: MessageService, ngZone: NgZone, ) { app.title = 'Sky Atlas' @@ -570,7 +569,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.closeApproaches = await this.api.closeApproachesForMinorPlanets(this.closeApproachDays, this.closeApproachDistance, this.dateTime) if (!this.closeApproaches.length) { - this.message.add({ severity: 'warn', detail: 'No close approaches found for the given days and lunar distance' }) + this.prime.message('No close approaches found for the given days and lunar distance', 'warn') } } finally { this.refreshing = false diff --git a/desktop/src/app/framing/framing.component.ts b/desktop/src/app/framing/framing.component.ts index dde107d66..390825b78 100644 --- a/desktop/src/app/framing/framing.component.ts +++ b/desktop/src/app/framing/framing.component.ts @@ -1,10 +1,10 @@ import { AfterViewInit, Component, HostListener, NgZone, OnDestroy } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { MessageService } from 'primeng/api' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' import { LocalStorageService } from '../../shared/services/local-storage.service' +import { PrimeService } from '../../shared/services/prime.service' import { Angle } from '../../shared/types/atlas.types' import { HipsSurvey } from '../../shared/types/framing.types' import { AppComponent } from '../app.component' @@ -58,7 +58,7 @@ export class FramingComponent implements AfterViewInit, OnDestroy { private browserWindow: BrowserWindowService, private electron: ElectronService, private storage: LocalStorageService, - private message: MessageService, + private prime: PrimeService, ngZone: NgZone, ) { app.title = 'Framing' @@ -126,7 +126,7 @@ export class FramingComponent implements AfterViewInit, OnDestroy { } catch (e: any) { console.error(e) - this.message.add({ severity: 'error', detail: e.message || 'Failed to retrieve the image' }) + this.prime.message(e.message || 'Failed to retrieve the image', 'error') } finally { this.loading = false } diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index 04e3407b2..33239f4ad 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -1,12 +1,13 @@ import { AfterContentInit, Component, HostListener, NgZone, OnDestroy, ViewChild } from '@angular/core' import path from 'path' -import { MenuItem, MessageService } from 'primeng/api' +import { MenuItem } from 'primeng/api' import { DeviceListMenuComponent } from '../../shared/components/device-list-menu/device-list-menu.component' import { DialogMenuComponent } from '../../shared/components/dialog-menu/dialog-menu.component' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' +import { PrimeService } from '../../shared/services/prime.service' import { Camera } from '../../shared/types/camera.types' import { Device } from '../../shared/types/device.types' import { Focuser } from '../../shared/types/focuser.types' @@ -139,7 +140,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { private electron: ElectronService, private browserWindow: BrowserWindowService, private api: ApiService, - private message: MessageService, + private prime: PrimeService, private preference: PreferenceService, private ngZone: NgZone, ) { @@ -277,7 +278,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { } catch (e) { console.error(e) - this.message.add({ severity: 'error', detail: 'Connection failed' }) + this.prime.message('Connection failed', 'error') } finally { await this.updateConnection() } diff --git a/desktop/src/app/sequencer/sequencer.component.ts b/desktop/src/app/sequencer/sequencer.component.ts index 22b1ef9a8..48b1703ab 100644 --- a/desktop/src/app/sequencer/sequencer.component.ts +++ b/desktop/src/app/sequencer/sequencer.component.ts @@ -1,12 +1,13 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop' import { AfterContentInit, Component, HostListener, NgZone, OnDestroy, QueryList, ViewChildren } from '@angular/core' -import { MenuItem, MessageService } from 'primeng/api' +import { MenuItem } from 'primeng/api' import { CameraExposureComponent } from '../../shared/components/camera-exposure/camera-exposure.component' import { DialogMenuComponent } from '../../shared/components/dialog-menu/dialog-menu.component' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' import { LocalStorageService } from '../../shared/services/local-storage.service' +import { PrimeService } from '../../shared/services/prime.service' import { JsonFile } from '../../shared/types/app.types' import { Camera, CameraCaptureElapsed, CameraStartCapture, updateCameraStartCaptureFromCamera } from '../../shared/types/camera.types' import { Focuser } from '../../shared/types/focuser.types' @@ -119,7 +120,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy { private browserWindow: BrowserWindowService, private electron: ElectronService, private storage: LocalStorageService, - private message: MessageService, + private prime: PrimeService, ngZone: NgZone, ) { app.title = 'Sequencer' @@ -283,7 +284,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy { if (this.loadPlan(file.json)) { this.afterSavedJsonFile(file) } else { - this.message.add({ severity: 'warn', detail: `No entry found for the saved Sequence at: ${file.path}` }) + this.prime.message(`No entry found for the saved Sequence at: ${file.path}`, 'warn') this.add() } @@ -299,7 +300,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy { return this.loadSavedJsonFile(file) } - this.message.add({ severity: 'error', detail: `Failed to load the saved Sequence at: ${savedPath}` }) + this.prime.message(`Failed to load the saved Sequence at: ${savedPath}`, 'error') this.storage.delete(SEQUENCER_SAVED_PATH_KEY) } diff --git a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts index b854775fe..ee95b86a5 100644 --- a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts +++ b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts @@ -1,6 +1,7 @@ import { Component, Input, ViewChild } from '@angular/core' -import { MenuItem, MessageService } from 'primeng/api' +import { MenuItem } from 'primeng/api' import { SEPARATOR_MENU_ITEM } from '../../constants' +import { PrimeService } from '../../services/prime.service' import { Device } from '../../types/device.types' import { deviceComparator } from '../../utils/comparators' import { DialogMenuComponent } from '../dialog-menu/dialog-menu.component' @@ -24,7 +25,7 @@ export class DeviceListMenuComponent { @ViewChild('menu') private readonly menu!: DialogMenuComponent - constructor(private message: MessageService) { } + constructor(private prime: PrimeService) { } show(devices: T[]) { const model: MenuItem[] = [] @@ -32,7 +33,7 @@ export class DeviceListMenuComponent { return new Promise((resolve) => { if (devices.length <= 0) { resolve(undefined) - this.message.add({ severity: 'warn', detail: 'Please connect your equipment first!' }) + this.prime.message('Please connect your equipment first!', 'warn') return } From 979e4af4399add7e37cb3c3095d06b87ebbdbe9e Mon Sep 17 00:00:00 2001 From: tiagohm Date: Tue, 19 Mar 2024 13:56:35 -0300 Subject: [PATCH 35/40] [desktop]: Fix memory leak on Dialog Menu component --- .../src/shared/components/dialog-menu/dialog-menu.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts index 30667a16e..886f20d06 100644 --- a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts +++ b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts @@ -39,7 +39,6 @@ export class DialogMenuComponent { const size = this.items[this.items.length - 1].length if (size) { - console.info(size) this.viewportHeight = 35 * (size + 1) } else { this.hide() @@ -49,6 +48,7 @@ export class DialogMenuComponent { protected onShow() { const onItemClick = this.menu.onItemClick + this.items.length = 0 this.items.push(this.menu.processedItems) this.menu.onItemClick = (e) => { From 3e4f3cc1619f5bce8a42553c83c71dc15e49d7b9 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 20 Mar 2024 22:49:35 -0300 Subject: [PATCH 36/40] [desktop]: Remove electron-reloader --- desktop/app/main.ts | 1 - desktop/package-lock.json | 181 -------------------------------------- desktop/package.json | 1 - 3 files changed, 183 deletions(-) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index d059de45a..04d3ac859 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -196,7 +196,6 @@ function createWindow(options: OpenWindow, parent?: BrowserWindow) { const debug = require('electron-debug') debug({ showDevTools: false }) - require('electron-reloader')(module) window.loadURL(`http://localhost:4200/${options.path}?data=${data}`) } else { const url = new URL(path.join('file:', __dirname, `index.html`) + `#/${options.path}?data=${data}`) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index e166055a7..da0e60244 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -47,7 +47,6 @@ "electron": "29.1.0", "electron-builder": "24.12.0", "electron-debug": "3.2.0", - "electron-reloader": "1.2.3", "node-polyfill-webpack-plugin": "3.0.0", "npm-run-all": "4.1.5", "ts-node": "10.9.2", @@ -6870,18 +6869,6 @@ "node": ">=4" } }, - "node_modules/date-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7663,153 +7650,6 @@ "node": ">= 10.0.0" } }, - "node_modules/electron-reloader": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/electron-reloader/-/electron-reloader-1.2.3.tgz", - "integrity": "sha512-aDnACAzNg0QvQhzw7LYOx/nVS10mEtbuG6M0QQvNQcLnJEwFs6is+EGRCnM+KQlQ4KcTbdwnt07nd7ZjHpY4iw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "chokidar": "^3.5.0", - "date-time": "^3.1.0", - "electron-is-dev": "^1.2.0", - "find-up": "^5.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-reloader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-reloader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/electron-reloader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-reloader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/electron-reloader/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-reloader/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-reloader/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-reloader/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-reloader/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-reloader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.688", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.688.tgz", @@ -15056,15 +14896,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -16689,18 +16520,6 @@ "node": ">=6" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zone.js": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.4.tgz", diff --git a/desktop/package.json b/desktop/package.json index 733492d7e..0e9a2b939 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -66,7 +66,6 @@ "electron": "29.1.0", "electron-builder": "24.12.0", "electron-debug": "3.2.0", - "electron-reloader": "1.2.3", "node-polyfill-webpack-plugin": "3.0.0", "npm-run-all": "4.1.5", "ts-node": "10.9.2", From 479bea202c2b575739ee4a7a52c6c714f49c39ef Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 20 Mar 2024 22:51:19 -0300 Subject: [PATCH 37/40] [desktop]: Improve layout --- .../app/alignment/alignment.component.html | 26 +++++++++---------- .../flat-wizard/flat-wizard.component.html | 4 +-- .../app/sequencer/sequencer.component.html | 12 ++++----- .../shared/services/browser-window.service.ts | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/desktop/src/app/alignment/alignment.component.html b/desktop/src/app/alignment/alignment.component.html index 8df3eff29..98e3dacbd 100644 --- a/desktop/src/app/alignment/alignment.component.html +++ b/desktop/src/app/alignment/alignment.component.html @@ -6,18 +6,18 @@ @if (tab === 0) { + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" /> } @else { + icon="mdi mdi-close" size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + icon="mdi mdi-connection" size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" /> }
-
+
{{ status | enum | lowercase }} @@ -80,18 +80,18 @@
- Azimuth - {{ tppaAzimuthError }} - {{ tppaAzimuthErrorDirection }} + Azimuth + {{ tppaAzimuthError }} + {{ tppaAzimuthErrorDirection }}
- Altitude - {{ tppaAltitudeError }} - {{ tppaAltitudeErrorDirection }} + Altitude + {{ tppaAltitudeError }} + {{ tppaAltitudeErrorDirection }}
- Total - {{ tppaTotalError }} + Total + {{ tppaTotalError }}
diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.html b/desktop/src/app/flat-wizard/flat-wizard.component.html index 817820416..2d3bf722f 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.html +++ b/desktop/src/app/flat-wizard/flat-wizard.component.html @@ -6,9 +6,9 @@ + size="small" severity="danger" pTooltip="Disconnect" tooltipPosition="bottom" [text]="true" /> + size="small" severity="info" pTooltip="Connect" tooltipPosition="bottom" [text]="true" />
diff --git a/desktop/src/app/sequencer/sequencer.component.html b/desktop/src/app/sequencer/sequencer.component.html index 60950253d..69b4e197e 100644 --- a/desktop/src/app/sequencer/sequencer.component.html +++ b/desktop/src/app/sequencer/sequencer.component.html @@ -161,7 +161,7 @@
- +
@@ -169,16 +169,16 @@
#{{ i + 1 }}
-
+
- + (onClick)="showCameraDialog(entry)" size="small" /> -->
Date: Fri, 22 Mar 2024 20:57:15 -0300 Subject: [PATCH 38/40] [api]: Bump Gradle from 8.6 to 8.7 --- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2ea3535dc..e7646dead 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..25da30dbd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail From faa182229c7369d0a558a0af98b44c43af05bece Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 22 Mar 2024 22:32:21 -0300 Subject: [PATCH 39/40] [api]: Bump Kotlin from 2.0.0-Beta4 to 2.0.0-Beta5 --- build.gradle.kts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 19f7ae816..9ae1bb405 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,12 +1,13 @@ import com.adarshr.gradle.testlogger.TestLoggerExtension import com.adarshr.gradle.testlogger.theme.ThemeType import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0-Beta4") - classpath("org.jetbrains.kotlin:kotlin-allopen:2.0.0-Beta4") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0-Beta5") + classpath("org.jetbrains.kotlin:kotlin-allopen:2.0.0-Beta5") classpath("com.adarshr:gradle-test-logger-plugin:4.0.0") classpath("io.objectbox:objectbox-gradle-plugin:3.8.0") } @@ -60,8 +61,9 @@ subprojects { } tasks.withType { - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + freeCompilerArgs = listOf( "-Xjvm-default=all", "-Xjsr305=strict", "-opt-in=kotlin.io.path.ExperimentalPathApi", From 160c504e8197714a345b210798c61efd86c47f34 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 30 Mar 2024 13:37:58 -0300 Subject: [PATCH 40/40] [ci]: Run CI workflow on all PRs --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 297e27efc..5bc372b73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,12 +5,9 @@ on: branches: [ main ] paths: - '**.kt' - - '**/src/test/resources/**' pull_request: - branches: [ main ] paths: - '**.kt' - - '**/src/test/resources/**' workflow_dispatch: jobs: