#include "userinput.h" #include #include #include #include #include "conv.h" #define WIDTH 128 #define HEIGHT 64 #define TAILLE_INPUT_U64 20 #define TAILLE_INPUT_U32 10 #define TAILLE_INPUT_U16 5 #define TAILLE_INPUT_U8 3 void draw_field(int h); void clear_field(int h); void input_manager(char *input, char *str_limite, uint8_t taille); uint8_t input_uint8() { char input[TAILLE_INPUT_U8+1]; char str_limite[TAILLE_INPUT_U8+1]; uint8_t limite = -1; itoa(str_limite, limite); input_manager(input, str_limite, TAILLE_INPUT_U8); return (uint8_t)atoi(input); } uint16_t input_uint16() { char input[TAILLE_INPUT_U16+1]; char str_limite[TAILLE_INPUT_U16+1]; uint16_t limite = -1; itoa(str_limite, limite); input_manager(input, str_limite, TAILLE_INPUT_U16); return (uint16_t)atoi(input); } uint32_t input_uint32() { char input[TAILLE_INPUT_U32+1]; char str_limite[TAILLE_INPUT_U32+1]; uint32_t limite = -1; itoa(str_limite, limite); input_manager(input, str_limite, TAILLE_INPUT_U32); return (uint32_t)atoi(input); } uint64_t input_uint64() { char input[TAILLE_INPUT_U64+1]; char str_limite[TAILLE_INPUT_U64+1]; uint64_t limite = -1; itoa(str_limite, limite); input_manager(input, str_limite, TAILLE_INPUT_U64); return atoi(input); } void input_manager(char *input, char *str_limite, uint8_t taille) { int key = 0, h, run = 1; unsigned int curseur; for(curseur = 0; curseur <= taille; ++curseur) input[curseur] = 0; curseur = 0; dsize("0", NULL, NULL, &h); draw_field(h); while(run) { if(input[0] != '0' && curseur < taille) { switch(key) { case KEY_0: input[curseur++] = '0'; break; case KEY_1: input[curseur++] = '1'; break; case KEY_2: input[curseur++] = '2'; break; case KEY_3: input[curseur++] = '3'; break; case KEY_4: input[curseur++] = '4'; break; case KEY_5: input[curseur++] = '5'; break; case KEY_6: input[curseur++] = '6'; break; case KEY_7: input[curseur++] = '7'; break; case KEY_8: input[curseur++] = '8'; break; case KEY_9: input[curseur++] = '9'; } if(curseur == taille && strcmp(input, str_limite) > 0) input[--curseur] = 0; } if(curseur) { switch(key) { case KEY_DEL: clear_field(h); input[--curseur] = 0; break; case KEY_EXE: run = 0; } } if(run) { dtext(2, HEIGHT-2-h, input, C_BLACK, C_WHITE); dupdate(); key = getkey().key; } } } void input_str(char *input, uint32_t taille) { int key = 0, h, run = 1; key_event_t key_event; unsigned int curseur; for(curseur = 0; curseur <= taille; ++curseur) input[curseur] = 0; curseur = 0; dsize("0", NULL, NULL, &h); draw_field(h); while(run) { if(curseur < taille) { switch(key) { case KEY_0: if(key_event.alpha) input[curseur++] = 'Z'; else if(!key_event.shift) input[curseur++] = '0'; break; case KEY_1: if(key_event.alpha) input[curseur++] = 'U'; else if(!key_event.shift) input[curseur++] = '1'; break; case KEY_2: if(key_event.alpha) input[curseur++] = 'V'; else if(!key_event.shift) input[curseur++] = '2'; break; case KEY_3: if(key_event.alpha) input[curseur++] = 'W'; else if(!key_event.shift) input[curseur++] = '3'; break; case KEY_4: if(key_event.alpha) input[curseur++] = 'P'; else if(!key_event.shift) input[curseur++] = '4'; break; case KEY_5: if(key_event.alpha) input[curseur++] = 'Q'; else if(!key_event.shift) input[curseur++] = '5'; break; case KEY_6: if(key_event.alpha) input[curseur++] = 'R'; else if(!key_event.shift) input[curseur++] = '6'; break; case KEY_7: if(key_event.alpha) input[curseur++] = 'M'; else if(!key_event.shift) input[curseur++] = '7'; break; case KEY_8: if(key_event.alpha) input[curseur++] = 'N'; else if(!key_event.shift) input[curseur++] = '8'; break; case KEY_9: if(key_event.alpha) input[curseur++] = 'O'; else if(!key_event.shift) input[curseur++] = '9'; break; case KEY_MUL: if(key_event.alpha) input[curseur++] = 'S'; else if(key_event.shift) input[curseur++] = '{'; else input[curseur++] = '*'; break; case KEY_DIV: if(key_event.alpha) input[curseur++] = 'T'; else if(key_event.shift) input[curseur++] = '}'; else input[curseur++] = '/'; break; case KEY_ADD: if(key_event.alpha) input[curseur++] = 'X'; else if(key_event.shift) input[curseur++] = '['; else input[curseur++] = '+'; break; case KEY_SUB: if(key_event.alpha) input[curseur++] = 'Y'; else if(key_event.shift) input[curseur++] = ']'; else input[curseur++] = '-'; break; case KEY_POWER: if(!key_event.alpha && !key_event.shift) input[curseur++] = '^'; break; case KEY_XOT: if(key_event.alpha) input[curseur++] = 'A'; break; case KEY_LOG: if(key_event.alpha) input[curseur++] = 'B'; break; case KEY_LN: if(key_event.alpha) input[curseur++] = 'C'; break; case KEY_SIN: if(key_event.alpha) input[curseur++] = 'D'; break; case KEY_COS: if(key_event.alpha) input[curseur++] = 'E'; break; case KEY_TAN: if(key_event.alpha) input[curseur++] = 'F'; break; case KEY_FRAC: if(key_event.alpha) input[curseur++] = 'G'; break; case KEY_FD: if(key_event.alpha) input[curseur++] = 'H'; break; case KEY_LEFTP: if(key_event.alpha) input[curseur++] = 'I'; else if(!key_event.shift) input[curseur++] = '('; break; case KEY_RIGHTP: if(key_event.alpha) input[curseur++] = 'J'; else if(!key_event.shift) input[curseur++] = ')'; break; case KEY_COMMA: if(key_event.alpha) input[curseur++] = 'K'; else if(!key_event.shift) input[curseur++] = ','; break; case KEY_ARROW: if(key_event.alpha) input[curseur++] = 'L'; break; case KEY_DOT: if(key_event.alpha) input[curseur++] = ' '; else if(key_event.shift) input[curseur++] = '='; else input[curseur++] = '.'; break; case KEY_EXP: if(key_event.alpha) input[curseur++] = '"'; } } if(key == KEY_EXE) run = 0; else { if(curseur && key == KEY_DEL) { clear_field(h); input[--curseur] = 0; } dtext(2, HEIGHT-2-h, input, C_BLACK, C_WHITE); dupdate(); key_event = getkey(); key = key_event.key; } } } void clear_field(int h) { drect(1, HEIGHT-2-h, WIDTH-2, HEIGHT-3, C_WHITE); } void draw_field(int h) { clear_field(h); dhline(HEIGHT-4-h, C_BLACK); dhline(HEIGHT-1, C_BLACK); dline(0, HEIGHT-3-h, 0, HEIGHT-2, C_BLACK); dline(WIDTH-1, HEIGHT-3-h, WIDTH-1, HEIGHT-2, C_BLACK); }