#include "interface.h" #include "bassofono.h" #include uint8_t menu_mode, current_tab; /* typedef void (*menu_set_function)(void); typedef void (*menu_print_function)(uint8_t a); struct menu_item { char name[14]; uint8_t type; uint8_t size; uint8_t row; uint8_t col; uint32_t step; uint32_t min; uint32_t max; uint8_t wrap; uint32_t *varptr; menu_set_function set_function_ptr; menu_print_function print_function_ptr; }; */ // name, type, size,row,col,step, min, max, wrap *varptr, set_function_ptr print_function_ptr struct menu_item items[] = { {" Frequency", TYP_INT, 11, 1, 0, 100, 1000, 175000, WRAP, &frequency, &set_frequency, &print_frequency}, {" Volume ", TYP_INT, 2, 2, 0, 1, 0, 32, SAT, &volume, &set_dummy, &print_integer}, {" Gain ", TYP_INT, 1, 2, 3, 1, 1, 6, SAT, &gain, &set_gain, &print_integer}, {" Modulation", TYP_INT, 3, 2, 5, 1, 0, 3, WRAP, &modulation, &set_modulation,&print_modulation}, {" Squelch ", TYP_INT, 2, 2, 10, 1, 0, 32, SAT, &squelch, &set_dummy, &print_integer}, {" Filter CF ", TYP_INT, 4, 3, 0, 100, 100, 3500, SAT, &audio_filter_freq, &set_filter, &print_integer}, {" Filter BW ", TYP_INT, 4, 3, 5, 100, 100, 2500, SAT, &audio_filter_bw, &set_filter, &print_integer}, {" Filter Q ", TYP_INT, 2, 3, 10, 1, 1, 32, SAT, &audio_filter_beta, &set_filter, &print_integer}, {" Signal ", TYP_INT, 5, 10, 0, 1, 1, 32, SAT, &rx_signal, &set_dummy, &print_bar}, }; struct menu_item tabs[] = { {"SCN", TYP_INT, 3, 0, 0, 1, 0, 3, WRAP, &scan, &set_dummy, &print_integer}, }; uint8_t menu_item_count = sizeof(items)/sizeof(items[0]); uint8_t tabs_count = sizeof(tabs)/sizeof(tabs[0]); char modulation_list[][4] = { [MOD_DC] = "DC", [MOD_LSB] = "LSB", [MOD_USB] = "USB", [MOD_AM] = "AM" }; uint8_t modulation_list_count = sizeof(modulation_list)/sizeof(modulation_list[0]); void decode_cmd(char cmd){ switch(cmd){ case ENRH: encoder_increment(); click(); break; case ENLH: encoder_decrement(); click(); break; case JSRP: joystick_dx(); click(); break; case JSLP: joystick_sx(); click(); break; case JSUP: joystick_up(); click(); break; case JSDP: joystick_down(); click(); break; case JSBP: joystick_button(); click(); break; case BT1P: tab_up(0); break; case BT2P: tab_up(1); break; case BT3P: tab_up(2); break; case BT4P: tab_up(3); break; case BT1R: tab_down(0); break; case BT2R: tab_down(1); break; case BT3R: tab_down(2); break; case BT4R: tab_down(3); break; } } void encoder_increment(void){ integer_editor_up(menu_mode); items[menu_mode].set_function_ptr(); } void encoder_decrement(void){ integer_editor_down(menu_mode); items[menu_mode].set_function_ptr(); } void joystick_dx(void){ step_down(menu_mode); } void joystick_sx(void){ step_up(menu_mode); } void joystick_down(void){ menu_mode_up(); } void joystick_up(void){ menu_mode_down(); } void joystick_button(void){ } void menu_mode_up(void){ set_changed(menu_mode); // pulisci vecchio menu_mode++; if(menu_mode >= menu_item_count) menu_mode = 0; set_changed(menu_mode); // cursore nel nuovo // nome display_update_mode(); } void menu_mode_down(void){ set_changed(menu_mode); // pulisci vecchio menu_mode--; if(menu_mode >= menu_item_count) menu_mode = menu_item_count - 1; set_changed(menu_mode); // nuovo display_update_mode(); } void step_up(uint8_t mode){ if((items[mode].step * 10) < items[mode].max) items[mode].step *= 10; } void step_down(uint8_t mode){ if(items[mode].step >= 10) items[mode].step /= 10; } void interface_set_default(void){ menu_mode = 0; display_update_mode(); } void display_set_position(uint8_t row, uint8_t col){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%d,%dz", col, row); } void display_print_string(uint8_t row, uint8_t col, char * string){ display_set_position(row,col); enqueue_tx(string, strlen(string)); } void display_draw_dual_bar(char * string, uint8_t value1, uint8_t value2){ uint8_t cols; char buf[84]; for( cols = 0; cols < DISPLAY_Y_SIZE; cols++){ if(cols < value1) buf[cols] |= 0xF; if(cols < value2) buf[cols] |= 0xF0; } enqueue_tx(buf, DISPLAY_Y_SIZE); } void display_update_mode(void){ display_set_position(MENU_NAME_ROW,MENU_NAME_COL); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%d %-12s", menu_mode, items[menu_mode].name); } void display_update_state(void){ uint8_t var; for(uint8_t item_idx = 0; item_idx < (menu_item_count); item_idx++){ if(get_changed(item_idx)){ display_set_position(items[item_idx].row,items[item_idx].col); if(item_idx == menu_mode) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, ">"); else { uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx, " "); } if(items[item_idx].type == TYP_INT) items[item_idx].print_function_ptr(item_idx); // if(items[item_idx].type == TYP_INT) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%0*ld", items[item_idx].size, * items[item_idx].varptr); // if(items[item_idx].type == TYP_LIST) uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, &items[item_idx].mapptr[* items[item_idx].varptr]); // display_draw_bar(14, 4, 0, volume * 2); reset_changed(item_idx); } } } void integer_editor_up(uint8_t mode){ * items[mode].varptr += items[mode].step; if((* items[mode].varptr < items[mode].min) || (* items[mode].varptr > items[mode].max)){ if(items[mode].wrap){ * items[mode].varptr = items[mode].min; } else{ * items[mode].varptr = items[mode].max; } } set_changed(mode); } void integer_editor_down(uint8_t mode){ * items[mode].varptr -= items[mode].step; if((* items[mode].varptr < items[mode].min) || (* items[mode].varptr > items[mode].max)){ if(items[mode].wrap){ * items[mode].varptr = items[mode].max; } else{ * items[mode].varptr = items[mode].min; } } set_changed(mode); } void list_editor_down(uint8_t mode){ } void tabs_update(void){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\a"); } void tab_up(uint8_t tab){ switch(tab){ case 0: stop_receive(); start_transmit(); break; } } void tab_down(uint8_t tab){ switch(tab){ case 0: stop_transmit(); start_receive(); break; } } void display_init(void){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[128,255,0,0,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[129,255,255,0,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[130,255,255,255,0,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[131,255,255,255,255,0,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[132,255,255,255,255,255,0c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[133,255,255,255,255,255,255c"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%ds",DISPLAY_STANDBY_TIMER); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[200,100q"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%db",DISPLAY_BL_DIM); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\a"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\f"); } // menu prints void print_integer(uint8_t item_idx){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*ld", items[item_idx].size, * items[item_idx].varptr); } void print_modulation(uint8_t item_idx){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%*s", items[item_idx].size, modulation_list[*items[item_idx].varptr]); } void print_bar(uint8_t item_idx){ // uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%0*ld", items[item_idx].size, * items[item_idx].varptr); // display_draw_bar(items[item_idx].size, * items[item_idx].varptr); uint8_t i; uint8_t cols, cols_tmp; // cols = *items[item_idx].varptr / (2147483648 / (items[item_idx].size * 6)); cols = *items[item_idx].varptr; char buf[items[item_idx].size]; for( i = 0; i < items[item_idx].size; i++){ if(cols >= 6){ buf[i] = 133; } else if (cols > 0){ buf[i] = 128 + cols; } else { buf[i] = 32; } cols = sat_subu8b(cols, 6); } enqueue_tx(buf, items[item_idx].size); } void print_frequency(uint8_t item_idx){ char bufin[14]; char bufout[14]; uint8_t i, j; j = 0; sprintf(bufin,"%8ld", * items[item_idx].varptr); for(i=0; bufin[i] != '\0'; i++){ if((((strlen(bufin)-i)%3)==0) && (i != 0)) { if(bufin[i-1] == ' '){ bufout[j] = ' '; } else { bufout[j] = '.'; } j++; } bufout[j] = bufin[i]; j++; } bufout[j] = '\0'; uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"%s", bufout); } void scan_do(uint8_t scan_state){ static uint8_t scan_timer; frequency += items[0].step * scan_state; set_frequency(); set_changed(0); } uint8_t sat_subu8b(uint8_t x, uint8_t y){ uint8_t res = x - y; res &= -(res <= x); return res; } void click(void){ uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[600,10q"); }