|
|
@ -2,28 +2,25 @@ |
|
|
|
#include "Kernel.h" |
|
|
|
#include "EAT.h" |
|
|
|
#include "Util.h" |
|
|
|
#include "UI.h" |
|
|
|
|
|
|
|
#define CLOCK_OFFSET_X 1 |
|
|
|
#define CLOCK_OFFSET_Y 1 |
|
|
|
#define CLOCK_SIZE 78 |
|
|
|
#define CLOCK_FACE_COLOUR 0xAAAAAA |
|
|
|
#define CLOCK_FACE_OUTLINE_COLOUR 0x666666 |
|
|
|
#define CLOCK_FACE_OUTLINE_WIDTH 4 |
|
|
|
#define CLOCK_FACE_HOUR_MARKER_TOP_COLOUR 0x333333 |
|
|
|
#define CLOCK_FACE_HOUR_MARKER_COLOUR 0x666666 |
|
|
|
#define CLOCK_FACE_HOUR_MARKER_SIZE 4 |
|
|
|
#define CLOCK_HOUR_COLOUR 0x333333 |
|
|
|
#define CLOCK_HOUR_LENGTH 20 |
|
|
|
#define CLOCK_MINUTE_COLOUR 0x666666 |
|
|
|
#define CLOCK_MINUTE_LENGTH 25 |
|
|
|
#define CLOCK_FACE_OUTLINE_SIZE_PCNT 4 |
|
|
|
#define CLOCK_FACE_OUTLINE_COLOUR 0x666666 |
|
|
|
#define CLOCK_FACE_COLOUR 0xAAAAAA |
|
|
|
#define CLOCK_FACE_MARKER_COLOUR 0x666666 |
|
|
|
#define CLOCK_FACE_MARKER_TOP_COLOUR 0x333333 |
|
|
|
#define CLOCK_FACE_MARKER_SIZE_PCNT 10 |
|
|
|
#define CLOCK_HOUR_LENGTH_PCNT 20 |
|
|
|
#define CLOCK_HOUR_COLOUR 0x333333 |
|
|
|
#define CLOCK_MINUTE_LENGTH_PCNT 30 |
|
|
|
#define CLOCK_MINUTE_COLOUR 0x666666 |
|
|
|
|
|
|
|
#define DEGREES_TO_RADIANS 0.0174533 |
|
|
|
|
|
|
|
RTC_TimeTypeDef time_to_rtc(char* time); |
|
|
|
RTC_DateTypeDef date_to_rtc(char* date); |
|
|
|
void redraw(RTC_TimeTypeDef time, RTC_DateTypeDef date); |
|
|
|
void draw_face(); |
|
|
|
unsigned int rgb_to_colour(unsigned long colour); |
|
|
|
void Clock_draw(int hwnd, int wnd_x, int wnd_y, int wnd_width, int wnd_height); |
|
|
|
void Clock_draw_arm(int center_x, int center_y, int angle, int length, unsigned int colour); |
|
|
|
|
|
|
|
int last_minute = -1; |
|
|
|
|
|
|
@ -31,7 +28,8 @@ int Clock(int pid, unsigned int signal) |
|
|
|
{ |
|
|
|
if (signal & SIGNAL_START) |
|
|
|
{ |
|
|
|
Kernel_signal_mask(pid, SIGNAL_START | SIGNAL_STOP | SIGNAL_TICK | SIGNAL_REDRAW); |
|
|
|
Kernel_signal_mask(pid, SIGNAL_START | SIGNAL_STOP | SIGNAL_TICK); |
|
|
|
UI_create_window(&Clock_draw, 1); |
|
|
|
|
|
|
|
RTC_TimeTypeDef compile_time = time_to_rtc(__TIME__); |
|
|
|
RTC_DateTypeDef compile_date = date_to_rtc(__DATE__); |
|
|
@ -61,73 +59,86 @@ int Clock(int pid, unsigned int signal) |
|
|
|
return 255; |
|
|
|
} |
|
|
|
|
|
|
|
if (signal & SIGNAL_TICK || signal & SIGNAL_REDRAW) |
|
|
|
if (signal & SIGNAL_TICK) |
|
|
|
{ |
|
|
|
RTC_TimeTypeDef time; |
|
|
|
M5.Rtc.GetTime(&time); |
|
|
|
|
|
|
|
if (signal & SIGNAL_TICK && time.Minutes != last_minute) |
|
|
|
if (time.Minutes != last_minute) |
|
|
|
{ |
|
|
|
last_minute = time.Minutes; |
|
|
|
Kernel_signal(SIGNAL_REDRAW); |
|
|
|
} |
|
|
|
if (signal & SIGNAL_REDRAW) |
|
|
|
{ |
|
|
|
RTC_DateTypeDef date; |
|
|
|
M5.Rtc.GetData(&date); |
|
|
|
redraw(time, date); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
void draw_face() |
|
|
|
void Clock_draw(int hwnd, int wnd_x, int wnd_y, int wnd_width, int wnd_height) |
|
|
|
{ |
|
|
|
int center_x = CLOCK_OFFSET_X + (CLOCK_SIZE / 2); |
|
|
|
int center_y = CLOCK_OFFSET_Y + (CLOCK_SIZE / 2); |
|
|
|
int radius = CLOCK_SIZE / 2; |
|
|
|
int inner_radius = radius - (CLOCK_FACE_OUTLINE_WIDTH / 2); |
|
|
|
|
|
|
|
RTC_TimeTypeDef time; |
|
|
|
M5.Rtc.GetTime(&time); |
|
|
|
RTC_DateTypeDef date; |
|
|
|
M5.Rtc.GetData(&date); |
|
|
|
|
|
|
|
int size = 0; |
|
|
|
if (wnd_width < wnd_height) |
|
|
|
{ |
|
|
|
size = wnd_width; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
size = wnd_height; |
|
|
|
} |
|
|
|
|
|
|
|
int center_x = wnd_x + (size / 2); |
|
|
|
int center_y = wnd_y + (size / 2); |
|
|
|
int radius = size / 2; |
|
|
|
int outline_size = size * (CLOCK_FACE_OUTLINE_SIZE_PCNT / 100.0); |
|
|
|
int inner_radius = radius - (outline_size / 2); |
|
|
|
|
|
|
|
// Draw face
|
|
|
|
M5.Lcd.fillCircle(center_x, center_y, radius, rgb_to_colour(CLOCK_FACE_OUTLINE_COLOUR)); |
|
|
|
M5.Lcd.fillCircle(center_x, center_y, inner_radius, rgb_to_colour(CLOCK_FACE_COLOUR)); |
|
|
|
|
|
|
|
|
|
|
|
// Draw lines
|
|
|
|
int marker_size = size * (CLOCK_FACE_MARKER_SIZE_PCNT / 100.0); |
|
|
|
for (int i=0; i<360; i+=(360/12)) |
|
|
|
{ |
|
|
|
// Effectively our polar coordinates are
|
|
|
|
// i,inner_radius -> i,inner_radius-CLOCK_FACE_HOUR_MARKER_SIZE
|
|
|
|
|
|
|
|
int x1 = (inner_radius - CLOCK_FACE_HOUR_MARKER_SIZE) * cos(i * DEGREES_TO_RADIANS); |
|
|
|
int y1 = (inner_radius - CLOCK_FACE_HOUR_MARKER_SIZE) * sin(i * DEGREES_TO_RADIANS); |
|
|
|
int x1 = (inner_radius - marker_size) * cos(i * DEGREES_TO_RADIANS); |
|
|
|
int y1 = (inner_radius - marker_size) * sin(i * DEGREES_TO_RADIANS); |
|
|
|
int x2 = (inner_radius + 1) * cos(i * DEGREES_TO_RADIANS); |
|
|
|
int y2 = (inner_radius + 1) * sin(i * DEGREES_TO_RADIANS); |
|
|
|
|
|
|
|
x1 += center_x; |
|
|
|
x2 += center_x; |
|
|
|
y1 += center_y; |
|
|
|
y2 += center_y; |
|
|
|
|
|
|
|
// 0 degrees = right, draw top at 270
|
|
|
|
M5.Lcd.drawLine(x1, y1, x2, y2, i == 270 ? rgb_to_colour(CLOCK_FACE_HOUR_MARKER_TOP_COLOUR) : rgb_to_colour(CLOCK_FACE_HOUR_MARKER_COLOUR)); |
|
|
|
M5.Lcd.drawLine(x1, y1, x2, y2, i == 270 ? rgb_to_colour(CLOCK_FACE_MARKER_TOP_COLOUR) : rgb_to_colour(CLOCK_FACE_MARKER_COLOUR)); |
|
|
|
} |
|
|
|
|
|
|
|
int hour = time.Hours; |
|
|
|
if (hour > 12) hour -= 12; |
|
|
|
int minute = time.Minutes; |
|
|
|
|
|
|
|
int minute_angle = 360.0 * (minute / 60.0); |
|
|
|
int hour_angle = (360.0 * (hour / 12.0)) + (minute_angle / 12.0); |
|
|
|
|
|
|
|
Clock_draw_arm(center_x, center_y, hour_angle, size * (CLOCK_HOUR_LENGTH_PCNT / 100.0), rgb_to_colour(CLOCK_HOUR_COLOUR)); |
|
|
|
Clock_draw_arm(center_x, center_y, minute_angle, size * (CLOCK_MINUTE_LENGTH_PCNT / 100.0), rgb_to_colour(CLOCK_MINUTE_COLOUR)); |
|
|
|
} |
|
|
|
|
|
|
|
void draw_arm(int angle, int length, unsigned int colour) |
|
|
|
void Clock_draw_arm(int center_x, int center_y, int angle, int length, unsigned int colour) |
|
|
|
{ |
|
|
|
// 0 = right, adjust for 0=up
|
|
|
|
angle -= 90; |
|
|
|
// clock center
|
|
|
|
int center_x = CLOCK_OFFSET_X + (CLOCK_SIZE / 2); |
|
|
|
int center_y = CLOCK_OFFSET_Y + (CLOCK_SIZE / 2); |
|
|
|
|
|
|
|
int x = length * cos(angle * DEGREES_TO_RADIANS); |
|
|
|
int y = length * sin(angle * DEGREES_TO_RADIANS); |
|
|
|
|
|
|
|
M5.Lcd.drawLine(center_x, center_y, center_x + x, center_y + y, colour); |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
void redraw(RTC_TimeTypeDef time, RTC_DateTypeDef date) |
|
|
|
{ |
|
|
|
draw_face(); |
|
|
@ -153,6 +164,7 @@ void redraw(RTC_TimeTypeDef time, RTC_DateTypeDef date) |
|
|
|
//sprintf(time_str, "%02d:%02d", time.Hours, time.Minutes);
|
|
|
|
//M5.Lcd.print(time_str);
|
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
RTC_TimeTypeDef time_to_rtc(char* time) |
|
|
|
{ |
|
|
|