Embedded SDK
Embedded SDK
Loading...
Searching...
No Matches
nbgl_step.c
Go to the documentation of this file.
1
6#ifdef NBGL_STEP
7/*********************
8 * INCLUDES
9 *********************/
10#include <string.h>
11#include "nbgl_debug.h"
12#include "nbgl_step.h"
13#include "glyphs.h"
14#include "os_pic.h"
15#include "os_print.h"
16#ifdef BUILD_SCREENSHOTS
17#include "json_scenario.h"
18#endif // BUILD_SCREENSHOTS
19
20/*********************
21 * DEFINES
22 *********************/
23// string to store the title for a multi-pages text+subtext
24#define TMP_STRING_MAX_LEN 24
25
27#define NB_MAX_LAYERS 3
28
29/**********************
30 * TYPEDEFS
31 **********************/
35typedef enum {
36 TEXT_STEP = 0,
37 CENTERED_INFO_STEP,
38 MENU_LIST_STEP
39} StepStype_t;
40
44typedef struct TextContext_s {
45 uint8_t nbPages;
46 uint8_t currentPage;
47 const char *txtStart;
48 const char *nextPageStart;
49 const char *subTxtStart;
50
52 bool actionOnAnyButton;
53 nbgl_stepButtonCallback_t onActionCallback;
55 char tmpString[TMP_STRING_MAX_LEN];
58 style;
59} TextContext_t;
60
64typedef struct MenuListContext_s {
66 selectedCallback;
68 list;
69} MenuListContext_t;
70
71typedef struct StepContext_s {
72 union {
73 TextContext_t textContext;
74 MenuListContext_t menuListContext;
75 };
77 nbgl_layout_t *layout;
78 StepStype_t type;
79 bool modal;
80} StepContext_t;
81
82/**********************
83 * STATIC VARIABLES
84 **********************/
86static StepContext_t contexts[NB_MAX_LAYERS];
87
88/**********************
89 * VARIABLES
90 **********************/
91#ifdef BUILD_SCREENSHOTS
92// Variables used to store important values (nb lines, bold state etc)
93extern uint16_t last_nb_lines;
94extern uint16_t last_nb_pages;
95extern bool last_bold_state;
96#endif // BUILD_SCREENSHOTS
97
98/**********************
99 * STATIC PROTOTYPES
100 **********************/
101
102static void actionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event);
103static void menuListActionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event);
104
105// returns a non-used step context from the contexts[] array, or NULL if not found
106static StepContext_t *getFreeContext(StepStype_t type, bool modal)
107{
108 StepContext_t *ctx = NULL;
109
110 if (!modal) {
111 // Index 0 is reserved for background
112 ctx = &contexts[0];
113 }
114 else {
115 uint32_t i = 1;
116 while (i < NB_MAX_LAYERS) {
117 if (contexts[i].layout == NULL) {
118 ctx = &contexts[i];
119 break;
120 }
121 i++;
122 }
123 }
124 if (ctx == NULL) {
125 LOG_FATAL(STEP_LOGGER, "getFreeContext(): no available context\n");
126 }
127 else {
128 memset(ctx, 0, sizeof(StepContext_t));
129 ctx->type = type;
130 ctx->modal = modal;
131 }
132 return ctx;
133}
134
135// returns the step context from the contexts[] array matching with the given layout handler, or
136// NULL if not found
137static StepContext_t *getContextFromLayout(nbgl_layout_t layout)
138{
139 StepContext_t *ctx = NULL;
140 uint32_t i = 0;
141 while (i < NB_MAX_LAYERS) {
142 if (contexts[i].layout == layout) {
143 ctx = &contexts[i];
144 break;
145 }
146 i++;
147 }
148 if (ctx == NULL) {
149 LOG_WARN(STEP_LOGGER, "getContextFromLayout(): no matching context\n");
150 }
151 return ctx;
152}
153
154// from the current details context, return a pointer on the details at the given page
155static const char *getTextPageAt(StepContext_t *ctx, uint8_t textPage)
156{
157 uint8_t page = 0;
158 const char *currentChar = ctx->textContext.txtStart;
159 while (page < textPage) {
160 if (page < (ctx->textContext.nbPages - 1)) {
161 uint16_t len;
163 currentChar,
166 &len,
167 true);
168 currentChar = currentChar + len;
169 }
170 page++;
171 }
172 return currentChar;
173}
174
175// from the current details context, return a pointer on the details at the given page, for subText
176static const char *getSubTextPageAt(StepContext_t *ctx, uint8_t textPage)
177{
178 uint8_t page = 0;
179 const char *currentChar = ctx->textContext.subTxtStart;
180 while (page < textPage) {
181 if (page < (ctx->textContext.nbPages - 1)) {
182 uint16_t len;
184 currentChar,
186 NB_MAX_LINES - 1,
187 &len,
188 true);
189 currentChar = currentChar + len;
190 }
191 page++;
192 }
193 return currentChar;
194}
195
196// utility function to compute navigation arrows
197static nbgl_layoutNavIndication_t getNavigationInfo(nbgl_stepPosition_t pos,
198 uint8_t nbPages,
199 uint8_t currentPage)
200{
202
203 if (nbPages > 1) {
204 if (currentPage > 0) {
205 indication |= LEFT_ARROW;
206 }
207 if (currentPage < (nbPages - 1)) {
208 indication |= RIGHT_ARROW;
209 }
210 }
211 if (pos == FIRST_STEP) {
212 indication |= RIGHT_ARROW;
213 }
214 else if (pos == LAST_STEP) {
215 indication |= LEFT_ARROW;
216 }
217 else if (pos == NEITHER_FIRST_NOR_LAST_STEP) {
218 indication |= RIGHT_ARROW | LEFT_ARROW;
219 }
220 return indication;
221}
222
223// function used to display the current page in details review mode
224static void displayTextPage(StepContext_t *ctx, uint8_t textPage)
225{
226 const char *txt;
227 char intermediateString[36]; // a bit bigger but we know that one line cannot contain
228 // more than 23 chars
229
230 // if move backward or first page
231 if (textPage <= ctx->textContext.currentPage) {
232 // recompute current start from beginning
233 if (ctx->textContext.subTxtStart == NULL) {
234 txt = getTextPageAt(ctx, textPage);
235 }
236 else {
237 txt = getSubTextPageAt(ctx, textPage);
238 }
239 }
240 // else move forward
241 else {
242 txt = ctx->textContext.nextPageStart;
243 }
244 ctx->textContext.currentPage = textPage;
245
246 if (ctx->textContext.currentPage < (ctx->textContext.nbPages - 1)) {
247 uint16_t len;
248 uint8_t nbLines
249 = (ctx->textContext.subTxtStart == NULL) ? NB_MAX_LINES : (NB_MAX_LINES - 1);
251 BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, txt, AVAILABLE_WIDTH, nbLines, &len, true);
252 // memorize next position to save processing
253 ctx->textContext.nextPageStart = txt + len;
254 // if the next char is '\n', skip it to avoid starting with an empty line
255 if (*ctx->textContext.nextPageStart == '\n') {
256 ctx->textContext.nextPageStart++;
257 }
258 }
259 else {
260 ctx->textContext.nextPageStart = NULL;
261 }
262 nbgl_layoutDescription_t layoutDescription;
263 nbgl_layoutNavigation_t navInfo = {
265 };
266
267 layoutDescription.modal = ctx->modal;
268 layoutDescription.onActionCallback = actionCallback;
269 layoutDescription.ticker.tickerCallback = ctx->ticker.tickerCallback;
270 layoutDescription.ticker.tickerIntervale = ctx->ticker.tickerIntervale;
271 layoutDescription.ticker.tickerValue = ctx->ticker.tickerValue;
272 ctx->layout = nbgl_layoutGet(&layoutDescription);
273
274 navInfo.indication = getNavigationInfo(
275 ctx->textContext.pos, ctx->textContext.nbPages, ctx->textContext.currentPage);
276
277 if (ctx->textContext.subTxtStart == NULL) {
278 nbgl_layoutAddText(ctx->layout, txt, NULL, ctx->textContext.style);
279 }
280 else {
281 if (ctx->textContext.nbPages == 1) {
282 // truncate title to fit in one line, if necessary
284 ctx->textContext.txtStart,
286 false)
287 > 1) {
289 ctx->textContext.txtStart,
291 1,
292 ctx->textContext.tmpString,
293 TMP_STRING_MAX_LEN);
294 }
295 else {
296 // simply copy
297 memcpy(
298 ctx->textContext.tmpString, ctx->textContext.txtStart, TMP_STRING_MAX_LEN - 1);
299 ctx->textContext.tmpString[TMP_STRING_MAX_LEN - 1] = 0;
300 }
301 }
302 else {
303 SPRINTF(intermediateString,
304 "%s (%d/%d)",
305 ctx->textContext.txtStart,
306 ctx->textContext.currentPage + 1,
307 ctx->textContext.nbPages);
308 // truncate title to fit in one line, if necessary
310 intermediateString,
312 false)
313 > 1) {
315 intermediateString,
317 1,
318 ctx->textContext.tmpString,
319 TMP_STRING_MAX_LEN);
320 }
321 else {
322 // simply copy
323 memcpy(ctx->textContext.tmpString, intermediateString, TMP_STRING_MAX_LEN - 1);
324 ctx->textContext.tmpString[TMP_STRING_MAX_LEN - 1] = 0;
325 }
326 }
327 nbgl_layoutAddText(ctx->layout, ctx->textContext.tmpString, txt, ctx->textContext.style);
328 }
329 if (navInfo.indication != NO_ARROWS) {
330 nbgl_layoutAddNavigation(ctx->layout, &navInfo);
331 }
332 nbgl_layoutDraw(ctx->layout);
333 nbgl_refresh();
334}
335
336// callback on key touch
337static void actionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event)
338{
339 StepContext_t *ctx = getContextFromLayout(layout);
340
341 if (!ctx) {
342 return;
343 }
344 if (event == BUTTON_LEFT_PRESSED) {
345 if (ctx->textContext.currentPage > 0) {
346 displayTextPage(ctx, ctx->textContext.currentPage - 1);
347 return;
348 }
349 else if ((ctx->textContext.pos == LAST_STEP)
350 || (ctx->textContext.pos == NEITHER_FIRST_NOR_LAST_STEP)
351 || (ctx->textContext.actionOnAnyButton)) {
352 if (ctx->textContext.onActionCallback != NULL) {
353 ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
354 }
355 }
356 }
357 else if (event == BUTTON_RIGHT_PRESSED) {
358 if (ctx->textContext.currentPage < (ctx->textContext.nbPages - 1)) {
359 displayTextPage(ctx, ctx->textContext.currentPage + 1);
360 return;
361 }
362 else if ((ctx->textContext.pos == FIRST_STEP)
363 || (ctx->textContext.pos == NEITHER_FIRST_NOR_LAST_STEP)
364 || (ctx->textContext.actionOnAnyButton)) {
365 if (ctx->textContext.onActionCallback != NULL) {
366 ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
367 }
368 }
369 }
370 else if (event == BUTTON_BOTH_PRESSED) {
371 if (ctx->textContext.onActionCallback != NULL) {
372 ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
373 }
374 }
375}
376
377static void displayMenuList(StepContext_t *ctx)
378{
379 nbgl_layoutDescription_t layoutDescription
380 = {.modal = ctx->modal, .onActionCallback = menuListActionCallback};
381 nbgl_layoutMenuList_t *list = &ctx->menuListContext.list;
382
383 layoutDescription.ticker.tickerCallback = ctx->ticker.tickerCallback;
384 layoutDescription.ticker.tickerIntervale = ctx->ticker.tickerIntervale;
385 layoutDescription.ticker.tickerValue = ctx->ticker.tickerValue;
386
387 ctx->layout = nbgl_layoutGet(&layoutDescription);
388 nbgl_layoutAddMenuList(ctx->layout, list);
389 if (list->nbChoices > 1) {
391 navInfo.indication = 0;
392 if (list->selectedChoice > 0) {
393 navInfo.indication |= LEFT_ARROW;
394 }
395 if (list->selectedChoice < (list->nbChoices - 1)) {
396 navInfo.indication |= RIGHT_ARROW;
397 }
398
399 if (navInfo.indication != NO_ARROWS) {
400 nbgl_layoutAddNavigation(ctx->layout, &navInfo);
401 }
402 }
403 nbgl_layoutDraw(ctx->layout);
404 nbgl_refresh();
405}
406
407// callback on key touch
408static void menuListActionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event)
409{
410 StepContext_t *ctx = getContextFromLayout(layout);
411 if (!ctx) {
412 return;
413 }
414
415 if (event == BUTTON_LEFT_PRESSED) {
416 if (ctx->menuListContext.list.selectedChoice > 0) {
417 ctx->menuListContext.list.selectedChoice--;
418 displayMenuList(ctx);
419 }
420 }
421 else if (event == BUTTON_RIGHT_PRESSED) {
422 if (ctx->menuListContext.list.selectedChoice < (ctx->menuListContext.list.nbChoices - 1)) {
423 ctx->menuListContext.list.selectedChoice++;
424 displayMenuList(ctx);
425 }
426 }
427 else if (event == BUTTON_BOTH_PRESSED) {
428 ctx->menuListContext.selectedCallback(ctx->menuListContext.list.selectedChoice);
429 }
430}
431
432/**********************
433 * GLOBAL FUNCTIONS
434 **********************/
435
451 nbgl_stepButtonCallback_t onActionCallback,
453 const char *text,
454 const char *subText,
456 bool modal)
457{
458#ifdef BUILD_SCREENSHOTS
459 // Initialize a default area
460 nbgl_area_t area;
461 area.x0 = area.y0 = 0;
462 area.width = AVAILABLE_WIDTH;
464#endif // BUILD_SCREENSHOTS
465 StepContext_t *ctx = getFreeContext(TEXT_STEP, modal);
466 if (!ctx) {
467 return NULL;
468 }
469 // initialize context (already set to 0 by getFreeContext())
470 ctx->textContext.onActionCallback = onActionCallback;
471 if (ticker) {
472 ctx->ticker.tickerCallback = ticker->tickerCallback;
473 ctx->ticker.tickerIntervale = ticker->tickerIntervale;
474 ctx->ticker.tickerValue = ticker->tickerValue;
475 }
476
477 // if no subText, get the number of pages for main text
478 if (subText == NULL) {
479 ctx->textContext.nbPages = nbgl_getTextNbPagesInWidth(
481#ifdef BUILD_SCREENSHOTS
482 store_string_infos(text,
484 &area,
485 true,
486 last_nb_lines,
487 last_nb_pages,
488 last_bold_state);
489#endif // BUILD_SCREENSHOTS
490 }
491 else {
492#ifdef BUILD_SCREENSHOTS
493 uint16_t nb_lines_title;
494 // Call this function to get correct nb_lines/nb_pages for text field.
497 nb_lines_title = last_nb_lines;
498 // There is a sub text, so no more than 3 lines for title...
499 if (nb_lines_title > 3) {
500 nb_lines_title = 3;
501 }
502 area.height
504 store_string_infos(text,
506 &area,
507 true,
508 last_nb_lines,
509 last_nb_pages,
510 last_bold_state);
511#endif // BUILD_SCREENSHOTS
512 // NB_MAX_LINES-1 because first line is for main text
513 ctx->textContext.nbPages = nbgl_getTextNbPagesInWidth(
515#ifdef BUILD_SCREENSHOTS
516 area.height = (NB_MAX_LINES - nb_lines_title)
518 // If subTxtid is not valid, we'll use txtId for nb_lines/nb_pages values
519 store_string_infos(subText,
521 &area,
522 true,
523 last_nb_lines,
524 last_nb_pages,
525 last_bold_state);
526#endif // BUILD_SCREENSHOTS
527 }
529 "nbgl_stepDrawText: ctx = %p, nbPages = %d, pos = 0x%X\n",
530 ctx,
531 ctx->textContext.nbPages,
532 pos);
533 if (pos & BACKWARD_DIRECTION) {
534 // start with last page
535 ctx->textContext.currentPage = ctx->textContext.nbPages - 1;
536 }
537 ctx->textContext.txtStart = text;
538 ctx->textContext.subTxtStart = subText;
539 // keep only direction part of position
540 ctx->textContext.pos = pos & STEP_POSITION_MASK;
541 ctx->textContext.actionOnAnyButton = (pos & ACTION_ON_ANY_BUTTON) != 0;
542 ctx->textContext.style = style;
543 displayTextPage(ctx, ctx->textContext.currentPage);
544
545 return (nbgl_step_t) ctx;
546}
547
559 nbgl_stepButtonCallback_t onActionCallback,
562 bool modal)
563{
564 nbgl_layoutDescription_t layoutDescription
565 = {.modal = modal, .onActionCallback = (nbgl_layoutButtonCallback_t) actionCallback};
566 nbgl_layoutNavigation_t navInfo = {
568 };
569 StepContext_t *ctx = getFreeContext(CENTERED_INFO_STEP, modal);
570 if (!ctx) {
571 return NULL;
572 }
573
574 // initialize context (already set to 0 by getFreeContext())
575 ctx->textContext.onActionCallback = onActionCallback;
576 if (ticker) {
577 ctx->ticker.tickerCallback = ticker->tickerCallback;
578 ctx->ticker.tickerIntervale = ticker->tickerIntervale;
579 ctx->ticker.tickerValue = ticker->tickerValue;
580 layoutDescription.ticker.tickerCallback = ticker->tickerCallback;
581 layoutDescription.ticker.tickerIntervale = ticker->tickerIntervale;
582 layoutDescription.ticker.tickerValue = ticker->tickerValue;
583 }
584
585 ctx->textContext.nbPages = 1;
586 // keep only direction part of position
587 ctx->textContext.pos = pos & (RIGHT_ARROW | LEFT_ARROW);
588 navInfo.indication = getNavigationInfo(
589 ctx->textContext.pos, ctx->textContext.nbPages, ctx->textContext.currentPage);
590
591 ctx->layout = nbgl_layoutGet(&layoutDescription);
592 nbgl_layoutAddCenteredInfo(ctx->layout, info);
593 if (navInfo.indication != NO_ARROWS) {
594 nbgl_layoutAddNavigation(ctx->layout, &navInfo);
595 }
596 nbgl_layoutDraw(ctx->layout);
597 nbgl_refresh();
598
599 LOG_DEBUG(STEP_LOGGER, "nbgl_stepDrawCenteredInfo(): step = %p\n", ctx);
600 return (nbgl_step_t) ctx;
601}
602
616 bool modal)
617{
618 StepContext_t *ctx = getFreeContext(MENU_LIST_STEP, modal);
619 if (!ctx) {
620 return NULL;
621 }
622
623 // initialize context (already set to 0 by getFreeContext())
624 if (ticker) {
625 ctx->ticker.tickerCallback = ticker->tickerCallback;
626 ctx->ticker.tickerIntervale = ticker->tickerIntervale;
627 ctx->ticker.tickerValue = ticker->tickerValue;
628 }
629
630 ctx->menuListContext.list.nbChoices = list->nbChoices;
631 ctx->menuListContext.list.selectedChoice = list->selectedChoice;
632 ctx->menuListContext.list.callback = list->callback;
633 ctx->menuListContext.selectedCallback = onActionCallback;
634
635 displayMenuList(ctx);
636
637 LOG_DEBUG(STEP_LOGGER, "nbgl_stepDrawMenuList(): step = %p\n", ctx);
638
639 return (nbgl_step_t) ctx;
640}
641
649{
650 StepContext_t *ctx = (StepContext_t *) step;
651 if (!ctx) {
652 return 0;
653 }
654 return (ctx->menuListContext.list.selectedChoice);
655}
656
670 nbgl_stepButtonCallback_t onActionCallback,
672 nbgl_layoutSwitch_t *switchInfo,
673 bool modal)
674{
675 nbgl_layoutDescription_t layoutDescription
676 = {.modal = modal, .onActionCallback = (nbgl_layoutButtonCallback_t) actionCallback};
677 nbgl_layoutNavigation_t navInfo = {
679 };
680 StepContext_t *ctx = getFreeContext(CENTERED_INFO_STEP, modal);
681 if (!ctx) {
682 return NULL;
683 }
684
685 // initialize context (already set to 0 by getFreeContext())
686 ctx->textContext.onActionCallback = onActionCallback;
687 if (ticker) {
688 ctx->ticker.tickerCallback = ticker->tickerCallback;
689 ctx->ticker.tickerIntervale = ticker->tickerIntervale;
690 ctx->ticker.tickerValue = ticker->tickerValue;
691 layoutDescription.ticker.tickerCallback = ticker->tickerCallback;
692 layoutDescription.ticker.tickerIntervale = ticker->tickerIntervale;
693 layoutDescription.ticker.tickerValue = ticker->tickerValue;
694 }
695
696 ctx->textContext.nbPages = 1;
697 // keep only direction part of position
698 ctx->textContext.pos = pos & (RIGHT_ARROW | LEFT_ARROW);
699 navInfo.indication = getNavigationInfo(
700 ctx->textContext.pos, ctx->textContext.nbPages, ctx->textContext.currentPage);
701
702 ctx->layout = nbgl_layoutGet(&layoutDescription);
703 nbgl_layoutAddSwitch(ctx->layout, switchInfo);
704 if (navInfo.indication != NO_ARROWS) {
705 nbgl_layoutAddNavigation(ctx->layout, &navInfo);
706 }
707 nbgl_layoutDraw(ctx->layout);
708 nbgl_refresh();
709
710 LOG_DEBUG(STEP_LOGGER, "nbgl_stepDrawSwitch(): ctx = %p\n", ctx);
711 return (nbgl_step_t) ctx;
712}
713
721{
722 StepContext_t *ctx = (StepContext_t *) step;
723 int ret;
724
725 LOG_DEBUG(STEP_LOGGER, "nbgl_stepRelease(): ctx = %p\n", ctx);
726 if (!ctx) {
727 return -1;
728 }
729 ret = nbgl_layoutRelease((nbgl_layout_t *) ctx->layout);
730
731 ctx->layout = NULL;
732
733 return ret;
734}
735
736#endif // NBGL_STEP
nbgl_contentCenteredInfoStyle_t
possible styles for Centered Info Area
debug traces management
#define LOG_WARN(__logger,...)
Definition nbgl_debug.h:87
#define LOG_DEBUG(__logger,...)
Definition nbgl_debug.h:86
#define LOG_FATAL(__logger,...)
Definition nbgl_debug.h:88
@ STEP_LOGGER
Definition nbgl_debug.h:40
uint8_t nbgl_getTextNbPagesInWidth(nbgl_font_id_e fontId, const char *text, uint8_t nbLinesPerPage, uint16_t maxWidth)
compute the number of pages of nbLinesPerPage lines per page of the given text fitting in the given m...
Definition nbgl_fonts.c:875
bool nbgl_getTextMaxLenInNbLines(nbgl_font_id_e fontId, const char *text, uint16_t maxWidth, uint16_t maxNbLines, uint16_t *len, bool wrapping)
compute the len of the given text (in bytes) fitting in the given maximum nb lines,...
Definition nbgl_fonts.c:562
@ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp
Definition nbgl_fonts.h:145
@ BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp
Definition nbgl_fonts.h:143
void nbgl_textReduceOnNbLines(nbgl_font_id_e fontId, const char *origText, uint16_t maxWidth, uint8_t nbLines, char *reducedText, uint16_t reducedTextLen)
Create a reduced version of given ASCII text to wrap it on the given max width (in pixels),...
uint16_t nbgl_getTextNbLinesInWidth(nbgl_font_id_e fontId, const char *text, uint16_t maxWidth, bool wrapping)
compute the number of lines of the given text fitting in the given maxWidth
Definition nbgl_fonts.c:721
uint8_t nbgl_getFontLineHeight(nbgl_font_id_e fontId)
return the height in pixels of the line of font with the given font ID
Definition nbgl_fonts.c:400
#define NB_MAX_LINES
Definition nbgl_layout.h:97
@ VERTICAL_NAV
'\/' and '/\' are displayed, to navigate in a list (vertical scrolling)
@ HORIZONTAL_NAV
'<' and '>' are displayed, to navigate between pages and steps
int nbgl_layoutAddText(nbgl_layout_t *layout, const char *text, const char *subText)
Creates an area with given text (in bold) and sub text (in regular)
nbgl_layoutNavIndication_t
possible styles for Navigation arrows (it's a bit field)
@ NO_ARROWS
@ LEFT_ARROW
left arrow is used
@ RIGHT_ARROW
right arrow is used
int nbgl_layoutAddCenteredInfo(nbgl_layout_t *layout, const nbgl_layoutCenteredInfo_t *info)
Creates an area on the center of the main panel, with a possible icon/image, a possible text in black...
int nbgl_layoutDraw(nbgl_layout_t *layout)
Applies given layout. The screen will be redrawn.
#define AVAILABLE_WIDTH
Definition nbgl_layout.h:94
void * nbgl_layout_t
type shared externally
int nbgl_layoutAddSwitch(nbgl_layout_t *layout, const nbgl_layoutSwitch_t *switchLayout)
Creates a switch with the given text and its state.
nbgl_layout_t * nbgl_layoutGet(const nbgl_layoutDescription_t *description)
returns a layout of the given type. The layout is reset
void(* nbgl_layoutButtonCallback_t)(nbgl_layout_t *layout, nbgl_buttonEvent_t event)
prototype of function to be called when buttons are touched on a screen
int nbgl_layoutRelease(nbgl_layout_t *layout)
Release the layout obtained with nbgl_layoutGet()
void nbgl_refresh(void)
This functions refreshes the actual screen on display with what has changed since the last refresh.
Definition nbgl_obj.c:1661
nbgl_buttonEvent_t
Definition nbgl_obj.h:207
@ BUTTON_BOTH_PRESSED
Sent when both buttons are released.
Definition nbgl_obj.h:214
@ BUTTON_LEFT_PRESSED
Sent when Left button is released.
Definition nbgl_obj.h:208
@ BUTTON_RIGHT_PRESSED
Send when Right button is released.
Definition nbgl_obj.h:209
struct PACKED__ nbgl_screenTickerConfiguration_s nbgl_screenTickerConfiguration_t
struct to configure a screen layer
Step construction API of NBGL.
void(* nbgl_stepButtonCallback_t)(nbgl_step_t stepCtx, nbgl_buttonEvent_t event)
prototype of function to be called when buttons are touched on a screen
Definition nbgl_step.h:57
uint8_t nbgl_stepGetMenuListCurrent(nbgl_step_t step)
nbgl_step_t nbgl_stepDrawSwitch(nbgl_stepPosition_t pos, nbgl_stepButtonCallback_t onActionCallback, nbgl_screenTickerConfiguration_t *ticker, nbgl_layoutSwitch_t *switchInfo, bool modal)
void * nbgl_step_t
type shared externally
Definition nbgl_step.h:44
uint8_t nbgl_stepPosition_t
this type is a bitfield containing:
Definition nbgl_step.h:88
@ NEITHER_FIRST_NOR_LAST_STEP
neither first nor last in a multiple steps flow
Definition nbgl_step.h:67
@ LAST_STEP
last in a multiple steps flow
Definition nbgl_step.h:66
@ FIRST_STEP
first in a multiple steps flow
Definition nbgl_step.h:65
#define STEP_POSITION_MASK
Definition nbgl_step.h:79
nbgl_step_t nbgl_stepDrawMenuList(nbgl_stepMenuListCallback_t onActionCallback, nbgl_screenTickerConfiguration_t *ticker, nbgl_layoutMenuList_t *list, bool modal)
#define ACTION_ON_ANY_BUTTON
When action callback applies only on both button press.
Definition nbgl_step.h:75
int nbgl_stepRelease(nbgl_step_t step)
void(* nbgl_stepMenuListCallback_t)(uint8_t choiceIndex)
prototype of chosen menu list item callback
Definition nbgl_step.h:50
nbgl_step_t nbgl_stepDrawText(nbgl_stepPosition_t pos, nbgl_stepButtonCallback_t onActionCallback, nbgl_screenTickerConfiguration_t *ticker, const char *text, const char *subText, nbgl_contentCenteredInfoStyle_t style, bool modal)
nbgl_step_t nbgl_stepDrawCenteredInfo(nbgl_stepPosition_t pos, nbgl_stepButtonCallback_t onActionCallback, nbgl_screenTickerConfiguration_t *ticker, nbgl_layoutCenteredInfo_t *info, bool modal)
#define BACKWARD_DIRECTION
When action callback applies on any button press.
Definition nbgl_step.h:73
struct PACKED__ nbgl_area_s nbgl_area_t
Represents a rectangle area of the screen.
This structure contains info to build a centered (vertically and horizontally) area,...
This structure contains info to build a switch (on the right) with a description (on the left),...
Structure containing all information when creating a layout. This structure must be passed as argumen...
nbgl_screenTickerConfiguration_t ticker
nbgl_layoutTouchCallback_t onActionCallback
the callback to be called on any action on the layout
This structure contains a list of names to build a menu list on Nanos, with for each item a descripti...
nbgl_menuListCallback_t callback
function to call to retrieve a menu list item text
uint8_t nbChoices
total number of choices in the menu list
uint8_t selectedChoice
index of the selected choice (centered, in bold)
This structure contains info to build a navigation bar at the bottom of the screen.
nbgl_layoutNavDirection_t direction
vertical or horizontal navigation
nbgl_layoutNavIndication_t indication
specifies which arrows to use (left or right)
unsigned short uint16_t
Definition usbd_conf.h:54
unsigned char uint8_t
Definition usbd_conf.h:53