]> git.karo-electronics.de Git - oswald.git/blobdiff - ui/oswald_watch_faces.c
Oh boy... lots of changes, too many to describe
[oswald.git] / ui / oswald_watch_faces.c
index 548a6bbe8f191fb959ac68469c1f505fa959878a..6db3196abd2d39baba91ff3e415e07866066b96c 100644 (file)
-#include <math.h>
+#include <stdio.h>
+#include <stdint.h>
 
 #include "oswald.h"
 #include "oswald_main.h"
-#include "oswald-ui.h"
 #include "Fonts.h"
 #include "LcdDisplay.h"
+#include "oswald_hal.h"
 
 #include "oswald_watch_faces.h"
 
+int16_t sintab[]={
+           0,   2,   3,   5,   7,   9,  10,  12,  14,  16,
+          17,  19,  21,  22,  24,  26,  28,  29,  31,  33,
+          34,  36,  37,  39,  41,  42,  44,  45,  47,  48,
+          50,  52,  53,  54,  56,  57,  59,  60,  62,  63,
+          64,  66,  67,  68,  69,  71,  72,  73,  74,  75,
+          77,  78,  79,  80,  81,  82,  83,  84,  85,  86,
+          87,  87,  88,  89,  90,  91,  91,  92,  93,  93,
+          94,  95,  95,  96,  96,  97,  97,  97,  98,  98,
+          98,  99,  99,  99,  99, 100, 100, 100, 100, 100,
+         100, 100, 100, 100, 100, 100,  99,  99,  99,  99,
+          98,  98,  98,  97,  97,  97,  96,  96,  95,  95,
+          94,  93,  93,  92,  91,  91,  90,  89,  88,  87,
+          87,  86,  85,  84,  83,  82,  81,  80,  79,  78,
+          77,  75,  74,  73,  72,  71,  69,  68,  67,  66,
+          64,  63,  62,  60,  59,  57,  56,  54,  53,  52,
+          50,  48,  47,  45,  44,  42,  41,  39,  37,  36,
+          34,  33,  31,  29,  28,  26,  24,  22,  21,  19,
+          17,  16,  14,  12,  10,   9,   7,   5,   3,   2,
+           0,  -2,  -3,  -5,  -7,  -9, -10, -12, -14, -16,
+         -17, -19, -21, -22, -24, -26, -28, -29, -31, -33,
+         -34, -36, -37, -39, -41, -42, -44, -45, -47, -48,
+         -50, -52, -53, -54, -56, -57, -59, -60, -62, -63,
+         -64, -66, -67, -68, -69, -71, -72, -73, -74, -75,
+         -77, -78, -79, -80, -81, -82, -83, -84, -85, -86,
+         -87, -87, -88, -89, -90, -91, -91, -92, -93, -93,
+         -94, -95, -95, -96, -96, -97, -97, -97, -98, -98,
+         -98, -99, -99, -99, -99,-100,-100,-100,-100,-100,
+        -100,-100,-100,-100,-100,-100, -99, -99, -99, -99,
+         -98, -98, -98, -97, -97, -97, -96, -96, -95, -95,
+         -94, -93, -93, -92, -91, -91, -90, -89, -88, -87,
+         -87, -86, -85, -84, -83, -82, -81, -80, -79, -78,
+         -77, -75, -74, -73, -72, -71, -69, -68, -67, -66,
+         -64, -63, -62, -60, -59, -57, -56, -54, -53, -52,
+         -50, -48, -47, -45, -44, -42, -41, -39, -37, -36,
+         -34, -33, -31, -29, -28, -26, -24, -22, -21, -19,
+         -17, -16, -14, -12, -10,  -9,  -7,  -5,  -3,  -2
+};
+
+int16_t f_sin(int16_t v)
+{
+       v %= 360;
+       return sintab[v];
+}
+
+int16_t f_cos(int16_t v)
+{
+       v += 90;
+       v %= 360;
+       return sintab[v];
+}
+
 void DrawLcdAnaClock(boolean show_seconds)
 {
-       //unsigned char *bbuf;
-       //char daystr[5];
-       //int len;
-       int i, x, y, x2, y2;
-       double tmp, mf;
-       s8t hour, minute, seconds;
+       int16_t i, x, y, x2, y2;
+       int16_t tmp;
+       int8_t hour, minute, seconds;
+       char tstr[16];
 
        hour = OswaldClk.hour;
        minute = OswaldClk.minute;
        seconds = OswaldClk.second;
 
        hour -= 3;
-       mf = (1. / 59.) * (double)minute;
+       if (hour < 0)
+               hour += 12;
+       // mf = (1. / 59.) * (double)minute;
        minute -= 15;
+       if (minute < 0)
+               minute += 60;
        seconds -= 15;
+       if (seconds < 0)
+               seconds += 60;
 
-       lcd_clear_display();
+       hal_lcd_clear_display();
+
+       SetFont(MetaWatch16);
+       snprintf(tstr, 16, "%02d", OswaldClk.day);
+       WriteLcdString(70, 40, tstr);
 
        // 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));
+               tmp = 48 + ((43 * f_cos((360 / 12) * i)) / 100);
                x =  tmp;
-               tmp = 48 + (43. * sin(((2. * M_PI) / 12.) * (double)i));
+               tmp = 48 + ((43 * f_sin((360 / 12) * i)) / 100);
                y =  tmp;
-               tmp = 48. + (48. * cos(((2. * M_PI) / 12.) * (double)i));
+               tmp = 48 + ((48 * f_cos((360 / 12) * i)) / 100);
                x2 =  tmp;
-               tmp = 48 + (48. * sin(((2. * M_PI) / 12.) * (double)i));
+               tmp = 48 + ((48 * f_sin((360 / 12) * i)) / 100);
                y2 =  tmp;
                DrawLcdLineBresenhamWW(x, y, x2, y2, 2);
        };
+
        // Hour
-       tmp = 48. + (30. * cos(((2. * M_PI) / 12.) * ((double)hour + mf)));
+       tmp = 48 + (30 * f_cos(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
        x =  tmp;
-       tmp = 48 + (30. * sin(((2. * M_PI) / 12.) * ((double)hour + mf)));
+       tmp = 48 + (30 * f_sin(((360 / 12) * hour) + ((OswaldClk.minute * 360) /12 / 60)) / 100);
        y =  tmp;
        DrawLcdLineBresenhamWW(48, 48, x, y, 2);
        // Minute
-       tmp = 48. + (40. * cos(((2. * M_PI) / 60.) * (double)minute));
+       tmp = 48 + ((40 * f_cos((360 / 60) * minute)) / 100);
        x =  tmp;
-       tmp = 48 + (40. * sin(((2. * M_PI) / 60.) * (double)minute));
+       tmp = 48 + ((40 * f_sin((360 / 60) * minute)) / 100);
        y =  tmp;
        DrawLcdLineBresenhamWW(48, 48, x, y, 2);
        if (show_seconds) {
                // Seconds
-               tmp = 48. + (40. * cos(((2. * M_PI) / 60.) * (double)seconds));
+               tmp = 48 + ((40 * f_cos((360 / 60) * seconds)) / 100);
                x =  tmp;
-               tmp = 48 + (40. * sin(((2. * M_PI) / 60.) * (double)seconds));
+               tmp = 48 + ((40 * f_sin((360 / 60) * seconds)) / 100);
                y =  tmp;
                DrawLcdLineBresenham(48, 48, x, y);
        };
 
-       //snprintf(daystr, 5, "%d", day);
-       // mw_buf_print(mwbuf, 74, 45, daystr, 0, MW_WHITE, MW_BLACK);
-       lcd_update_display();
+       hal_lcd_update_display();
 }
 
 void DrawLcdDigitalClock(boolean show_seconds)
 {
        int gRow = 3;
-       int gColumn = 4;
+       int gColumn = 3;
+       char tstr[16];
 
        SetFont(MetaWatchTime);
 
-       lcd_clear_display();
+       hal_lcd_clear_display();
        //gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_SPACE_INDEX);
-       gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour / 10));
-       gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour % 10));
+       if (OswaldClk.clk24hr) {
+               gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour / 10));
+               gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.hour % 10));
+       } else {
+               unsigned char val = OswaldClk.hour;
+               if (val > 12)
+                       val -= 12;
+               gRow += WriteLcdCharacter(gRow, gColumn, (val / 10));
+               gRow += WriteLcdCharacter(gRow, gColumn, (val % 10));
+       }
        gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX);
        gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute / 10));
        gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.minute % 10));
+
+       gRow += 3;
        if (show_seconds) {
-               gRow += WriteLcdCharacter(gRow, gColumn, TIME_CHARACTER_COLON_INDEX);
-               gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.second / 10));
-               gRow += WriteLcdCharacter(gRow, gColumn, (OswaldClk.second % 10));
+               SetFont(MetaWatch16);
+               snprintf(tstr, 16, "%02d", OswaldClk.second);
+               WriteLcdString(gRow, 9, tstr);
        };
-       lcd_update_display();
+
+       SetFont(MetaWatch7);
+
+       if (!OswaldClk.clk24hr) {
+               if (OswaldClk.hour > 12) {
+                       WriteLcdString(gRow, 3, "PM");
+               } else {
+                       WriteLcdString(gRow, 3, "AM");
+               }
+       }
+
+       SetFont(MetaWatch16);
+
+       if (OswaldClk.day_first)
+               snprintf(tstr, 16, "%d.%d.%d", OswaldClk.day, OswaldClk.month, OswaldClk.year);
+       else
+               snprintf(tstr, 16, "%d/%d %d", OswaldClk.month, OswaldClk.day, OswaldClk.year);
+       WriteLcdString(3, 25, tstr);
+
+       snprintf(tstr, 16, "%d%% (%dmV)", OswaldPowerState.percent, OswaldPowerState.level);
+       WriteLcdString(2, 48, tstr);
+       WriteLcdString(2, 64, OswaldPowerState.source ? "ext" : "bat");
+
+       /* this makes only sense when the charger is active */
+       if (OswaldPowerState.source) {
+               switch (OswaldPowerState.charge_state) {
+                       case POWER_CHARGER_DONE:
+                               WriteLcdString(2, 80, "charge done");
+                               break;
+                       case POWER_CHARGER_PRECHARGE:
+                               WriteLcdString(2, 80, "precharging");
+                               break;
+                       case POWER_CHARGER_CHARGING:
+                               WriteLcdString(2, 80, "charging");
+                               break;
+                       case POWER_CHARGER_UNK:
+                               WriteLcdString(2, 80, "charge unkn.");
+                               break;
+                       default:
+                               break;
+               };
+       };
+       hal_lcd_update_display();
 }
+