2021-08-28 01:42:19 +08:00
/*
2021-08-09 00:49:36 +08:00
2021-08-28 01:42:19 +08:00
mui . h
2021-08-28 16:10:38 +08:00
Monochrome minimal user interface : Core library .
2021-08-28 01:42:19 +08:00
Universal 8 bit Graphics Library ( https : //github.com/olikraus/u8g2/)
2021-09-05 17:09:02 +08:00
Copyright ( c ) 2021 , olikraus @ gmail . com
2021-08-28 01:42:19 +08:00
All rights reserved .
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
* Redistributions of source code must retain the above copyright notice , this list
of conditions and the following disclaimer .
* Redistributions in binary form must reproduce the above copyright notice , this
list of conditions and the following disclaimer in the documentation and / or other
materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES ,
INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT ,
STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
2022-01-05 06:34:16 +08:00
MUIF ( Monochrome User Interface Functions )
n : A number 0 to 9 without any quotes , e . g . : 5
2022-12-10 14:46:22 +08:00
id : Exactly two characters or numbers in double quotes , e . g . " G5 " .
2022-01-05 06:34:16 +08:00
cb : A callback function with the following prototype : " uint8_t muif_cb(mui_t *ui, uint8_t msg) "
There are MANY predefined callback functions , see separate list
var : Address of a variable .
text : Normal text , but special characters might be required for some callback functions , for
example the text might contain a list of selectable elements separated with the ' | ' symbol .
MUIF_STYLE ( n , cb )
Corresponding FDS command : MUI_STYLE ( n )
Change the style of any other elements after MUI_STYLE ( n ) , does not draw anything
MUIF_RO ( id , cb )
Corresponding FDS command : MUI_DATA ( id , text ) MUI_XY ( id , x , y ) , MUI_XYT ( id , x , y , text ) , MUI_XYA ( id , x , y , a ) , MUI_XYAT ( id , x , y , a , text )
Places a read only element on the form .
The correct FDS command depends on the callback function .
MUIF_LABEL ( cb )
Corresponding FDS command : MUI_LABEL ( x , y , text )
Places a text at the specified position , similar to MUIF_RO
MUIF_GOTO ( cb )
Corresponding FDS command : MUI_GOTO ( x , y , n , text )
Places a button at the specified position , similar to MUIF_BUTTON , but does not require an ID .
MUIF_BUTTON ( id , cb )
Corresponding FDS command : MUI_XY ( id , x , y ) , MUI_XYT ( id , x , y , text ) , MUI_XYA ( id , x , y , a ) , MUI_XYAT ( id , x , y , a , text )
Places a selectable element on the form .
MUIF_VARIABLE ( id , var , cb )
Corresponding FDS command : MUI_XY ( id , x , y ) , MUI_XYA ( id , x , y , a )
Places a user input element at the specified location .
The correct FDS command depends on the callback function .
2021-08-28 01:42:19 +08:00
*/
2021-08-28 16:10:38 +08:00
2021-08-29 16:50:01 +08:00
# ifndef MUI_H
# define MUI_H
2021-08-09 00:49:36 +08:00
# include <stddef.h>
# include <stdint.h>
# include <string.h>
2021-08-29 16:50:01 +08:00
# if defined(__GNUC__) && defined(__AVR__)
# include <avr/pgmspace.h>
# endif
/*==========================================*/
/* C++ compatible */
# ifdef __cplusplus
extern " C " {
# endif
/*==========================================*/
/* defines */
2021-08-28 15:40:10 +08:00
# define MUI_CHECK_EOFDS
2021-08-09 00:49:36 +08:00
2021-08-29 16:50:01 +08:00
/*==========================================*/
/* GNUC AVR PROGMEM interface */
2021-08-27 19:07:26 +08:00
# ifdef __GNUC__
2021-08-28 15:40:10 +08:00
# define MUI_NOINLINE __attribute__((noinline))
2021-08-27 19:07:26 +08:00
# else
2021-08-28 15:40:10 +08:00
# define MUI_NOINLINE
2021-08-27 19:07:26 +08:00
# endif
2021-08-29 16:50:01 +08:00
# if defined(__GNUC__) && defined(__AVR__)
# define mui_pgm_read(adr) pgm_read_byte_near(adr)
# define mui_pgm_wread(adr) pgm_read_word_near(adr)
# define MUI_PROGMEM PROGMEM
# endif
# ifndef mui_pgm_read
# ifndef CHAR_BIT
# define mui_pgm_read(adr) (*(const uint8_t *)(adr))
# else
# if CHAR_BIT > 8
# define mui_pgm_read(adr) ((*(const uint8_t *)(adr)) & 0x0ff)
# else
# define mui_pgm_read(adr) (*(const uint8_t *)(adr))
# endif
# endif
# endif
# ifndef mui_pgm_wread
# define mui_pgm_wread(adr) (*(const uint16_t *)(adr))
# endif
# ifndef MUI_PROGMEM
# define MUI_PROGMEM
# endif
2021-08-27 19:07:26 +08:00
2021-08-09 00:49:36 +08:00
/*=== forward declarations ===*/
2021-08-28 15:40:10 +08:00
typedef struct mui_struct mui_t ;
2021-08-29 16:50:01 +08:00
typedef const struct muif_struct muif_t ;
typedef uint8_t ( * muif_cb ) ( mui_t * ui , uint8_t msg ) ;
2021-09-11 16:27:40 +08:00
typedef const char fds_t MUI_PROGMEM ;
2021-08-09 00:49:36 +08:00
2021-08-29 16:50:01 +08:00
/*=== struct declarations === */
2021-08-09 00:49:36 +08:00
2021-08-28 01:42:19 +08:00
struct muif_struct
2021-08-09 00:49:36 +08:00
{
uint8_t id0 ;
uint8_t id1 ;
2021-08-28 15:30:19 +08:00
uint8_t cflags ; // config flags e.g. MUIF_CFLAG_IS_CURSOR_SELECTABLE, if so, then it will not receive any cursor/touch msgs
2021-08-09 00:49:36 +08:00
uint8_t extra ;
void * data ; // might be a pointer to a variable
2021-08-28 15:30:19 +08:00
muif_cb cb ; // callback
2021-09-11 16:27:40 +08:00
} MUI_PROGMEM ;
2021-08-09 00:49:36 +08:00
2022-12-10 14:46:22 +08:00
/* assumes that pointers are 16 bit so encapsulate the wread i another ifdef __AVR__ */
2021-08-29 16:50:01 +08:00
# if defined(__GNUC__) && defined(__AVR__)
# define muif_get_id0(muif) mui_pgm_read(&((muif)->id0))
# define muif_get_id1(muif) mui_pgm_read(&((muif)->id1))
# define muif_get_cflags(muif) mui_pgm_read(&((muif)->cflags))
# define muif_get_extra(muif) mui_pgm_read(&((muif)->extra))
# define muif_get_data(muif) ((void *)mui_pgm_wread(&((muif)->data)))
# define muif_get_cb(muif) ((muif_cb)mui_pgm_wread(&((muif)->cb)))
# else
# define muif_get_id0(muif) ((muif)->id0)
# define muif_get_id1(muif) ((muif)->id1)
# define muif_get_cflags(muif) ((muif)->cflags)
# define muif_get_extra(muif) ((muif)->extra)
# define muif_get_data(muif) ((muif)->data)
# define muif_get_cb(muif) ((muif)->cb)
# endif
2021-08-09 00:49:36 +08:00
2021-08-28 15:30:19 +08:00
# define MUIF_MSG_NONE 0
# define MUIF_MSG_DRAW 1
# define MUIF_MSG_FORM_START 2
# define MUIF_MSG_FORM_END 3
2021-09-26 21:32:45 +08:00
/* MUIF_MSG_CURSOR_ENTER return values: 255=skip this field, <255, continue*/
2021-08-28 15:30:19 +08:00
# define MUIF_MSG_CURSOR_ENTER 4
# define MUIF_MSG_CURSOR_SELECT 5
2022-03-07 03:50:26 +08:00
/* optional VALUE messages, ignored by the mui core, but can be used inside the field functions */
/* usually MUIF_MSG_VALUE_INCREMENT behaves like MUIF_MSG_CURSOR_SELECT */
# define MUIF_MSG_VALUE_INCREMENT 6
# define MUIF_MSG_VALUE_DECREMENT 7
# define MUIF_MSG_CURSOR_LEAVE 8
# define MUIF_MSG_TOUCH_DOWN 9
# define MUIF_MSG_TOUCH_UP 10
2021-09-26 21:32:45 +08:00
/* MUIF_MSG_EVENT_NEXT return values: 0=not handled, 1=handled, do nothing */
2022-03-07 03:50:26 +08:00
/* If MUIF_MSG_EVENT_NEXT/PREV are NOT handled by the field function, then this msg will change the field */
# define MUIF_MSG_EVENT_NEXT 11
2021-09-26 21:32:45 +08:00
/* MUIF_MSG_EVENT_PREV return values: 0=not handled, 1=handled, do nothing */
2022-03-07 03:50:26 +08:00
# define MUIF_MSG_EVENT_PREV 12
2021-08-09 00:49:36 +08:00
/* dynamic flags */
2021-08-28 15:30:19 +08:00
# define MUIF_DFLAG_IS_CURSOR_FOCUS 0x01
# define MUIF_DFLAG_IS_TOUCH_FOCUS 0x02
2021-08-09 00:49:36 +08:00
/* config flags */
2021-08-28 15:30:19 +08:00
# define MUIF_CFLAG_IS_CURSOR_SELECTABLE 0x01
# define MUIF_CFLAG_IS_TOUCH_SELECTABLE 0x02
2022-03-07 03:50:26 +08:00
# define MUIF_CFLAG_IS_EXECUTE_ON_SELECT 0x04
/* end user MUIF entries */
# define MUIF(id,cflags,data,cb) { id[0], id[1], cflags, 0, data, cb}
# define MUIF_STYLE(n,cb) MUIF("S" #n, 0, 0, cb)
# define MUIF_RO(id,cb) MUIF(id,0, 0,cb)
# define MUIF_LABEL(cb) MUIF(".L",0, 0,cb)
# define MUIF_GOTO(cb) MUIF(".G",MUIF_CFLAG_IS_CURSOR_SELECTABLE,0,cb)
# define MUIF_BUTTON(id,cb) MUIF(id,MUIF_CFLAG_IS_CURSOR_SELECTABLE,0,cb)
# define MUIF_EXECUTE_ON_SELECT_BUTTON(id,cb) MUIF(id,MUIF_CFLAG_IS_CURSOR_SELECTABLE|MUIF_CFLAG_IS_EXECUTE_ON_SELECT,0,cb)
# define MUIF_VARIABLE(id,var,cb) MUIF(id,MUIF_CFLAG_IS_CURSOR_SELECTABLE,(var),cb)
2021-08-09 00:49:36 +08:00
/* must be smaller than or equal to 255 */
2022-11-14 04:28:01 +08:00
# ifndef MUI_MAX_TEXT_LEN
2021-09-26 21:32:45 +08:00
# define MUI_MAX_TEXT_LEN 41
2022-11-14 04:28:01 +08:00
# endif
2021-08-09 00:49:36 +08:00
2022-01-10 02:53:04 +08:00
# define MUI_MENU_CACHE_CNT 2
2021-08-28 15:30:19 +08:00
struct mui_struct
2021-08-09 00:49:36 +08:00
{
void * graphics_data ;
2021-08-29 16:50:01 +08:00
fds_t * root_fds ;
2021-08-09 00:49:36 +08:00
2021-08-28 15:40:10 +08:00
muif_t * muif_tlist ;
2021-08-28 15:30:19 +08:00
size_t muif_tcnt ;
2021-08-09 00:49:36 +08:00
2021-08-29 16:50:01 +08:00
fds_t * current_form_fds ; // the current form, NULL if the ui is not active at the moment
fds_t * cursor_focus_fds ; // the field which has the current cursor focus, NULL if there is no current focus
fds_t * touch_focus_fds ; // the field which has touch focus
2021-08-10 18:11:34 +08:00
2021-08-29 16:50:01 +08:00
fds_t * token ; // current token position
2021-09-12 23:05:54 +08:00
uint16_t form_scroll_total ; // reserved for MUIF, not used by mui
uint16_t form_scroll_top ; // reserved for MUIF, not used by mui
uint8_t form_scroll_visible ; // reserved for MUIF, not used by mui
2021-08-09 00:49:36 +08:00
2021-08-28 17:33:52 +08:00
//uint8_t selected_value; // This variable is not used by the user interface but can be used by any field function
2021-08-23 00:22:25 +08:00
uint8_t tmp8 ;
2021-09-05 05:25:20 +08:00
2021-09-07 05:51:26 +08:00
/* 0: mse, 1: mud */
uint8_t is_mud ; // a temp variable for the MUIF function to store remember up down mode. This variable will be cleared before sending MUIF_MSG_CURSOR_ENTER
2021-08-09 00:49:36 +08:00
/* current field/style variables */
2021-08-28 15:30:19 +08:00
//uint8_t cursor_focus_position; // the index of the field which has focus, can be used as last argument for mui_EnterForm
2021-08-22 01:32:56 +08:00
2021-08-10 18:11:34 +08:00
uint8_t delimiter ; // outer delimiter of the text part of a field
2021-08-09 00:49:36 +08:00
uint8_t cmd ; // current cmd or field (e.g. U or F)
2021-08-16 06:06:52 +08:00
uint8_t id0 ; // identifier of the field, manually provided or derived (G cmd has fixed id "FG")
2021-08-09 00:49:36 +08:00
uint8_t id1 ;
2021-08-16 06:06:52 +08:00
uint8_t x ; // position of the field
2021-08-09 00:49:36 +08:00
uint8_t y ;
uint8_t dflags ;
2021-08-16 06:06:52 +08:00
uint8_t arg ; // extra argument of the field. For example the G: form is put here
2021-08-29 16:50:01 +08:00
int len ; // length of the current command
fds_t * fds ; // current position, *fds = cmd
2022-03-07 03:50:26 +08:00
muif_t * uif ; // user interface field or style for the given id0 / id1, assigned by mui_prepare_current_field()
2021-08-28 15:40:10 +08:00
char text [ MUI_MAX_TEXT_LEN + 1 ] ;
2021-08-09 00:49:36 +08:00
/* target */
2021-08-29 16:50:01 +08:00
fds_t * tmp_fds ;
fds_t * target_fds ; // used by several task functions as a return / result value
2021-08-23 00:22:25 +08:00
2021-09-26 17:16:14 +08:00
/* last form and field, used by mui_SaveForm and mui_RestoreForm */
2021-08-23 00:22:25 +08:00
uint8_t last_form_id ;
uint8_t last_form_cursor_focus_position ;
2021-09-26 17:16:14 +08:00
fds_t * last_form_fds ; // not used by mui_RestoreForm, but can be used by field functions
2022-01-10 02:53:04 +08:00
/* menu cursor position backup */
uint8_t menu_form_id [ MUI_MENU_CACHE_CNT ] ;
uint8_t menu_form_cursor_focus_position [ MUI_MENU_CACHE_CNT ] ;
uint8_t menu_form_last_added ;
2021-09-11 16:27:40 +08:00
} ;
2021-08-09 00:49:36 +08:00
2021-08-28 15:40:10 +08:00
# define mui_IsCursorFocus(mui) ((mui)->dflags & MUIF_DFLAG_IS_CURSOR_FOCUS)
# define mui_IsTouchFocus(mui) ((mui)->dflags & MUIF_CFLAG_IS_TOUCH_SELECTABLE)
2021-08-22 00:08:28 +08:00
2021-08-09 00:49:36 +08:00
/*=== form string definitions ===*/
2021-08-28 15:40:10 +08:00
# define MUI_0 "\x00"
# define MUI_1 "\x01"
# define MUI_2 "\x02"
# define MUI_3 "\x03"
# define MUI_4 "\x04"
# define MUI_5 "\x05"
# define MUI_6 "\x06"
# define MUI_7 "\x07"
# define MUI_8 "\x08"
# define MUI_9 "\x09"
# define MUI_10 "\x0a"
# define MUI_11 "\x0b"
# define MUI_12 "\x0c"
# define MUI_13 "\x0d"
# define MUI_14 "\x0e"
# define MUI_15 "\x0f"
# define MUI_16 "\x10"
# define MUI_17 "\x11"
# define MUI_18 "\x12"
# define MUI_19 "\x13"
# define MUI_20 "\x14"
# define MUI_21 "\x15"
# define MUI_22 "\x16"
# define MUI_23 "\x17"
# define MUI_24 "\x18"
# define MUI_25 "\x19"
# define MUI_26 "\x1a"
# define MUI_27 "\x1b"
# define MUI_28 "\x1c"
# define MUI_29 "\x1d"
# define MUI_30 "\x1e"
# define MUI_31 "\x1f"
# define MUI_32 "\x20"
# define MUI_33 "\x21"
# define MUI_34 "\x22"
# define MUI_35 "\x23"
# define MUI_36 "\x24"
# define MUI_37 "\x25"
# define MUI_38 "\x26"
# define MUI_39 "\x27"
# define MUI_40 "\x28"
# define MUI_41 "\x29"
# define MUI_42 "\x2a"
# define MUI_43 "\x2b"
# define MUI_44 "\x2c"
# define MUI_45 "\x2d"
# define MUI_46 "\x2e"
# define MUI_47 "\x2f"
# define MUI_48 "\x30"
# define MUI_49 "\x31"
# define MUI_50 "\x32"
# define MUI_51 "\x33"
# define MUI_52 "\x34"
# define MUI_53 "\x35"
# define MUI_54 "\x36"
# define MUI_55 "\x37"
# define MUI_56 "\x38"
# define MUI_57 "\x39"
# define MUI_58 "\x3a"
# define MUI_59 "\x3b"
# define MUI_60 "\x3c"
# define MUI_61 "\x3d"
# define MUI_62 "\x3e"
# define MUI_63 "\x3f"
# define MUI_64 "\x40"
# define MUI_65 "\x41"
# define MUI_66 "\x42"
# define MUI_67 "\x43"
# define MUI_68 "\x44"
# define MUI_69 "\x45"
# define MUI_70 "\x46"
# define MUI_71 "\x47"
# define MUI_72 "\x48"
# define MUI_73 "\x49"
# define MUI_74 "\x4a"
# define MUI_75 "\x4b"
# define MUI_76 "\x4c"
# define MUI_77 "\x4d"
# define MUI_78 "\x4e"
# define MUI_79 "\x4f"
# define MUI_80 "\x50"
# define MUI_81 "\x51"
# define MUI_82 "\x52"
# define MUI_83 "\x53"
# define MUI_84 "\x54"
# define MUI_85 "\x55"
# define MUI_86 "\x56"
# define MUI_87 "\x57"
# define MUI_88 "\x58"
# define MUI_89 "\x59"
# define MUI_90 "\x5a"
# define MUI_91 "\x5b"
# define MUI_92 "\x5c"
# define MUI_93 "\x5d"
# define MUI_94 "\x5e"
# define MUI_95 "\x5f"
# define MUI_96 "\x60"
# define MUI_97 "\x61"
# define MUI_98 "\x62"
# define MUI_99 "\x63"
# define MUI_100 "\x64"
# define MUI_101 "\x65"
# define MUI_102 "\x66"
# define MUI_103 "\x67"
# define MUI_104 "\x68"
# define MUI_105 "\x69"
# define MUI_106 "\x6a"
# define MUI_107 "\x6b"
# define MUI_108 "\x6c"
# define MUI_109 "\x6d"
# define MUI_110 "\x6e"
# define MUI_111 "\x6f"
# define MUI_112 "\x70"
# define MUI_113 "\x71"
# define MUI_114 "\x72"
# define MUI_115 "\x73"
# define MUI_116 "\x74"
# define MUI_117 "\x75"
# define MUI_118 "\x76"
# define MUI_119 "\x77"
# define MUI_120 "\x78"
# define MUI_121 "\x79"
# define MUI_122 "\x7a"
# define MUI_123 "\x7b"
# define MUI_124 "\x7c"
# define MUI_125 "\x7d"
# define MUI_126 "\x7e"
# define MUI_127 "\x7f"
# define MUI_128 "\x80"
# define MUI_129 "\x81"
# define MUI_130 "\x82"
# define MUI_131 "\x83"
# define MUI_132 "\x84"
# define MUI_133 "\x85"
# define MUI_134 "\x86"
# define MUI_135 "\x87"
# define MUI_136 "\x88"
# define MUI_137 "\x89"
# define MUI_138 "\x8a"
# define MUI_139 "\x8b"
# define MUI_140 "\x8c"
# define MUI_141 "\x8d"
# define MUI_142 "\x8e"
# define MUI_143 "\x8f"
# define MUI_144 "\x90"
# define MUI_145 "\x91"
# define MUI_146 "\x92"
# define MUI_147 "\x93"
# define MUI_148 "\x94"
# define MUI_149 "\x95"
# define MUI_150 "\x96"
# define MUI_151 "\x97"
# define MUI_152 "\x98"
# define MUI_153 "\x99"
# define MUI_154 "\x9a"
# define MUI_155 "\x9b"
# define MUI_156 "\x9c"
# define MUI_157 "\x9d"
# define MUI_158 "\x9e"
# define MUI_159 "\x9f"
# define MUI_160 "\xa0"
# define MUI_161 "\xa1"
# define MUI_162 "\xa2"
# define MUI_163 "\xa3"
# define MUI_164 "\xa4"
# define MUI_165 "\xa5"
# define MUI_166 "\xa6"
# define MUI_167 "\xa7"
# define MUI_168 "\xa8"
# define MUI_169 "\xa9"
# define MUI_170 "\xaa"
# define MUI_171 "\xab"
# define MUI_172 "\xac"
# define MUI_173 "\xad"
# define MUI_174 "\xae"
# define MUI_175 "\xaf"
# define MUI_176 "\xb0"
# define MUI_177 "\xb1"
# define MUI_178 "\xb2"
# define MUI_179 "\xb3"
# define MUI_180 "\xb4"
# define MUI_181 "\xb5"
# define MUI_182 "\xb6"
# define MUI_183 "\xb7"
# define MUI_184 "\xb8"
# define MUI_185 "\xb9"
# define MUI_186 "\xba"
# define MUI_187 "\xbb"
# define MUI_188 "\xbc"
# define MUI_189 "\xbd"
# define MUI_190 "\xbe"
# define MUI_191 "\xbf"
# define MUI_192 "\xc0"
# define MUI_193 "\xc1"
# define MUI_194 "\xc2"
# define MUI_195 "\xc3"
# define MUI_196 "\xc4"
# define MUI_197 "\xc5"
# define MUI_198 "\xc6"
# define MUI_199 "\xc7"
# define MUI_200 "\xc8"
# define MUI_201 "\xc9"
# define MUI_202 "\xca"
# define MUI_203 "\xcb"
# define MUI_204 "\xcc"
# define MUI_205 "\xcd"
# define MUI_206 "\xce"
# define MUI_207 "\xcf"
# define MUI_208 "\xd0"
# define MUI_209 "\xd1"
# define MUI_210 "\xd2"
# define MUI_211 "\xd3"
# define MUI_212 "\xd4"
# define MUI_213 "\xd5"
# define MUI_214 "\xd6"
# define MUI_215 "\xd7"
# define MUI_216 "\xd8"
# define MUI_217 "\xd9"
# define MUI_218 "\xda"
# define MUI_219 "\xdb"
# define MUI_220 "\xdc"
# define MUI_221 "\xdd"
# define MUI_222 "\xde"
# define MUI_223 "\xdf"
# define MUI_224 "\xe0"
# define MUI_225 "\xe1"
# define MUI_226 "\xe2"
# define MUI_227 "\xe3"
# define MUI_228 "\xe4"
# define MUI_229 "\xe5"
# define MUI_230 "\xe6"
# define MUI_231 "\xe7"
# define MUI_232 "\xe8"
# define MUI_233 "\xe9"
# define MUI_234 "\xea"
# define MUI_235 "\xeb"
# define MUI_236 "\xec"
# define MUI_237 "\xed"
# define MUI_238 "\xee"
# define MUI_239 "\xef"
# define MUI_240 "\xf0"
# define MUI_241 "\xf1"
# define MUI_242 "\xf2"
# define MUI_243 "\xf3"
# define MUI_244 "\xf4"
# define MUI_245 "\xf5"
# define MUI_246 "\xf6"
# define MUI_247 "\xf7"
# define MUI_248 "\xf8"
# define MUI_249 "\xf9"
# define MUI_250 "\xfa"
# define MUI_251 "\xfb"
# define MUI_252 "\xfc"
# define MUI_253 "\xfd"
# define MUI_254 "\xfe"
# define MUI_255 "\xff"
2021-08-09 00:49:36 +08:00
/* form: one id only */
2021-08-28 15:40:10 +08:00
# define MUI_FORM(n) "U" MUI_##n
2021-08-28 18:44:34 +08:00
/* style: one id only */
# define MUI_STYLE(n) "S" #n
2022-01-08 02:46:39 +08:00
# define MUI_AUX(id) "Z" id
2021-09-26 17:16:14 +08:00
# define MUI_DATA(id, text) "D" id "\xff" text "\xff"
2021-08-28 18:44:34 +08:00
2021-08-29 02:06:39 +08:00
# define MUI_XY(id, x, y) "F" id MUI_##x MUI_##y
2021-08-09 00:49:36 +08:00
/* button id must be two chars, but must be unique everywhere */
2021-08-28 15:40:10 +08:00
# define MUI_XYT(id, x,y,text) "B" id MUI_##x MUI_##y "\xff" text "\xff"
# define MUI_XYA(id, x,y,a) "A" id MUI_##x MUI_##y MUI_##a
# define MUI_XYAT(id, x,y,a,text) "T" id MUI_##x MUI_##y MUI_##a "\xff" text "\xff"
2021-08-27 16:09:34 +08:00
2021-08-29 00:10:17 +08:00
# define MUI_LABEL(x,y,text) "L" MUI_##x MUI_##y "\xff" text "\xff"
2021-08-28 15:40:10 +08:00
# define MUI_GOTO(x,y,n,text) "G" MUI_##x MUI_##y MUI_##n "\xff" text "\xff"
# define MUI_goto(x,y,n,text) "g" MUI_##x MUI_##y MUI_##n "\xff" text "\xff"
2021-08-09 00:49:36 +08:00
2021-08-29 16:50:01 +08:00
uint8_t mui_get_fds_char ( fds_t * s ) MUI_NOINLINE ;
2021-08-15 22:23:17 +08:00
2021-08-28 16:10:38 +08:00
uint8_t mui_fds_first_token ( mui_t * ui ) MUI_NOINLINE ;
uint8_t mui_fds_next_token ( mui_t * ui ) MUI_NOINLINE ;
uint8_t mui_fds_get_nth_token ( mui_t * ui , uint8_t n ) MUI_NOINLINE ;
uint8_t mui_fds_get_token_cnt ( mui_t * ui ) MUI_NOINLINE ;
2021-08-28 15:40:10 +08:00
2021-08-29 16:50:01 +08:00
void mui_Init ( mui_t * ui , void * graphics_data , fds_t * fds , muif_t * muif_tlist , size_t muif_tcnt ) ;
2021-09-07 05:51:26 +08:00
uint8_t mui_GetCurrentCursorFocusPosition ( mui_t * ui ) ;
2021-08-28 15:40:10 +08:00
void mui_Draw ( mui_t * ui ) ;
2021-09-26 17:16:14 +08:00
/* warning: The next function will overwrite the ui field variables like ui->arg, etc. 26 sep 2021: only ui->text is modified */
2021-09-26 21:32:45 +08:00
uint8_t mui_GetSelectableFieldTextOption ( mui_t * ui , fds_t * fds , uint8_t nth_token ) ;
2021-09-26 17:16:14 +08:00
/* warning: The next function will overwrite the ui field variables like ui->arg, etc 26 sep 2021: only ui->text is modified*/
uint8_t mui_GetSelectableFieldOptionCnt ( mui_t * ui , fds_t * fds ) ;
2021-08-29 18:32:43 +08:00
void mui_EnterForm ( mui_t * ui , fds_t * fds , uint8_t initial_cursor_position ) ;
2021-08-28 15:40:10 +08:00
void mui_LeaveForm ( mui_t * ui ) ;
uint8_t mui_GotoForm ( mui_t * ui , uint8_t form_id , uint8_t initial_cursor_position ) ;
2022-01-10 02:53:04 +08:00
void mui_SaveForm ( mui_t * ui ) ; /* Save current form+cursor position. Used together with mui_RestoreForm */
void mui_RestoreForm ( mui_t * ui ) ; /* Restore form and cursor position, previously saved with mui_SaveForm */
void mui_SaveCursorPosition ( mui_t * ui , uint8_t cursor_position ) ; /* stores a cursor position for use with mui_GotoFormAutoCursorPosition */
uint8_t mui_GotoFormAutoCursorPosition ( mui_t * ui , uint8_t form_id ) ;
int mui_GetCurrentFormId ( mui_t * ui ) ; /* form id or -1 if the menu system is inactive */
2021-08-28 15:40:10 +08:00
void mui_NextField ( mui_t * ui ) ;
void mui_PrevField ( mui_t * ui ) ;
void mui_SendSelect ( mui_t * ui ) ;
2022-03-07 03:50:26 +08:00
void mui_SendSelectWithExecuteOnSelectFieldSearch ( mui_t * ui ) ; /* use this if MUIF_EXECUTE_ON_SELECT_BUTTON is used */
void mui_SendValueIncrement ( mui_t * ui ) ;
void mui_SendValueDecrement ( mui_t * ui ) ;
2021-08-28 15:40:10 +08:00
2021-09-26 17:16:14 +08:00
2021-08-29 18:32:43 +08:00
# define mui_IsFormActive(ui) ((ui)->current_form_fds != NULL)
2021-08-29 16:50:01 +08:00
# ifdef __cplusplus
}
# endif
# endif /* MUI_H */
2021-08-28 01:42:19 +08:00