You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -11,21 +11,22 @@ Aplikasi ini berfokus murni pada penyediaan REST API untuk perhitungan **tanggal
11
11
12
12
## 🧠 Perencanaan
13
13
14
-
Proyek ini telah dire-write dari Python/FastAPI ke **Golang** untuk memaksimalkan performa dan konkurensi, menggunakan binding ke pustaka **NASA SPICE (CSPICE)**.
14
+
Aplikasi ini dibangun menggunakan **Golang** untuk memaksimalkan performa dan konkurensi, dengan integrasi langsung ke pustaka **NASA SPICE (CSPICE)** melalui CGO. Hal ini memungkinkan perhitungan astronomi dilakukan dengan standar ketelitian tingkat wahana antariksa.
15
15
16
16
1. Data astronomi dikalkulasi dari ephemeris riil NASA JPL `de440s.bsp` untuk tingkat ketelitian luar angkasa.
17
17
2. Menjembatani perbedaan metode penetapan Hijriyah (KHGT, Umm al-Qura, MABIMS, Wujudul Hilal) di dalam satu platform.
18
-
3. Memastikan pergantian hari Hijriyah **tepat saat Matahari terbenam** (Maghrib lokal pengamat).
18
+
3. Memastikan pergantian hari Hijriyah **tepat saat Matahari terbenam** (Maghrib lokal pengamat) dengan pencarian *bisection* presisi.
19
19
20
20
---
21
21
22
22
## ✨ Fitur Utama
23
23
24
24
- 📡 **Real-time Lunar Telemetry**: Sinkronisasi dan perhitungan lintasan matahari dan bulan dengan CSPICE.
25
-
- 🌅 **Precise Sunset/Fajr Bisection**: Bisection search presisi tinggi 24 jam untuk mendeteksi maghrib dan subuh lintas batasan zona waktu.
25
+
- 🌅 **Precise Solar Events**: Deteksi *Maghrib* (Sunset) dan *Subuh* (Fajr) menggunakan metode *bisection search* 24 jam untuk akurasi tinggi di berbagai lintang.
26
+
- 🕋 **Prayer Times Engine**: Perhitungan jadwal shalat multi-metode (Kemenag, MWL, ISNA, Umm Al-Qura, dll) dengan dukungan koreksi lintang tinggi.
26
27
- 🧪 **Multi-Method Engine**:
27
-
- 🌍 **KHGT**: Kalender Hijriyah Global Tunggal (Turki 2016).
28
-
- 🕋 **Umm al-Qura**: Standar otoritas Makkah.
28
+
- 🌍 **KHGT**: Kalender Hijriyah Global Tunggal (Turki 2016) dengan pemindaian visibilitas global.
29
+
- 🕋 **Umm al-Qura**: Standar kalender resmi Arab Saudi (Makkah).
29
30
- 🔢 **Hisab**: Berdasarkan Wujudul Hilal.
30
31
- 🔭 **Rukyatul Hilal**: Berdasarkan kriteria MABIMS (2022).
31
32
- 🔮 **Global Scan Optimizations**: Scan visibilitas komprehensif dari barat (Benua Amerika) untuk hisab global dengan koreksi ekuinoks/midnight UTC.
@@ -38,7 +39,7 @@ Proyek ini telah dire-write dari Python/FastAPI ke **Golang** untuk memaksimalka
38
39
39
40
-**Golang**: Bahasa yang sangat cepat dengan concurrency yang handal.
40
41
-**Gin**: HTTP Web framework yang simpel dan cepat.
41
-
-**CGO & CSPICE**: Toolkit geometri navigasi antariksa standar NASA yang ditautkan via CGO.
42
+
-**CGO & CSPICE**: Menggunakan `spice_bridge.go` untuk mengakses fungsi CSPICE secara aman dengan mekanisme `sync.Mutex` karena keterbatasan *thread-safety* pada pustaka C asli.
42
43
-**Docker**: Siap deploy dimana saja secara konsisten dengan multi-stage build.
|`/api/v4/hijri/date?lat={lat}&lon={lon}`| GET | Perhitungan prediksi bulan | lat, lon |
82
-
|`/api/v4/moon/telemetry?lat={lat}&lon={lon}`| GET | Informasi bulan berdasarkan lokasi pengguna | lat, lon, altitude, elongation, azimuth, distance km, illumination, phase, time |
Copy file name to clipboardExpand all lines: docs/astronomical-model.md
+78Lines changed: 78 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,6 +18,84 @@ untuk menghitung posisi Matahari dan Bulan menggunakan binding ke pustaka NASA S
18
18
- Analisis Elongasi Geosentrik (Sudut pisah pusat Bumi-Bulan-Matahari) dan Toposentrik.
19
19
- Prediksi Konjungsi Presisi (Ijtima).
20
20
21
+
## 🌦 Refraksi Atmosfer
22
+
23
+
Untuk kriteria berbasis Toposentrik (seperti MABIMS), sistem menerapkan koreksi refraksi atmosfer pada fungsi `ApplyRefraction`.
24
+
Kami menggunakan model aproksimasi Bennett/Sæmundsson yang menghitung deviasi cahaya berdasarkan ketinggian geometris hilal. Hal ini sangat krusial karena hilal yang secara geometris berada di bawah ufuk bisa jadi terlihat secara visual karena pembiasan atmosfer.
Sistem ini mengintegrasikan pustaka **CSPICE** (versi C dari toolkit SPICE NASA) ke dalam ekosistem **Golang** untuk mendapatkan akurasi tingkat tinggi yang setara dengan navigasi wahana antariksa.
29
+
30
+
### 1. Integrasi CGO
31
+
32
+
Karena CSPICE adalah pustaka berbasis C, kami menggunakan **CGO** sebagai jembatan. File `spice_bridge.go` bertindak sebagai *wrapper* yang memetakan fungsi-fungsi C (seperti `spkpos_c`, `str2et_c`, `furnsh_c`) ke fungsi Go. Hal ini memungkinkan logika bisnis kalender tetap berada di level tinggi (Go) sementara perhitungan geometri astronomi yang kompleks dilakukan oleh mesin SPICE yang sudah teruji.
33
+
34
+
### 2. Keterbatasan Thread-Safety
35
+
36
+
Pustaka CSPICE asli **tidak bersifat thread-safe**. Pustaka ini menggunakan variabel statis dan global internal untuk manajemen state (seperti error handling dan pool kernel). Jika dua goroutine mencoba memanggil fungsi SPICE secara bersamaan, hal ini dapat menyebabkan *memory corruption*, hasil kalkulasi yang tidak konsisten, atau aplikasi berhenti mendadak (*crash*).
37
+
38
+
### 3. Mekanisme `sync.Mutex`
39
+
40
+
Untuk mengatasi masalah keamanan thread tersebut, aplikasi ini menerapkan kebijakan **Global Lock** menggunakan `sync.Mutex` (didefinisikan sebagai `spiceMu`).
41
+
42
+
Setiap kali fungsi jembatan astronomi dipanggil:
43
+
44
+
1.`spiceMu.Lock()` dijalankan untuk memastikan hanya satu goroutine yang memiliki akses ke engine SPICE pada satu waktu.
45
+
2. Fungsi internal SPICE dieksekusi melalui CGO.
46
+
3.`spiceMu.Unlock()` (biasanya melalui `defer`) dijalankan segera setelah operasi selesai untuk memberikan giliran kepada goroutine lain.
47
+
48
+
**Dampak Performa:**
49
+
Meskipun akses ke SPICE dilakukan secara berurutan (*serialized*), performa sistem tetap sangat tinggi. Hal ini dikarenakan:
50
+
51
+
- Operasi matematika SPICE sangat efisien dan berbasis memori.
52
+
- Bottleneck aplikasi biasanya berada pada I/O jaringan, bukan pada kecepatan CPU dalam menghitung orbit.
53
+
- Mekanisme ini jauh lebih aman dan stabil untuk lingkungan server yang melayani banyak permintaan secara konkuren.
54
+
55
+
## 🏗 Setup Environment CGO & CSPICE
56
+
57
+
Untuk mengompilasi proyek ini, sistem Anda harus memiliki compiler C (GCC/Clang) dan library CSPICE yang sudah terpasang di struktur folder yang benar.
58
+
59
+
### 1. Persyaratan Sistem
60
+
61
+
-**Linux/macOS**: GCC atau Clang terpasang.
62
+
-**Windows**: MSYS2 atau MinGW-w64.
63
+
-**Go**: Versi 1.25+ dengan `CGO_ENABLED=1`.
64
+
65
+
### 2. Download CSPICE Toolkit
66
+
67
+
Unduh toolkit sesuai dengan arsitektur sistem Anda dari NASA NAIF Website. [Klik di sini](https://naif.jpl.nasa.gov/pub/naif/toolkit/C/).
68
+
69
+
### 3. Struktur Direktori Library
70
+
71
+
Berdasarkan arahan `#cgo` di `core/astronomy/spice_bridge.go`, library harus diletakkan sebagai berikut:
72
+
73
+
```plaintext
74
+
core/astronomy/
75
+
├── include/ <-- Salin semua file .h dari direktori 'include' CSPICE
76
+
│ ├── SpiceUsr.h
77
+
│ ├── SpiceZpl.h
78
+
│ └── ...
79
+
├── lib/ <-- Salin file library (.a atau .so) dari direktori 'lib'
80
+
│ ├── cspice.a
81
+
│ └── csupport.a
82
+
└── spice_bridge.go
83
+
```
84
+
85
+
### 4. Kompilasi
86
+
87
+
Pastikan variabel lingkungan `CGO_ENABLED` aktif saat melakukan build:
88
+
89
+
```bash
90
+
# Linux / macOS
91
+
CGO_ENABLED=1 go build -o hilal-engine ./cmd/api
92
+
93
+
# Windows (PowerShell)
94
+
$env:CGO_ENABLED="1"; go build -o hilal-engine.exe ./cmd/api
95
+
```
96
+
97
+
*Catatan: Jika Anda menggunakan Docker, proses ini sudah diotomatisasi di dalam Dockerfile menggunakan multi-stage build untuk memastikan library C ter-link secara statis atau tersedia di runtime.*
98
+
21
99
## Catatan
22
100
23
101
- Sistem ini **tidak menggantikan observasi lapangan** (Rukyatul Hilal aktual).
Copy file name to clipboardExpand all lines: docs/calendar-logic.md
+12-10Lines changed: 12 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,16 +13,18 @@ yang dikomputasi oleh API Golang v4.
13
13
## Alur Orkestrasi (Service Layer)
14
14
15
15
1. Tentukan target `Date` (UTC) dan lokasi `Lat/Lon`.
16
-
2. Hitung waktu sunset (Maghrib) lokal via Bisection Search 24H.
17
-
3. Tentukan Ijtima (konjungsi) menggunakan pencarian dinamis (FindPreviousIjtima), bukan berdasarkan data tabular statis.
18
-
4. Tentukan apakah waktu request *sebelum* atau *sesudah* Maghrib.
19
-
5. Jalankan Evaluasi Multi-Metode:
20
-
-**KHGT (Global)**: Melakukan scan global (65° LU/LS) untuk mencari terpenuhinya kriteria Turki 2016 sebelum dan sesudah 24:00 UTC, termasuk *override* Ijtima Selandia Baru. Menggunakan parameter **Geosentris**.
21
-
-**Hisab Lokal**:
22
-
-**MABIMS**: Menggunakan proyeksi **Toposentrik** (termasuk refraksi atmosfer untuk ketinggian nyata).
23
-
-**Wujudul Hilal**: Menggunakan proyeksi **Geosentris**.
24
-
-**Umm al-Qura**: Mencocokkan dengan standar observatorium Makkah (Toposentris).
16
+
2. Ambil tanggal Hijriyah **Tabular** sebagai pijakan awal untuk estimasi bulan dan tahun (`baseH`).
17
+
3. Cari waktu **Ijtima (Konjungsi)** sebelumnya dalam rentang 30 hari menggunakan `FindPreviousIjtima`.
18
+
4. Tentukan waktu evaluasi (Sunset/Maghrib) berdasarkan kriteria:
19
+
-**UMM_AL_QURA**: Lokasi Makkah.
20
+
-**MABIMS**: Lokasi Sabang (titik barat Indonesia).
21
+
-**Lokal**: Lokasi observer (`lat/lon`).
22
+
-**KHGT**: Pemindaian Global (tidak terikat satu lokasi).
23
+
5. Tentukan apakah waktu request *sebelum* atau *sesudah* Maghrib.
24
+
6. Tentukan `monthStartDate` (H+1 atau H+2 dari Ijtima) berdasarkan hasil evaluasi kriteria (`isNewMonth`).
25
+
7. Hitung selisih hari (`daysElapsed`) antara target dengan awal bulan.
26
+
8. Lakukan koreksi **Rollover** (jika `hDay < 1` atau `hDay > 30`) untuk menyesuaikan bulan dan tahun secara dinamis.
25
27
26
28
## Mengatasi Limitasi "Hari H+1"
27
29
28
-
Sistem menggunakan fungsi pembantu `PredictHijriDate` untuk mengeliminasi statik +1 hari. Ini memastikan bulan ber-rollover dengan dinamis (menjadi hari ke-1 bulan selanjutnya) jika Hisab menyatakan wujud/imkanur rukyat, dan mengunci ke hari ke-30 (Istikmal) apabila tidak terlihat.
30
+
Sistem secara dinamis menghitung hari Hijriyah (`hDay`) berdasarkan selisih waktu antara tanggal yang diminta dengan `monthStartDate` yang sudah dievaluasi. Logika ini memastikan pergantian bulan (rollover) terjadi secara akurat: menjadi hari ke-1 bulan selanjutnya jika kriteria hisab/rukyat terpenuhi, atau mengunci ke hari ke-30 (Istikmal) apabila hilal tidak terlihat. Penyesuaian bulan dan tahun juga dilakukan secara otomatis jika `hDay` berada di luar rentang bulan saat ini.
0 commit comments