...
|
...
|
@@ -43,15 +43,15 @@ static int update_index(int *index){ |
|
|
else if (ret==3){
|
|
|
if ((answer[0]==27 && answer[1]=='[') || (answer[0]==239 && answer[1]==156)) {
|
|
|
switch (answer[2]){
|
|
|
case LEFT_ARROW: case 130: *index=MAX(0, *index-1);
|
|
|
case LEFT_ARROW: case 130: *index=MAX(0, *index-1);
|
|
|
return ARROW_CHANGE_INDEX;
|
|
|
break;
|
|
|
case RIGHT_ARROW: case 131: *index=MIN(keys_nb-1, *index+1);
|
|
|
case RIGHT_ARROW: case 131: *index=MIN(keys_nb-1, *index+1);
|
|
|
return ARROW_CHANGE_INDEX;
|
|
|
break;
|
|
|
case UP_ARROW:case 128: return INCREMENT_KEY;
|
|
|
case UP_ARROW:case 128: return INCREMENT_KEY;
|
|
|
break;
|
|
|
case DOWN_ARROW:case 129: return DECREMENT_KEY;
|
|
|
case DOWN_ARROW:case 129: return DECREMENT_KEY;
|
|
|
break;
|
|
|
/* case PAGE_UP:case 172: return FAST_INCREMENT_KEY;
|
|
|
break;
|
...
|
...
|
@@ -83,10 +83,10 @@ static int display_uchar(int index){ |
|
|
}
|
|
|
|
|
|
/**Return display size*/
|
|
|
static int display_float(int index){
|
|
|
static int display_float(int index, float max_value, float min_value){
|
|
|
char select_char;
|
|
|
int i;
|
|
|
channel.fprint_graph_floats(stderr, channel.name, 6, 1.0, 0);
|
|
|
channel.fprint_graph_floats(stderr, channel.name, 6, max_value, min_value);
|
|
|
fprintf(stderr, ">");
|
|
|
FOR(i, keys_nb){
|
|
|
if (index==i) select_char='#';
|
...
|
...
|
@@ -104,18 +104,18 @@ static void loop_toggle_uchar(){ |
|
|
while (ret!=QUIT_KEY){
|
|
|
ret=update_index(&index);
|
|
|
switch (ret){
|
|
|
case INCREMENT_KEY:
|
|
|
case INCREMENT_KEY:
|
|
|
channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(max_value);
|
|
|
break;
|
|
|
case DECREMENT_KEY: channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(min_value);
|
|
|
case DECREMENT_KEY: channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(min_value);
|
|
|
break;
|
|
|
case NEUTRAL_KEY:
|
|
|
case NEUTRAL_KEY:
|
|
|
channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(neutral_value);
|
|
|
break;
|
|
|
case INDEX_KEY:
|
|
|
case INDEX_KEY:
|
|
|
if (channel.uchars[index] > BLC_NORMED_FLOAT_TO_UCHAR(neutral_value)) channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(min_value);
|
|
|
else channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(max_value);
|
|
|
case ARROW_CHANGE_INDEX:case QUIT_KEY:
|
|
|
case ARROW_CHANGE_INDEX:case QUIT_KEY:
|
|
|
break;
|
|
|
default:color_eprintf(BLC_YELLOW, "Unknownd ret '%d'", ret);
|
|
|
}
|
...
|
...
|
@@ -138,10 +138,10 @@ static void loop_uchar(){ |
|
|
}
|
|
|
ret=update_index(&index);
|
|
|
switch (ret){
|
|
|
case INCREMENT_KEY:
|
|
|
case INCREMENT_KEY:
|
|
|
channel.uchars[index]=MIN(channel.uchars[index]+uchar_step_size, BLC_NORMED_FLOAT_TO_UCHAR(max_value));
|
|
|
break;
|
|
|
case DECREMENT_KEY: channel.uchars[index]=MAX(channel.uchars[index]-uchar_step_size, BLC_NORMED_FLOAT_TO_UCHAR(min_value));
|
|
|
case DECREMENT_KEY: channel.uchars[index]=MAX(channel.uchars[index]-uchar_step_size, BLC_NORMED_FLOAT_TO_UCHAR(min_value));
|
|
|
break;
|
|
|
/* case FAST_INCREMENT_KEY:
|
|
|
channel.uchars[index]=MIN(channel.uchars[index]+10*uchar_step_size, UINT8_MAX);
|
...
|
...
|
@@ -150,10 +150,10 @@ static void loop_uchar(){ |
|
|
case FAST_DECREMENT_KEY:
|
|
|
channel.uchars[index]=MAX(channel.uchars[index]-10*uchar_step_size, 0);
|
|
|
break;*/
|
|
|
case NEUTRAL_KEY:
|
|
|
case NEUTRAL_KEY:
|
|
|
channel.uchars[index]=BLC_NORMED_FLOAT_TO_UCHAR(neutral_value);
|
|
|
break;
|
|
|
case INDEX_KEY:case QUIT_KEY:case ARROW_CHANGE_INDEX:
|
|
|
case INDEX_KEY:case QUIT_KEY:case ARROW_CHANGE_INDEX:
|
|
|
break;
|
|
|
default:EXIT_ON_ERROR("Unknownd ret '%d'", ret);
|
|
|
}
|
...
|
...
|
@@ -162,12 +162,12 @@ static void loop_uchar(){ |
|
|
|
|
|
static void loop_toggle_float(){
|
|
|
int ret=NORMAL_KEY, index=0, graph_height;
|
|
|
if (display) graph_height=display_float(index);
|
|
|
if (display) graph_height=display_float(index, max_value, min_value);
|
|
|
|
|
|
while (ret!=QUIT_KEY){
|
|
|
if (display){
|
|
|
blc_eprint_cursor_up(graph_height);
|
|
|
graph_height=display_float(index);
|
|
|
graph_height=display_float(index, max_value, min_value);
|
|
|
}
|
|
|
ret=update_index(&index);
|
|
|
switch (ret){
|
...
|
...
|
@@ -191,28 +191,28 @@ static void loop_toggle_float(){ |
|
|
|
|
|
static void loop_float(){
|
|
|
int ret=0, index=0, previous_index=0, graph_height;
|
|
|
if (display) graph_height=display_float(index);
|
|
|
|
|
|
if (display) graph_height=display_float(index, max_value, min_value);
|
|
|
|
|
|
while (ret!=QUIT_KEY){
|
|
|
if (display){
|
|
|
blc_eprint_cursor_up(graph_height);
|
|
|
graph_height=display_float(index);
|
|
|
graph_height=display_float(index, max_value, min_value);
|
|
|
}
|
|
|
ret=update_index(&index);
|
|
|
switch (ret){
|
|
|
case INCREMENT_KEY: channel.floats[index]=MIN(channel.floats[index]+float_step_size, max_value);
|
|
|
case INCREMENT_KEY: channel.floats[index]=MIN(channel.floats[index]+float_step_size, max_value);
|
|
|
break;
|
|
|
case DECREMENT_KEY: channel.floats[index]=MAX(channel.floats[index]-float_step_size, min_value);
|
|
|
case DECREMENT_KEY: channel.floats[index]=MAX(channel.floats[index]-float_step_size, min_value);
|
|
|
break;
|
|
|
/* case FAST_INCREMENT_KEY: channel.floats[index]+=float_step_size*10;
|
|
|
break;
|
|
|
case FAST_DECREMENT_KEY:channel.floats[index]-=float_step_size*10;
|
|
|
break;*/
|
|
|
case NEUTRAL_KEY:channel.floats[index]=neutral_value;
|
|
|
break;
|
|
|
case FAST_DECREMENT_KEY:channel.floats[index]-=float_step_size*10;
|
|
|
break;*/
|
|
|
case NEUTRAL_KEY:channel.floats[index]=neutral_value;
|
|
|
break;
|
|
|
case INDEX_KEY: case ARROW_CHANGE_INDEX:
|
|
|
case INDEX_KEY: case ARROW_CHANGE_INDEX:
|
|
|
previous_index=index;
|
|
|
case QUIT_KEY:break;
|
|
|
case QUIT_KEY:break;
|
|
|
default:EXIT_ON_ERROR("Unknownd ret '%d'", ret);
|
|
|
}
|
|
|
}
|
...
|
...
|
@@ -224,6 +224,8 @@ int main(int argc, char** argv){ |
|
|
char const *extension;
|
|
|
char const *channel_name, *type_str, *str_quitting_key, *str_neutral_key, *max_str, *min_str, *str_neutral_value, *toggle_mode, *step_size_str, *filename, *file_select_name;
|
|
|
char const *key_nb_str;
|
|
|
blc_channel channel_info;
|
|
|
uint32_t type;
|
|
|
int i;
|
|
|
char *pos;
|
|
|
uchar answer;
|
...
|
...
|
@@ -233,14 +235,14 @@ int main(int argc, char** argv){ |
|
|
blc_program_set_description("Get keyboard inputs");
|
|
|
blc_program_add_option(&display, 'd', "display", NULL, "Display a text graph (UIN8 only)", NULL);
|
|
|
blc_program_add_option(&filename, 'f', "file", "filename", "Initialize the values with a tsv file", NULL);
|
|
|
blc_program_add_option((char const**)&key_list, 'k', "key_list", "string", "Define all the keys that can be stroke", "0123456789abcdef");
|
|
|
blc_program_add_option((char const**)&key_list, 'k', "key_list", "string", "Define all the keys that can be stroke", NULL);
|
|
|
blc_program_add_option(&min_str, 'm', "min", "real", "Define the normed minimum value", "0.0");
|
|
|
blc_program_add_option(&str_neutral_key, 'n', "neutral_key", "string", "Define the neutral key", "escape");
|
|
|
blc_program_add_option(&channel_name, 'o', "output", "blc_channel", "Define where the result will be put", default_output);
|
|
|
blc_program_add_option(&str_quitting_key, 'q', "quitting_key", "string", "Define the key used to quit", "q");
|
|
|
blc_program_add_option(&key_nb_str, 's', "size", "integer", "Size of key vector", NULL);
|
|
|
blc_program_add_option(&type_str, 't', "type", "UIN8|FL32", "Define the type of the result", "UIN8");
|
|
|
blc_program_add_option(&file_select_name, 'F', "select", "filename", "File among which vlues will be selected", NULL);
|
|
|
blc_program_add_option(&type_str, 't', "type", "UIN8|FL32", "Define the type of the result", NULL);
|
|
|
blc_program_add_option(&file_select_name, 'F', "select", "filename", "File among which values will be selected", NULL);
|
|
|
blc_program_add_option(&max_str, 'M', "max", "real", "Define the normed max value", "1.0");
|
|
|
blc_program_add_option(&str_neutral_value, 'N', "neutral_value", "real", "Define the normed neutral value", "0.5");
|
|
|
blc_program_add_option(&step_size_str, 'S', "step", "real", "Set the normed step size", NULL);
|
...
|
...
|
@@ -248,7 +250,8 @@ int main(int argc, char** argv){ |
|
|
|
|
|
blc_program_init(&argc, &argv, blc_quit);
|
|
|
blc_command_forward_blc_channels();
|
|
|
|
|
|
|
|
|
//This get back normal keyboard behavior after quitting
|
|
|
atexit(blc_set_back_stdin_mode);
|
|
|
|
|
|
if (strlen(str_quitting_key)!=1) EXIT_ON_ERROR("You can only have one quitting key. You propose %s", str_quitting_key);
|
...
|
...
|
@@ -260,11 +263,30 @@ int main(int argc, char** argv){ |
|
|
neutral_value=strtof(str_neutral_value, NULL);
|
|
|
max_value=strtof(max_str, NULL);
|
|
|
min_value=strtof(min_str, NULL);
|
|
|
|
|
|
|
|
|
quitting_key=str_quitting_key[0];
|
|
|
|
|
|
if (key_nb_str) {
|
|
|
keys_nb=strtod(key_nb_str, NULL);
|
|
|
if (key_nb_str) keys_nb=strtod(key_nb_str, NULL);
|
|
|
else if (key_list) keys_nb=strlen(key_list);
|
|
|
else keys_nb=-1;
|
|
|
|
|
|
if (type_str) type=STRING_TO_UINT32(type_str);
|
|
|
|
|
|
if ( blc_channel_get_info_with_name(&channel_info, channel_name)==-1){
|
|
|
if (key_list==NULL) {
|
|
|
key_list=(char *)"0123456789abcdef";
|
|
|
keys_nb=strlen(key_list);
|
|
|
if (type_str==NULL) type='UIN8'; //Default
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
if (type_str==NULL) type=channel_info.type;
|
|
|
else if (STRING_TO_UINT32(type_str)!=channel_info.type) EXIT_ON_CHANNEL_ERROR(&channel_info, "The requested type '%s' differ from the exisiting channel", type_str);
|
|
|
if (keys_nb==-1) keys_nb=channel_info.total_length;
|
|
|
else if (keys_nb!=channel_info.total_length) EXIT_ON_CHANNEL_ERROR(&channel_info, "number of keys(%d) differ from channel length (%d)", keys_nb, channel.total_length);
|
|
|
}
|
|
|
|
|
|
if (key_list==NULL){
|
|
|
key_list=MANY_ALLOCATIONS(keys_nb, char);
|
|
|
FOR(i, keys_nb){
|
|
|
if (i<10) key_list[i]=48+i; //01234567890
|
...
|
...
|
@@ -275,26 +297,24 @@ int main(int argc, char** argv){ |
|
|
else EXIT_ON_ERROR("Too many keys. You have '%d' max is 64", keys_nb);
|
|
|
}
|
|
|
}
|
|
|
else keys_nb=strlen(key_list);
|
|
|
|
|
|
if (memchr(key_list, quitting_key, keys_nb)) EXIT_ON_ERROR("The quitting key '%c' is in your key list %*s, you need to select an other one with --quitting_key=...", quitting_key, keys_nb, quitting_key);
|
|
|
if (memchr(key_list, neutral_key, keys_nb)) EXIT_ON_ERROR("The neutral key '%c' is in your key list %*s, you need to select an other one with --neutral_key=...", quitting_key, keys_nb, neutral_key);
|
|
|
|
|
|
channel.create_or_open(channel_name, BLC_CHANNEL_WRITE, STRING_TO_UINT32(type_str), 'NDEF', 1, keys_nb);
|
|
|
channel.create_or_open(channel_name, BLC_CHANNEL_WRITE, type, 'NDEF', 1, keys_nb);
|
|
|
|
|
|
if (filename){
|
|
|
extension = blc_get_filename_extension(filename);
|
|
|
|
|
|
if(strcmp(extension, "blc")==0) channel.update_with_blc_file(filename);
|
|
|
else if (strcmp(extension, "tsv")==0) channel.update_with_tsv_file(filename);
|
|
|
else EXIT_ON_ERROR("'%s' is not a possible file type extension", extension);
|
|
|
}
|
|
|
else {
|
|
|
switch (STRING_TO_UINT32(type_str)){
|
|
|
case 'UIN8':
|
|
|
switch (type){
|
|
|
case 'UIN8':
|
|
|
FOR(i, keys_nb) channel.uchars[i]=BLC_NORMED_FLOAT_TO_UCHAR(neutral_value);
|
|
|
break;
|
|
|
case 'FL32':
|
|
|
case 'FL32':
|
|
|
FOR(i, keys_nb) channel.floats[i]=neutral_value;
|
|
|
break;
|
|
|
default:EXIT_ON_ARRAY_ERROR(&channel, "Type not managed");
|
...
|
...
|
@@ -305,12 +325,8 @@ int main(int argc, char** argv){ |
|
|
if (file_select_name){
|
|
|
extension = blc_get_filename_extension(file_select_name);
|
|
|
if (strcmp(extension, "tsv")!=0) EXIT_ON_ERROR("Only .tsv files are managed, however your extension is '%s' in '%s'.", extension, file_select_name);
|
|
|
|
|
|
// array_select.updatewith_tsv_file
|
|
|
|
|
|
// SYSTEM_ERROR_CHECK(file_select=fopen(file_select_name, "r"), NULL, "Impossible to open '%s'", file_select_name);
|
|
|
}
|
|
|
|
|
|
|
|
|
if (display){
|
|
|
if ((channel.type!='UIN8') && (channel.type!='FL32')) EXIT_ON_ARRAY_ERROR(&channel, "This type can not be displayed. Only 'UIN8' or 'FL32' can.");
|
|
|
}
|
...
|
...
|
@@ -335,12 +351,12 @@ int main(int argc, char** argv){ |
|
|
|
|
|
channel.publish();
|
|
|
switch (channel.type){
|
|
|
case 'UIN8':
|
|
|
case 'UIN8':
|
|
|
if (step_size_str) uchar_step_size=strtod(step_size_str, NULL);
|
|
|
if (toggle_mode) loop_toggle_uchar();
|
|
|
else loop_uchar();
|
|
|
break;
|
|
|
case 'FL32':
|
|
|
case 'FL32':
|
|
|
if (step_size_str) float_step_size=strtof(step_size_str, NULL);
|
|
|
if (toggle_mode) loop_toggle_float();
|
|
|
else loop_float();
|
...
|
...
|
|