33DashboardInstrument_Clock::DashboardInstrument_Clock(
34 wxWindow *parent, wxWindowID
id, wxString title,
39 if (format.Contains(
"LCL"))
43 m_Properties = Properties;
46void DashboardInstrument_Clock::SetData(
DASH_CAP,
double, wxString) {
50void DashboardInstrument_Clock::SetUtcTime(wxDateTime data) {
51 m_data = GetDisplayTime(data);
55wxString DashboardInstrument_Clock::GetDisplayTime(wxDateTime UTCtime) {
56 wxString result(
"---");
57 if (UTCtime.IsValid()) {
59 result = UTCtime.FormatISOTime().Append(
" UTC");
62 wxDateTime displayTime;
63 if (g_iUTCOffset != 0) {
64 wxTimeSpan offset(0, g_iUTCOffset * 30, 0);
65 displayTime = UTCtime.Add(offset);
67 displayTime = UTCtime.FromTimezone(wxDateTime::UTC);
69 result = displayTime.FormatISOTime().Append(
" LCL");
74DashboardInstrument_CPUClock::DashboardInstrument_CPUClock(
75 wxWindow *parent, wxWindowID
id, wxString title,
83void DashboardInstrument_CPUClock::SetData(
DASH_CAP,
double, wxString) {
87void DashboardInstrument_CPUClock::SetUtcTime(wxDateTime data) {
88 m_data = wxDateTime::Now().FormatISOTime().Append(
" CPU");
92DashboardInstrument_Moon::DashboardInstrument_Moon(
93 wxWindow *parent, wxWindowID
id, wxString title,
103wxSize DashboardInstrument_Moon::GetSize(
int orient, wxSize hint) {
106 int drawHeight = 10 + m_radius * 2;
107 InitTitleAndDataPosition(drawHeight);
108 int h = GetFullHeight(drawHeight);
110 if (orient == wxHORIZONTAL) {
111 return wxSize(DefaultWidth, wxMax(hint.y, h));
113 return wxSize(wxMax(hint.x, DefaultWidth), h);
117void DashboardInstrument_Moon::SetData(
DASH_CAP st,
double value,
120 m_hemisphere = (value < 0 ?
"S" :
"N");
124void DashboardInstrument_Moon::Draw(wxGCDC *dc) {
125 if (m_phase == -1 || m_hemisphere ==
"")
return;
127 wxSize sz = GetClientSize();
128 wxColour cl0, cl1, cl2;
130 dc->SetPen(*wxTRANSPARENT_PEN);
131 GetGlobalColor(
"DASHL", &cl0);
135 points[0].y = m_DataTop + m_radius * 2 + 6;
136 points[1].x = sz.x / 2;
137 points[1].y = m_DataTop + 10;
138 points[2].x = sz.x - 5;
139 points[2].y = m_DataTop + m_radius * 2 + 6;
140 dc->DrawPolygon(3, points, 0, 0);
142 int x = 2 + m_radius + (sz.x - m_radius - 2) / 8 * m_phase;
143 int y = m_DataTop + m_radius + 5;
146 int startangle = (m_hemisphere == _(
"N") ? -90 : 90);
148 GetGlobalColor(
"DASH2", &cl0);
149 GetGlobalColor(
"DASH1", &cl1);
150 GetGlobalColor(
"DASHF", &cl2);
153 dc->DrawCircle(x, y, m_radius);
159 dc->SetBrush(*wxTRANSPARENT_BRUSH);
160 dc->DrawCircle(x, y, m_radius);
163 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
164 m_radius * 2, startangle, startangle + 180);
166 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
167 m_radius * 2, startangle, startangle + 180);
171 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
172 m_radius * 2, startangle, startangle + 180);
176 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
177 m_radius * 2, -startangle, 180 - startangle);
178 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
179 m_radius * 2, startangle, startangle + 180);
182 dc->DrawCircle(x, y, m_radius);
185 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
186 m_radius * 2, -startangle, 180 - startangle);
187 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
188 m_radius * 2, startangle, startangle + 180);
191 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
192 m_radius * 2, -startangle, 180 - startangle);
195 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
196 m_radius * 2, -startangle, 180 - startangle);
198 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
199 m_radius * 2, -startangle, 180 - startangle);
203 dc->SetBrush(*wxTRANSPARENT_BRUSH);
204 dc->DrawCircle(x, y, m_radius);
207void DashboardInstrument_Moon::SetUtcTime(wxDateTime data) {
208 if (data.IsValid()) {
209 m_phase = moon_phase(data.GetYear(), data.GetMonth() + 1, data.GetDay());
214int DashboardInstrument_Moon::moon_phase(
int y,
int m,
int d) {
232 jd = c + e + d - 694039.09;
245#define PI 3.1415926535897931160E0
247#define DEGREE (PI / 180.0)
248#define RADIAN (180.0 / PI)
252#define ZENITH_OFFICIAL (90.0 + 50.0 / 60.0)
253#define ZENITH_CIVIL 96.0
254#define ZENITH_NAUTICAL 102.0
255#define ZENITH_ASTRONOMICAL 108.0
258wxDateTime convHrmn(
double dhr) {
261 mn = (dhr - (double)hr) * 60;
262 return wxDateTime(hr, mn);
265DashboardInstrument_Sun::DashboardInstrument_Sun(
266 wxWindow *parent, wxWindowID
id, wxString title,
272 m_lat = m_lon = 999.9;
273 m_dt = wxDateTime::Now().ToUTC();
278wxSize DashboardInstrument_Sun::GetSize(
int orient, wxSize hint) {
281 InitDataTextHeight(
"00:00:00 UTC", w);
284 m_DataTextHeight * 2 + m_DataTextHeight * g_TitleVerticalOffset;
285 InitTitleAndDataPosition(drawHeight);
286 int h = GetFullHeight(drawHeight);
288 if (orient == wxHORIZONTAL) {
289 return wxSize(wxMax(w + m_DataMargin, DefaultWidth), wxMax(hint.y, h));
291 return wxSize(wxMax(hint.x, wxMax(w + m_DataMargin, DefaultWidth)), h);
295void DashboardInstrument_Sun::Draw(wxGCDC *dc) {
299 x1 = x2 = m_DataMargin;
301 if (m_DataRightAlign) {
303 dc->GetTextExtent(m_sunrise, &w, &h, 0, 0);
304 x1 = GetClientSize().GetWidth() - w - m_DataMargin;
305 dc->GetTextExtent(m_sunset, &w, &h, 0, 0);
306 x2 = GetClientSize().GetWidth() - w - m_DataMargin;
309 dc->DrawText(m_sunrise, x1, m_DataTop);
310 dc->DrawText(m_sunset, x2, m_DataTop + m_DataTextHeight);
313void DashboardInstrument_Sun::SetUtcTime(wxDateTime data) {
314 if (data.IsValid()) m_dt = data;
316 if ((m_lat != 999.9) && (m_lon != 999.9)) {
317 wxDateTime sunrise, sunset;
318 calculateSun(m_lat, m_lon, sunrise, sunset);
319 if (sunrise.GetYear() != 999)
320 m_sunrise = GetDisplayTime(sunrise);
323 if (sunset.GetYear() != 999)
324 m_sunset = GetDisplayTime(sunset);
333void DashboardInstrument_Sun::SetData(
DASH_CAP st,
double data, wxString
unit) {
334 if (!std::isnan(data)) {
343void DashboardInstrument_Sun::calculateSun(
double latit,
double longit,
345 wxDateTime &sunset) {
378 int n = m_dt.GetDayOfYear();
389 double lngHour = longit / 15;
390 double tris = n + ((6 - lngHour) / 24);
391 double tset = n + ((18 - lngHour) / 24);
398 double mris = (0.9856 * tris) - 3.289;
399 double mset = (0.9856 * tset) - 3.289;
407 double lris = mris + (1.916 * sin(DEGREE * mris)) +
408 (0.020 * sin(2 * DEGREE * mris)) + 282.634;
409 if (lris > 360) lris -= 360;
410 if (lris < 0) lris += 360;
411 double lset = mset + (1.916 * sin(DEGREE * mset)) +
412 (0.020 * sin(2 * DEGREE * mset)) + 282.634;
413 if (lset > 360) lset -= 360;
414 if (lset < 0) lset += 360;
422 double raris = RADIAN * atan(0.91764 * tan(DEGREE * lris));
423 if (raris > 360) raris -= 360;
424 if (raris < 0) raris += 360;
425 double raset = RADIAN * atan(0.91764 * tan(DEGREE * lset));
426 if (raset > 360) raset -= 360;
427 if (raset < 0) raset += 360;
435 double lqris = (floor(lris / 90)) * 90;
436 double raqris = (floor(raris / 90)) * 90;
437 raris = raris + (lqris - raqris);
438 double lqset = (floor(lset / 90)) * 90;
439 double raqset = (floor(raset / 90)) * 90;
440 raset = raset + (lqset - raqset);
454 double sinDecris = 0.39782 * sin(DEGREE * lris);
455 double cosDecris = cos(asin(sinDecris));
456 double sinDecset = 0.39782 * sin(DEGREE * lset);
457 double cosDecset = cos(asin(sinDecset));
468 double cosZenith = cos(DEGREE * ZENITH_OFFICIAL);
469 double coshris = (cosZenith - (sinDecris * sin(DEGREE * latit))) /
470 (cosDecris * cos(DEGREE * latit));
471 double coshset = (cosZenith - (sinDecset * sin(DEGREE * latit))) /
472 (cosDecset * cos(DEGREE * latit));
473 bool neverrises =
false;
474 if (coshris > 1) neverrises =
true;
478 bool neversets =
false;
479 if (coshset < -1) neversets =
true;
493 double hris = 360 - RADIAN * acos(coshris);
495 double hset = RADIAN * acos(coshset);
502 tris = hris + raris - (0.06571 * tris) - 6.622;
503 tset = hset + raset - (0.06571 * tset) - 6.622;
511 double utris = tris - lngHour;
512 if (utris > 24) utris -= 24;
513 if (utris < 0) utris += 24;
514 double utset = tset - lngHour;
515 if (utset > 24) utset -= 24;
516 if (utset < 0) utset += 24;
518 sunrise = convHrmn(utris);
519 if (neverrises) sunrise.SetYear(999);
520 sunset = convHrmn(utset);
521 if (neversets) sunset.SetYear(999);
A dashboard instrument that displays the GNSS clock time, if available.
Dashboard clock instrument.
@ OCPN_DBP_STC_LON
Longitude.
@ OCPN_DBP_STC_LAT
Latitude.