286 lines
6.7 KiB
C
286 lines
6.7 KiB
C
#include "userinput.h"
|
|
|
|
#include <gint/display.h>
|
|
#include <gint/keyboard.h>
|
|
#include <gint/std/string.h>
|
|
#include <gint/std/stdio.h>
|
|
#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);
|
|
}
|