Files
bassofono/codice/Core/Src/interface.c

362 lines
10 KiB
C
Raw Normal View History

2021-07-02 22:19:04 +02:00
#include "interface.h"
#include "bassofono.h"
#include <stdint.h>
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},
{" Modulation", TYP_INT, 3, 2, 4, 1, 0, 3, WRAP, &modulation, &set_modulation,&print_modulation},
{" Squelch ", TYP_INT, 3, 2, 9, 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();
break;
case ENLH:
encoder_decrement();
break;
case JSRP:
joystick_dx();
break;
case JSLP:
joystick_sx();
break;
case JSUP:
joystick_up();
break;
case JSDP:
joystick_down();
break;
case JSBP:
joystick_button();
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_bar(uint8_t char_size, uint8_t value){
// display_set_position(row,col);
uint8_t i;
uint8_t cols, cols_tmp;
cols = (value * char_size * 6)/255;
char buf[char_size];
for( i = 0; i < char_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, char_size);
}
*/
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;
}