Superinput_demo/src/main.c

302 lines
6.3 KiB
C

/*
* SuperInput demo - A new way to type text on casio fx calculators !
* Copyright (C) 2022 Mibi88
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
#include <gint/display.h>
#include <gint/keyboard.h>
#define INSZ 20
#define INSZS1 (INSZ-1)
unsigned char input[INSZ], keyc;
int pos, lenght, shift, alpha, inchar, key;
void shiftstrpartright(int start){
unsigned char c;
unsigned char copy[INSZ];
for(int i=0;i<INSZ;i++){
copy[i] = input[i];
}
for(int i=start;i<INSZS1;i++){
c = copy[i];
input[i+1] = c;
}
}
void shiftstrpartleft(int start){
unsigned char c;
for(int i=start;i<INSZS1;i++){
c = input[i+1];
input[i] = c;
}
input[INSZS1] = ' ';
}
int main(void)
{
for(int i=0;i<INSZ;i++){
input[i] = ' ';
}
pos = 0;
lenght = 0;
shift = 0;
alpha = 1;
key = 0;
clearevents();
int opt = 0xDC;
while(!keydown(KEY_EXIT)){
key = getkey_opt(opt, NULL).key;
inchar = 1;
keyc = ' ';
if(alpha){
if(!shift){
switch(key){
case KEY_SQUARE:
keyc = '\''; break;
case KEY_POWER:
keyc = '^'; break;
case KEY_XOT:
keyc = 'a'; break;
case KEY_LOG:
keyc = 'b'; break;
case KEY_LN:
keyc = 'c'; break;
case KEY_SIN:
keyc = 'd'; break;
case KEY_COS:
keyc = 'e'; break;
case KEY_TAN:
keyc = 'f'; break;
case KEY_FRAC:
keyc = 'g'; break;
case KEY_FD:
keyc = 'h'; break;
case KEY_LEFTP:
keyc = 'i'; break;
case KEY_RIGHTP:
keyc = 'j'; break;
case KEY_COMMA:
keyc = 'k'; break;
case KEY_ARROW:
keyc = 'l'; break;
case KEY_7:
keyc = 'm'; break;
case KEY_8:
keyc = 'n'; break;
case KEY_9:
keyc = 'o'; break;
case KEY_4:
keyc = 'p'; break;
case KEY_5:
keyc = 'q'; break;
case KEY_6:
keyc = 'r'; break;
case KEY_MUL:
keyc = 's'; break;
case KEY_DIV:
keyc = 't'; break;
case KEY_1:
keyc = 'u'; break;
case KEY_2:
keyc = 'v'; break;
case KEY_3:
keyc = 'w'; break;
case KEY_ADD:
keyc = 'x'; break;
case KEY_SUB:
keyc = 'y'; break;
case KEY_0:
keyc = 'z'; break;
case KEY_DOT:
keyc = ' '; break;
case KEY_EXP:
keyc = '"'; break;
case KEY_NEG:
keyc = '_'; break;
case KEY_EXE:
keyc = '\n'; break;
default:
inchar = 0; break;
};
}else{
switch(key){
case KEY_SQUARE:
keyc = '!'; break;
case KEY_POWER:
keyc = '?'; break;
case KEY_XOT:
keyc = 'A'; break;
case KEY_LOG:
keyc = 'B'; break;
case KEY_LN:
keyc = 'C'; break;
case KEY_SIN:
keyc = 'D'; break;
case KEY_COS:
keyc = 'E'; break;
case KEY_TAN:
keyc = 'F'; break;
case KEY_FRAC:
keyc = 'G'; break;
case KEY_FD:
keyc = 'H'; break;
case KEY_LEFTP:
keyc = 'I'; break;
case KEY_RIGHTP:
keyc = 'J'; break;
case KEY_COMMA:
keyc = 'K'; break;
case KEY_ARROW:
keyc = 'L'; break;
case KEY_7:
keyc = 'M'; break;
case KEY_8:
keyc = 'N'; break;
case KEY_9:
keyc = 'O'; break;
case KEY_4:
keyc = 'P'; break;
case KEY_5:
keyc = 'Q'; break;
case KEY_6:
keyc = 'R'; break;
case KEY_MUL:
keyc = 'S'; break;
case KEY_DIV:
keyc = 'T'; break;
case KEY_1:
keyc = 'U'; break;
case KEY_2:
keyc = 'V'; break;
case KEY_3:
keyc = 'W'; break;
case KEY_ADD:
keyc = 'X'; break;
case KEY_SUB:
keyc = 'Y'; break;
case KEY_0:
keyc = 'Z'; break;
case KEY_DOT:
keyc = ' '; break;
case KEY_EXP:
keyc = '#'; break;
case KEY_NEG:
keyc = '$'; break;
case KEY_EXE:
keyc = '\n'; break;
default:
inchar = 0; break;
};
}
}else{
switch(key){
case KEY_SQUARE:
keyc = '%'; break;
case KEY_POWER:
keyc = '\\'; break;
case KEY_XOT:
keyc = '{'; break;
case KEY_LOG:
keyc = '}'; break;
case KEY_LN:
keyc = '['; break;
case KEY_SIN:
keyc = ']'; break;
case KEY_COS:
keyc = '~'; break;
case KEY_TAN:
keyc = '@'; break;
case KEY_FRAC:
keyc = '<'; break;
case KEY_FD:
keyc = '>'; break;
case KEY_LEFTP:
keyc = '('; break;
case KEY_RIGHTP:
keyc = ')'; break;
case KEY_COMMA:
keyc = ','; break;
case KEY_ARROW:
keyc = '='; break;
case KEY_7:
keyc = '7'; break;
case KEY_8:
keyc = '8'; break;
case KEY_9:
keyc = '9'; break;
case KEY_4:
keyc = '4'; break;
case KEY_5:
keyc = '5'; break;
case KEY_6:
keyc = '6'; break;
case KEY_MUL:
keyc = '*'; break;
case KEY_DIV:
keyc = '/'; break;
case KEY_1:
keyc = '1'; break;
case KEY_2:
keyc = '2'; break;
case KEY_3:
keyc = '3'; break;
case KEY_ADD:
keyc = '+'; break;
case KEY_SUB:
keyc = '-'; break;
case KEY_0:
keyc = '0'; break;
case KEY_DOT:
keyc = '.'; break;
case KEY_EXP:
keyc = ';'; break;
case KEY_NEG:
keyc = '|'; break;
case KEY_EXE:
keyc = '\n'; break;
default:
inchar = 0; break;
};
}
if(inchar && lenght < INSZS1){
shiftstrpartright(pos);
input[pos] = keyc;
pos++;
lenght++;
}
if(key == KEY_LEFT && pos > 0){
pos--;
}else if(key == KEY_RIGHT && pos < lenght){
pos++;
}
if(key == KEY_SHIFT){
shift = !shift;
}else if(key == KEY_ALPHA){
alpha = !alpha;
}else if(key == KEY_DEL && pos > 0){
shiftstrpartleft(pos-1);
lenght--;
pos--;
}
dclear(C_WHITE);
dtext(1, 1, C_BLACK, (char*)input);
dline(pos*6, 1, pos*6, 7, C_BLACK);
dupdate();
clearevents();
}
return 1;
}