Add analog clockface display, command dana <hour> <minute> <day#>
authorNils Faerber <nils.faerber@kernelconcepts.de>
Sun, 13 Nov 2011 14:36:07 +0000 (15:36 +0100)
committerNils Faerber <nils.faerber@kernelconcepts.de>
Sun, 13 Nov 2011 14:36:07 +0000 (15:36 +0100)
mw_main.c

index a799dd8..eb98255 100644 (file)
--- a/mw_main.c
+++ b/mw_main.c
@@ -14,6 +14,7 @@
 #include <time.h>
 #include <termios.h>
 #include <ctype.h>
+#include <math.h>
 
 #include <errno.h>
 
@@ -425,6 +426,66 @@ void test_application(mwdevice_t *mwdevice)
        mw_free_pbuffer(mwbuf);
 }
 
+void draw_app_ana_clock(mwdevice_t *mwdevice, int hour, int minute, unsigned char day)
+{
+       mw_buffer *mwbuf;
+       unsigned char *bbuf;
+       char daystr[5];
+       int len;
+       unsigned int i, x, y, x2, y2;
+       double tmp, mf;
+
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_IDLE, MW_BUTTON_A, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_A);
+
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_APPLICATION, MW_BUTTON_A, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_A);
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_APPLICATION, MW_BUTTON_B, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_B);
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_APPLICATION, MW_BUTTON_C, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_C);
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_APPLICATION, MW_BUTTON_E, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_E);
+       mw_enable_button(mwdevice, MW_SCREEN_MODE_APPLICATION, MW_BUTTON_F, MW_BUTTON_IMMEDIATE, MW_BUTTON_EVENT_MESSAGE, MW_BUTTON_F);
+       mw_configure_watch_mode(mwdevice, MW_SCREEN_MODE_APPLICATION, 0, 30, 0);
+
+       mwbuf = mw_alloc_pbuffer(96, 96, 1);
+       mw_buf_clear(mwbuf, MW_BLACK);
+
+       hour -= 3;
+       mf = (1. / 59.) * (double)minute;
+       minute -= 15;
+
+       // plot(R*cos(360° * i/N), R*sin(360° * i/N))
+       for (i=0; i<12; i++) {
+               tmp = 48. + (43. * cos(((2. * M_PI) / 12.) * (double)i));
+               x =  tmp;
+               tmp = 48 + (43. * sin(((2. * M_PI) / 12.) * (double)i));
+               y =  tmp;
+               tmp = 48. + (48. * cos(((2. * M_PI) / 12.) * (double)i));
+               x2 =  tmp;
+               tmp = 48 + (48. * sin(((2. * M_PI) / 12.) * (double)i));
+               y2 =  tmp;
+               mw_buf_draw_line_bresenham(mwbuf, x, y, x2, y2, MW_WHITE);
+       };
+       // Hour
+       g_print("hour = %d -> %f (%f)\n", hour, (double)hour + mf, mf);
+       tmp = 48. + (30. * cos(((2. * M_PI) / 12.) * ((double)hour + mf)));
+       x =  tmp;
+       tmp = 48 + (30. * sin(((2. * M_PI) / 12.) * ((double)hour + mf)));
+       y =  tmp;
+       mw_buf_draw_line_bresenham(mwbuf, 48, 48, x, y, MW_WHITE);
+       // Minute
+       tmp = 48. + (40. * cos(((2. * M_PI) / 60.) * (double)minute));
+       x =  tmp;
+       tmp = 48 + (40. * sin(((2. * M_PI) / 60.) * (double)minute));
+       y =  tmp;
+       mw_buf_draw_line_bresenham(mwbuf, 48, 48, x, y, MW_WHITE);
+
+       snprintf(daystr, 5, "%d", day);
+       mw_buf_print(mwbuf, 74, 45, daystr, 0, MW_WHITE, MW_BLACK);
+
+       bbuf = mw_make_mw_buffer(mwbuf, &len);
+       mw_send_bitmap(mwdevice, MW_SCREEN_MODE_APPLICATION, 96, 96, 0, bbuf, len);
+       mw_update_display(mwdevice, MW_SCREEN_MODE_APPLICATION, 1);
+       mw_free_pbuffer(mwbuf);
+}
+
 void test_oled(mwdevice_t *mwdevice, unsigned char oled)
 {
        mw_buffer *mwbuf;
@@ -670,6 +731,14 @@ void process_cmd(char *cmdline, int clinep, mwdata_t *mwdata)
                mdata[0] = 0;
                mw_nval_operation(&mwdata->mwdevice, MW_NVAL_OPERATION_READ, MW_NVAL_DATE_FORMAT, 1, mdata);
        }
+       if (strncmp(cmd, "dana", 4) == 0) {
+               if (pcnt < 3)
+                       g_print("two few params, hour minute\n");
+               else {
+                       draw_app_ana_clock(&mwdata->mwdevice, atoi(params[0]), atoi(params[1]), atoi(params[2]));
+               }
+       }
+
        params_free(params);
 }