43DashboardInstrument_Clock::DashboardInstrument_Clock(
44 wxWindow *parent, wxWindowID
id, wxString title,
49 if (format.Contains(_T(
"LCL" )))
53 m_Properties = Properties;
56void DashboardInstrument_Clock::SetData(DASH_CAP,
double, wxString) {
60void DashboardInstrument_Clock::SetUtcTime(wxDateTime data) {
61 m_data = GetDisplayTime(data);
65wxString DashboardInstrument_Clock::GetDisplayTime(wxDateTime UTCtime) {
66 wxString result(_T(
"---" ));
67 if (UTCtime.IsValid()) {
69 result = UTCtime.FormatISOTime().Append(_T(
" UTC" ));
72 wxDateTime displayTime;
73 if (g_iUTCOffset != 0) {
74 wxTimeSpan offset(0, g_iUTCOffset * 30, 0);
75 displayTime = UTCtime.Add(offset);
77 displayTime = UTCtime.FromTimezone(wxDateTime::UTC);
79 result = displayTime.FormatISOTime().Append(_T(
" LCL" ));
84DashboardInstrument_CPUClock::DashboardInstrument_CPUClock(
85 wxWindow *parent, wxWindowID
id, wxString title,
89 m_cap_flag.set(OCPN_DBP_STC_LON);
90 m_cap_flag.set(OCPN_DBP_STC_CLK);
93void DashboardInstrument_CPUClock::SetData(DASH_CAP,
double, wxString) {
97void DashboardInstrument_CPUClock::SetUtcTime(wxDateTime data) {
98 m_data = wxDateTime::Now().FormatISOTime().Append(_T(
" CPU" ));
102DashboardInstrument_Moon::DashboardInstrument_Moon(
103 wxWindow *parent, wxWindowID
id, wxString title,
107 m_cap_flag.set(OCPN_DBP_STC_LAT);
110 m_hemisphere = _T(
"");
113wxSize DashboardInstrument_Moon::GetSize(
int orient, wxSize hint) {
116 int drawHeight = 10 + m_radius * 2;
117 InitTitleAndDataPosition(drawHeight);
118 int h = GetFullHeight(drawHeight);
120 if (orient == wxHORIZONTAL) {
121 return wxSize(DefaultWidth, wxMax(hint.y, h));
123 return wxSize(wxMax(hint.x, DefaultWidth), h);
127void DashboardInstrument_Moon::SetData(DASH_CAP st,
double value,
129 if (st == OCPN_DBP_STC_LAT && !std::isnan(value)) {
130 m_hemisphere = (value < 0 ? _T(
"S") : _T(
"N"));
134void DashboardInstrument_Moon::Draw(wxGCDC *dc) {
135 if (m_phase == -1 || m_hemisphere == _T(
""))
return;
137 wxSize sz = GetClientSize();
138 wxColour cl0, cl1, cl2;
140 dc->SetPen(*wxTRANSPARENT_PEN);
141 GetGlobalColor(_T(
"DASHL"), &cl0);
145 points[0].y = m_DataTop + m_radius * 2 + 6;
146 points[1].x = sz.x / 2;
147 points[1].y = m_DataTop + 10;
148 points[2].x = sz.x - 5;
149 points[2].y = m_DataTop + m_radius * 2 + 6;
150 dc->DrawPolygon(3, points, 0, 0);
152 int x = 2 + m_radius + (sz.x - m_radius - 2) / 8 * m_phase;
153 int y = m_DataTop + m_radius + 5;
156 int startangle = (m_hemisphere == _(
"N") ? -90 : 90);
158 GetGlobalColor(_T(
"DASH2"), &cl0);
159 GetGlobalColor(_T(
"DASH1"), &cl1);
160 GetGlobalColor(_T(
"DASHF"), &cl2);
163 dc->DrawCircle(x, y, m_radius);
169 dc->SetBrush(*wxTRANSPARENT_BRUSH);
170 dc->DrawCircle(x, y, m_radius);
173 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
174 m_radius * 2, startangle, startangle + 180);
176 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
177 m_radius * 2, startangle, startangle + 180);
181 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
182 m_radius * 2, startangle, startangle + 180);
186 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
187 m_radius * 2, -startangle, 180 - startangle);
188 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
189 m_radius * 2, startangle, startangle + 180);
192 dc->DrawCircle(x, y, m_radius);
195 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
196 m_radius * 2, -startangle, 180 - startangle);
197 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
198 m_radius * 2, startangle, startangle + 180);
201 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
202 m_radius * 2, -startangle, 180 - startangle);
205 dc->DrawEllipticArc(x - m_radius, m_DataTop + 5, m_radius * 2,
206 m_radius * 2, -startangle, 180 - startangle);
208 dc->DrawEllipticArc(x - m_radius / 2, m_DataTop + 5, m_radius,
209 m_radius * 2, -startangle, 180 - startangle);
213 dc->SetBrush(*wxTRANSPARENT_BRUSH);
214 dc->DrawCircle(x, y, m_radius);
217void DashboardInstrument_Moon::SetUtcTime(wxDateTime data) {
218 if (data.IsValid()) {
219 m_phase = moon_phase(data.GetYear(), data.GetMonth() + 1, data.GetDay());
224int DashboardInstrument_Moon::moon_phase(
int y,
int m,
int d) {
242 jd = c + e + d - 694039.09;
255#define PI 3.1415926535897931160E0
257#define DEGREE (PI / 180.0)
258#define RADIAN (180.0 / PI)
262#define ZENITH_OFFICIAL (90.0 + 50.0 / 60.0)
263#define ZENITH_CIVIL 96.0
264#define ZENITH_NAUTICAL 102.0
265#define ZENITH_ASTRONOMICAL 108.0
268wxDateTime convHrmn(
double dhr) {
271 mn = (dhr - (double)hr) * 60;
272 return wxDateTime(hr, mn);
275DashboardInstrument_Sun::DashboardInstrument_Sun(
276 wxWindow *parent, wxWindowID
id, wxString title,
280 m_cap_flag.set(OCPN_DBP_STC_LON);
281 m_cap_flag.set(OCPN_DBP_STC_CLK);
282 m_lat = m_lon = 999.9;
283 m_dt = wxDateTime::Now().ToUTC();
284 m_sunrise = _T(
"---");
285 m_sunset = _T(
"---");
288wxSize DashboardInstrument_Sun::GetSize(
int orient, wxSize hint) {
291 InitDataTextHeight(_T(
"00:00:00 UTC"), w);
294 m_DataTextHeight * 2 + m_DataTextHeight * g_TitleVerticalOffset;
295 InitTitleAndDataPosition(drawHeight);
296 int h = GetFullHeight(drawHeight);
298 if (orient == wxHORIZONTAL) {
299 return wxSize(wxMax(w + m_DataMargin, DefaultWidth), wxMax(hint.y, h));
301 return wxSize(wxMax(hint.x, wxMax(w + m_DataMargin, DefaultWidth)), h);
305void DashboardInstrument_Sun::Draw(wxGCDC *dc) {
309 x1 = x2 = m_DataMargin;
311 if (m_DataRightAlign) {
313 dc->GetTextExtent(m_sunrise, &w, &h, 0, 0);
314 x1 = GetClientSize().GetWidth() - w - m_DataMargin;
315 dc->GetTextExtent(m_sunset, &w, &h, 0, 0);
316 x2 = GetClientSize().GetWidth() - w - m_DataMargin;
319 dc->DrawText(m_sunrise, x1, m_DataTop);
320 dc->DrawText(m_sunset, x2, m_DataTop + m_DataTextHeight);
323void DashboardInstrument_Sun::SetUtcTime(wxDateTime data) {
324 if (data.IsValid()) m_dt = data;
326 if ((m_lat != 999.9) && (m_lon != 999.9)) {
327 wxDateTime sunrise, sunset;
328 calculateSun(m_lat, m_lon, sunrise, sunset);
329 if (sunrise.GetYear() != 999)
330 m_sunrise = GetDisplayTime(sunrise);
332 m_sunrise = _T(
"---");
333 if (sunset.GetYear() != 999)
334 m_sunset = GetDisplayTime(sunset);
336 m_sunset = _T(
"---");
338 m_sunrise = _T(
"---" );
339 m_sunset = _T(
"---" );
343void DashboardInstrument_Sun::SetData(DASH_CAP st,
double data, wxString
unit) {
344 if (!std::isnan(data)) {
345 if (st == OCPN_DBP_STC_LAT) {
347 }
else if (st == OCPN_DBP_STC_LON) {
353void DashboardInstrument_Sun::calculateSun(
double latit,
double longit,
355 wxDateTime &sunset) {
388 int n = m_dt.GetDayOfYear();
399 double lngHour = longit / 15;
400 double tris = n + ((6 - lngHour) / 24);
401 double tset = n + ((18 - lngHour) / 24);
408 double mris = (0.9856 * tris) - 3.289;
409 double mset = (0.9856 * tset) - 3.289;
417 double lris = mris + (1.916 * sin(DEGREE * mris)) +
418 (0.020 * sin(2 * DEGREE * mris)) + 282.634;
419 if (lris > 360) lris -= 360;
420 if (lris < 0) lris += 360;
421 double lset = mset + (1.916 * sin(DEGREE * mset)) +
422 (0.020 * sin(2 * DEGREE * mset)) + 282.634;
423 if (lset > 360) lset -= 360;
424 if (lset < 0) lset += 360;
432 double raris = RADIAN * atan(0.91764 * tan(DEGREE * lris));
433 if (raris > 360) raris -= 360;
434 if (raris < 0) raris += 360;
435 double raset = RADIAN * atan(0.91764 * tan(DEGREE * lset));
436 if (raset > 360) raset -= 360;
437 if (raset < 0) raset += 360;
445 double lqris = (floor(lris / 90)) * 90;
446 double raqris = (floor(raris / 90)) * 90;
447 raris = raris + (lqris - raqris);
448 double lqset = (floor(lset / 90)) * 90;
449 double raqset = (floor(raset / 90)) * 90;
450 raset = raset + (lqset - raqset);
464 double sinDecris = 0.39782 * sin(DEGREE * lris);
465 double cosDecris = cos(asin(sinDecris));
466 double sinDecset = 0.39782 * sin(DEGREE * lset);
467 double cosDecset = cos(asin(sinDecset));
478 double cosZenith = cos(DEGREE * ZENITH_OFFICIAL);
479 double coshris = (cosZenith - (sinDecris * sin(DEGREE * latit))) /
480 (cosDecris * cos(DEGREE * latit));
481 double coshset = (cosZenith - (sinDecset * sin(DEGREE * latit))) /
482 (cosDecset * cos(DEGREE * latit));
483 bool neverrises =
false;
484 if (coshris > 1) neverrises =
true;
488 bool neversets =
false;
489 if (coshset < -1) neversets =
true;
503 double hris = 360 - RADIAN * acos(coshris);
505 double hset = RADIAN * acos(coshset);
512 tris = hris + raris - (0.06571 * tris) - 6.622;
513 tset = hset + raset - (0.06571 * tset) - 6.622;
521 double utris = tris - lngHour;
522 if (utris > 24) utris -= 24;
523 if (utris < 0) utris += 24;
524 double utset = tset - lngHour;
525 if (utset > 24) utset -= 24;
526 if (utset < 0) utset += 24;
528 sunrise = convHrmn(utris);
529 if (neverrises) sunrise.SetYear(999);
530 sunset = convHrmn(utset);
531 if (neversets) sunset.SetYear(999);
A dashboard instrument that displays the GNSS clock time, if available.