X-Git-Url: https://git.kernelconcepts.de/?p=metawatch.git;a=blobdiff_plain;f=mw_utility.c;h=53c5f7ab3000e401e5d4f511d25eefe6453763f4;hp=baf3d0a07d94eb30da3adfc5776403674e77a12e;hb=45df0eb30c5119f66f332d35a411f508a4f1b69a;hpb=114128414399b173f8c6e2070abe31fa35e71f29 diff --git a/mw_utility.c b/mw_utility.c index baf3d0a..53c5f7a 100644 --- a/mw_utility.c +++ b/mw_utility.c @@ -21,11 +21,15 @@ #include #include -#include "mw_utility.h" #include "metawatch.h" +#include "mw_utility.h" #include "fonts.h" +/* ---------------------------------------------------------------------- + * Generic drawing functions + * ---------------------------------------------------------------------- */ + /* * The pixmap buffer has at least one byte per pixel, even for monochrome (bpp=1) * bitmaps @@ -64,8 +68,10 @@ void mw_free_pbuffer(mw_buffer *mwbuf) } /* - * makes a buffer for sending to the watch from the drawing buffer, e.g. + * makes a buffer for sending to the LCD watch from the drawing buffer, e.g. * mw_send_bitmap(mw_fd, MW_SCREEN_MODE_IDLE, 96, 65, 31, bbuf, len); + * + * NOT reentrant ! */ unsigned char *mw_make_mw_buffer(mw_buffer *mwbuf, int *buflen) { @@ -88,6 +94,27 @@ unsigned char *mw_make_mw_buffer(mw_buffer *mwbuf, int *buflen) return wbuf; } +unsigned char *mw_make_mw_oled_buffer(mw_buffer *mwbuf, int *buflen) +{ + static unsigned char wbuf[2*80]; /* size of one OLED, two rows */ + int x, y; + unsigned char clr; + + memset(wbuf, 0, 2*80); + + for (x=0; xres_x; x++) { + for (y=0; yres_y; y++) { + clr = *(unsigned char *)(mwbuf->pbuf+((y*mwbuf->res_x)+x)); + if (clr) { + *(unsigned char *)(wbuf+(x+80*(y/8))) |= 1 << (7-(y%8)); + } + } + } + *buflen = (mwbuf->res_y / 8) * 80; + + return wbuf; +} + void mw_dump_mw_buffer(mw_buffer *mwbuf) { int x, y; @@ -229,3 +256,93 @@ void mw_buf_draw_line_bresenham(mw_buffer *mwbuf, unsigned int xstart, unsigned } } + +/* ---------------------------------------------------------------------- + * Complex combined functions, for user convenience + * ---------------------------------------------------------------------- */ + +/* + * send a text notification, automatically take care of device type (ana/digi) + * char *title is displayed inverse in top line + * char *text is the notification text + * vibrate is the number of 300ms vibrations, 0 for none + */ +void mw_do_notification(mwdevice_t *mwdevice, char *title, char *text, unsigned char vibrate) +{ + mw_buffer *mwbuf; + unsigned char *bbuf; + int len,i,c,r; + char sstr[32]; + + // fprintf(stderr, "do_notify devtype=%d, title='%s', text='%s', vibrate=%d\n", mwdevice->devtype, title, text, vibrate); + if (mwdevice->devtype == MW_DEVICE_TYPE_DIGITAL || mwdevice->devtype == MW_DEVICE_TYPE_DEVB_DIGI) { + mwbuf = mw_alloc_pbuffer(96, 96, 1); + mw_buf_clear(mwbuf, MW_BLACK); + + mw_buf_print(mwbuf, 0, 0, title, 0, MW_BLACK, MW_WHITE); + + i=0; + c=0; r=1; + memset(sstr,0,32); + while (i=16 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + if (r>10) + break; + }; + }; + + bbuf = mw_make_mw_buffer(mwbuf, &len); + mw_send_bitmap(mwdevice, MW_SCREEN_MODE_NOTIFICATION, 96, 96, 0, bbuf, len); + mw_update_display(mwdevice, MW_SCREEN_MODE_NOTIFICATION, 1); + mw_free_pbuffer(mwbuf); + } else if (mwdevice->devtype == MW_DEVICE_TYPE_ANA_DIGI || mwdevice->devtype == MW_DEVICE_TYPE_DEVB_ANA_DIGI) { + fprintf(stderr, "do notify OLED\n"); + mwbuf = mw_alloc_pbuffer(80, 16, 1); + mw_buf_clear(mwbuf, MW_BLACK); + + mw_buf_print(mwbuf, 0, 0, title, 0, MW_BLACK, MW_WHITE); + + i=0; + c=0; r=1; + memset(sstr,0,32); + while (i=13 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + }; + }; + + bbuf = mw_make_mw_oled_buffer(mwbuf, &len); + mw_write_oled_buffer(mwdevice, 0, MW_OLED_UPPER, 80, 0, bbuf, len); + + mw_buf_clear(mwbuf, MW_BLACK); + c=0; r=0; + memset(sstr,0,32); + while (i=13 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + if (r>2) + break; + }; + }; + + bbuf = mw_make_mw_oled_buffer(mwbuf, &len); + mw_write_oled_buffer(mwdevice, 0, MW_OLED_LOWER, 80, 0, bbuf, len); + + mw_free_pbuffer(mwbuf); + } else + fprintf(stderr, "Watch type not set - forgot to call mw_init()?\n"); + + if (vibrate) + mw_set_vibrate_mode(mwdevice, 1, 300, 300, vibrate); +} +