X-Git-Url: https://git.kernelconcepts.de/?p=metawatch.git;a=blobdiff_plain;f=mw_main.c;h=eb98255d2d85ed836d7a58b0cdc9aa7388d7b663;hp=b1e9d15c4b05d54c0d8671344512ca8fbe5415d7;hb=5668a2fcb129077040e1856c5a3d1595c7ef06e7;hpb=7a200e52bd1821d888d9c68c32f09e025cdfd3c3 diff --git a/mw_main.c b/mw_main.c index b1e9d15..eb98255 100644 --- a/mw_main.c +++ b/mw_main.c @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -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; @@ -471,62 +532,134 @@ void do_weather(mwdata_t *mwdata) void print_help(void) { + g_print("Not yet implemented..\n"); +} + +#define PARAMS_MAX 8 +#define PARAMS_LEN 16 + +static int separate_params(char *params[], char *pbuf) +{ + char *ret; + char tbuf[128]; + int cnt = 0; + + memset(tbuf, 0, 128); + strncpy(tbuf, pbuf, strlen(pbuf)); + // strdump(tbuf, strlen(tbuf)); + /* we know we do have at least one parameter */ + ret = strtok(tbuf, " "); + while (ret != NULL) { + // dbg_printf("tok '%s'\n", ret); + strncpy(params[cnt++], ret, PARAMS_LEN-1); + if (cnt > PARAMS_MAX) + break; + ret = strtok(NULL, " "); + } + + return cnt; +} + +static void params_free(char **params) +{ + int i; + for (i=0; i < PARAMS_MAX; i++) + free(params[i]); } void process_cmd(char *cmdline, int clinep, mwdata_t *mwdata) { unsigned char mdata[32]; unsigned int intopt; + char cmd[128], pbuf[128], *params[PARAMS_MAX]; + int i, pcnt; + char *inbuf = cmdline; + + g_print("command: '%s'\n", cmdline); - fprintf(stderr, "command: '%s'\n", cmdline); + for (i=0; i 0) + pcnt = separate_params(params, pbuf); + else + pcnt = 0; - if (strncmp(cmdline, "quit", 4) == 0) { + if (strncmp(cmd, "quit", 4) == 0) { //close(mw_fd); //exit(0); /* just in case we quit and show another screen */ mw_update_display(&mwdata->mwdevice, MW_SCREEN_MODE_IDLE, 0); + params_free(params); g_main_loop_quit (mwdata->mloop); } - if (strncmp(cmdline, "help", 4) == 0) { + if (strncmp(cmd, "help", 4) == 0) { print_help(); } - if (strncmp(cmdline, "ahand", 5) == 0) { - intopt = atoi(cmdline+5); - g_print("Advance analog hands by %d minutes\n", intopt); - mdata[0] = intopt / 60; - mdata[1] = intopt % 60; - mdata[2] = 0; - mw_send_frame(&mwdata->mwdevice, MW_ADVANCE_WATCH_HANDS, 0, mdata, 3); - } - if (strncmp(cmdline, "srtc", 4) == 0) { - fprintf(stderr, "Setting RTC from system time..."); - mw_set_rtc(&mwdata->mwdevice); - fprintf(stderr, "OK\n"); - } - if (strncmp(cmdline, "grtc", 4) == 0) { + if (strncmp(cmd, "ahand", 5) == 0) { + if (pcnt > 0) { + intopt = atoi(params[0]); /*atoi(cmdline+5);*/ + g_print("Advance analog hands by %d minutes\n", intopt); + mdata[0] = intopt / 60; + mdata[1] = intopt % 60; + mdata[2] = 0; + mw_send_frame(&mwdata->mwdevice, MW_ADVANCE_WATCH_HANDS, 0, mdata, 3); + } else + g_print("missing argument\n ahand # - # = no. of minutes\n"); + } + if (strncmp(cmd, "srtc", 4) == 0) { + time_t mtime; + struct tm mtm; + + mtime = time(NULL); + localtime_r(&mtime, &mtm); + + g_print("Setting RTC from system time..."); + mw_set_rtc(&mwdata->mwdevice, &mtm); + g_print("OK\n"); + } + if (strncmp(cmd, "grtc", 4) == 0) { mw_send_frame(&mwdata->mwdevice, MW_GET_REAL_TIME_CLOCK, 0, NULL, 0); } - if (strncmp(cmdline, "gistr", 5) == 0) { - intopt = cmdline[6]-0x30; - if (intopt>=0 && intopt <=3) + if (strncmp(cmd, "gistr", 5) == 0) { + if (pcnt > 0) + intopt = atoi(params[0]); + if (intopt >= 0 && intopt <= 3) mdata[0] = intopt; else mdata[0] = 0; mw_send_frame(&mwdata->mwdevice, MW_GET_INFORMATION_STRING, 0, mdata, 1); } - if (strncmp(cmdline, "gdtype", 6) == 0) { + if (strncmp(cmd, "gdtype", 6) == 0) { mw_send_frame(&mwdata->mwdevice, MW_GET_DEVICE_TYPE, 0, NULL, 0); } - if (strncmp(cmdline, "rvbat", 5) == 0) { + if (strncmp(cmd, "rvbat", 5) == 0) { mw_send_frame(&mwdata->mwdevice, MW_READ_BATTERY_VOLTAGE_MSG, 0, NULL, 0); } - if (strncmp(cmdline, "rlight", 6) == 0) { + if (strncmp(cmd, "rlight", 6) == 0) { mw_send_frame(&mwdata->mwdevice, MW_READ_LIGHT_SENSOR_MSG, 0, NULL, 0); } - if (strncmp(cmdline, "modecfg", 6) == 0) { + if (strncmp(cmd, "modecfg", 6) == 0) { mw_configure_watch_mode(&mwdata->mwdevice, MW_SCREEN_MODE_IDLE, 0, 4, 1); mw_update_display(&mwdata->mwdevice, MW_SCREEN_MODE_IDLE, 0); } +#if 0 if (strncmp(cmdline, "rbtcfg", 6) == 0) { intopt = cmdline[7]-0x30; mdata[0] = 0; /* idle screen */ @@ -537,66 +670,77 @@ void process_cmd(char *cmdline, int clinep, mwdata_t *mwdata) mdata[4] = 0; /* callback message option */ mw_send_frame(&mwdata->mwdevice, MW_READ_BUTTON_CONFIG, 0, mdata, 5); } - if (strncmp(cmdline, "svib", 4) == 0) { +#endif + if (strncmp(cmd, "svib", 4) == 0) { mw_set_vibrate_mode(&mwdata->mwdevice, 1, 300, 300, 5); } - if (strncmp(cmdline, "tbmp", 4) == 0) { + if (strncmp(cmd, "tbmp", 4) == 0) { bitmap_test(&mwdata->mwdevice); } - if (strncmp(cmdline, "t2bmp", 5) == 0) { + if (strncmp(cmd, "t2bmp", 5) == 0) { bitmap_test2(&mwdata->mwdevice); } - if (strncmp(cmdline, "text", 4) == 0) { + if (strncmp(cmd, "text", 4) == 0) { text_test(&mwdata->mwdevice); } - if (strncmp(cmdline, "tline", 5) == 0) { + if (strncmp(cmd, "tline", 5) == 0) { line_test(&mwdata->mwdevice); } - if (strncmp(cmdline, "rbmp", 4) == 0) { + if (strncmp(cmd, "rbmp", 4) == 0) { bitmap_read(&mwdata->mwdevice); } - if (strncmp(cmdline, "tnote", 5) == 0) { + if (strncmp(cmd, "tnote", 5) == 0) { // test_notification(&mwdata->mwdevice); mw_do_notification(&mwdata->mwdevice, "TestNotification", "This is a pretty long text that needs to be broken and torn", 1); } - if (strncmp(cmdline, "tapp", 4) == 0) { + if (strncmp(cmd, "tapp", 4) == 0) { test_application(&mwdata->mwdevice); } - if (strncmp(cmdline, "eoled", 5) == 0) { - intopt = cmdline[6]-0x30; - if (intopt == MW_OLED_UPPER || intopt == MW_OLED_LOWER) - mw_send_frame(&mwdata->mwdevice, MW_ENABLE_OLED_DISPLAY_MSG, intopt, NULL, 0); + if (strncmp(cmd, "eoled", 5) == 0) { + if (pcnt > 0) { + intopt = atoi(params[0]); + if (intopt == MW_OLED_UPPER || intopt == MW_OLED_LOWER) + mw_send_frame(&mwdata->mwdevice, MW_ENABLE_OLED_DISPLAY_MSG, intopt, NULL, 0); + } } - if (strncmp(cmdline, "toled", 5) == 0) { - intopt = cmdline[6]-0x30; + if (strncmp(cmd, "toled", 5) == 0) { + intopt = atoi(params[0]); test_oled(&mwdata->mwdevice, intopt); //mw_write_oled_buffer(mwdevice, 0, 80, 0, mdata, 10); //mw_send_frame(mwdevice, MW_UPDATE_OLED_DISPLAY_MSG, 0, NULL, 0); } - if (strncmp(cmdline, "cal", 3) == 0) { + if (strncmp(cmd, "cal", 3) == 0) { draw_idle_calendar(&mwdata->mwdevice); } - if (strncmp(cmdline, "wet", 3) == 0) { + if (strncmp(cmd, "wet", 3) == 0) { do_weather(mwdata); } - if (strncmp(cmdline, "c24", 3) == 0) { + if (strncmp(cmd, "c24", 3) == 0) { mdata[0] = MW_RTC_CLOCK_24HR; mw_nval_operation(&mwdata->mwdevice, MW_NVAL_OPERATION_WRITE, MW_NVAL_TIME_FORMAT, 1, mdata); } - if (strncmp(cmdline, "g24", 3) == 0) { + if (strncmp(cmd, "g24", 3) == 0) { mdata[0] = 0; mw_nval_operation(&mwdata->mwdevice, MW_NVAL_OPERATION_READ, MW_NVAL_TIME_FORMAT, 1, mdata); } - if (strncmp(cmdline, "sdm", 3) == 0) { + if (strncmp(cmd, "sdm", 3) == 0) { mdata[0] = MW_RTC_DATE_DDMM; mw_nval_operation(&mwdata->mwdevice, MW_NVAL_OPERATION_WRITE, MW_NVAL_DATE_FORMAT, 1, mdata); } - if (strncmp(cmdline, "gdm", 3) == 0) { + if (strncmp(cmd, "gdm", 3) == 0) { mdata[0] = 0; - mw_nval_operation(&mwdata->mwdevice, MW_NVAL_OPERATION_READ, MW_NVAL_TIME_FORMAT, 1, mdata); + 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); +} int feed_menu(mwdata_t *mdata) {