#include #include #include #include #include #include "squeow.h" #include "squeow_ui.h" /* SQUEOW UI su tosta (8x16 caratteri) F: stringa frequenza V: barra volume D: barra diretta R: barra riflessa T: barra temperatura S: stringa stato */ uint16_t ui_volume; volatile uint8_t uart_sent; // ################ void squeow_ui_init(void) { #ifdef SQUEOW_UI_SERIOW seriow_log('I', "seriow UI init"); #endif #ifdef SQUEOW_UI_TOSTA tosta_log('I', "UI init"); #endif } // seriow // https://git.lattuga.net/boyska/seriow void seriow_var_dump(void) { UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "DMP V=%u ", riscala_valori(ui_volume, 0, 2048, 0, 100)); #ifdef SQUEOW_SONDA_CORRENTE UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "C=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_CORRENTE], 0, 4095, 0, 100)); #endif #ifdef SQUEOW_SONDA_TEMPERATURA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "T=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_TEMPERATURA], 0, 4095, 0, 100)); #endif #ifdef SQUEOW_SONDA_DIRETTA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "D=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_DIRETTA], 0, 4095, 0, 100)); #endif #ifdef SQUEOW_SONDA_RIFLESSA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "R=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_RIFLESSA], 0, 4095, 0, 100)); #endif UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\n"); } void seriow_stab_dump(void) { UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "DMP F=%lu ", freq); UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "VPK=%u ", VU_METER_SOGLIA_PICCO); #ifdef SQUEOW_SONDA_CORRENTE UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SC=%u ", SOGLIA_CORRENTE); #endif #ifdef SQUEOW_SONDA_TEMPERATURA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "ST=%u ", SOGLIA_TEMPERATURA); #endif #ifdef SQUEOW_SONDA_DIRETTA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SD=%u ", SOGLIA_DIRETTA); #endif #ifdef SQUEOW_SONDA_RIFLESSA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SR=%u ", SOGLIA_RIFLESSA); #endif UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\n"); } void seriow_log(uint8_t sev, char *msg) { UART_TX_buf_lenght = snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "LOG %c %s\n", sev, msg); } // tosta void tosta_freq(void) { UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\e[1d\e[0GF: %lu", freq); } void tosta_var_bars(void) { UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\f\e[2d\e[0GV:\e[%ub\n", ui_volume); #ifdef SQUEOW_SONDA_CORRENTE UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "C:\e[%ub\nu", riscala_valori(adc2_valori[SQUEOW_ADC_CORRENTE], 0, 4095, 0, 50)); #endif #ifdef SQUEOW_SONDA_TEMPERATURA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "T:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_TEMPERATURA], 0, 4095, 0, 50)); #endif #ifdef SQUEOW_SONDA_DIRETTA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "D:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_DIRETTA], 0, 4095, 0, 50)); #endif #ifdef SQUEOW_SONDA_RIFLESSA UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "R:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_RIFLESSA], 0, 4095, 0, 50)); #endif } void tosta_log(uint8_t sev, char *msg) { UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\e[8d\e[0GLOG: %c %s", sev, msg); } // LED void led_blocco(uint8_t led_blocco_lampi) { // fasi // 0 lampo acceso // 1 lampo spento // 2 pausa static uint16_t led_blocco_timer; static uint8_t led_blocco_fase = 0, led_blocco_lampi_fatti = 0; if (led_blocco_lampi > 0) { if (led_blocco_fase == 0 && led_blocco_timer == 0) { // inizio lampo acceso HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_SET); led_blocco_timer = 1; } else if (led_blocco_fase == 0 && led_blocco_timer >= SQUEOW_LED_BLOCCO_LAMPO) { // fine lampo acceso, inizio lampo spento HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET); led_blocco_fase = 1; led_blocco_timer = 0; } else if (led_blocco_fase == 1 && led_blocco_timer >= SQUEOW_LED_BLOCCO_LAMPO) { // fine lampo spento if (led_blocco_lampi_fatti >= (led_blocco_lampi - 1)) { // fine lampi, inizio pausa led_blocco_fase = 2; led_blocco_lampi_fatti = 0; HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET); } else { led_blocco_lampi_fatti++; led_blocco_fase = 0; } led_blocco_timer = 0; } else if (led_blocco_fase == 2 && led_blocco_timer >= SQUEOW_LED_BLOCCO_PAUSA) { // fine pausa led_blocco_fase = 0; led_blocco_timer = 0; } else { led_blocco_timer++; } } else { HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET); } } void led_pwm_duty(uint8_t duty) { TIM8->CCR3 = duty; } uint16_t vu_meter(uint16_t campione) { #define ZEROD 2047 #define ZEROU 2048 static uint16_t vu_valore_temp, vu_timer_picco; uint16_t abs_campione; // se รจ sopra lo zero analogico, sottrailo, se no inverti abs_campione = (campione > ZEROD) ? campione - ZEROU : ZEROD - campione; #ifdef SQUEOW_UI_LED // gestione picco if (abs_campione > VU_METER_SOGLIA_PICCO) { vu_timer_picco = 0; HAL_GPIO_WritePin(G4_GPIO_Port, G4_Pin, GPIO_PIN_SET); } else if (vu_timer_picco >= VU_METER_TEMPO_PICCO) { HAL_GPIO_WritePin(G4_GPIO_Port, G4_Pin, GPIO_PIN_RESET); vu_timer_picco = 0; } else { vu_timer_picco++; } #endif // vu meter if (abs_campione >= vu_valore_temp) { vu_valore_temp = abs_campione; } else { vu_valore_temp -= VU_METER_RILASCIO; } return vu_valore_temp; } uint16_t riscala_valori(uint16_t valore_in, uint16_t valore_in_minimo, uint16_t valore_in_massimo, uint16_t valore_out_minimo, uint16_t valore_out_massimo) { uint16_t range_in, range_out, valore_in_limitato; float scala; range_in = valore_in_massimo - valore_in_minimo; range_out = valore_out_massimo - valore_out_minimo; scala = range_in / range_out; valore_in_limitato = (((valore_in) < (valore_in_massimo)) ? (valore_in) : (valore_in_massimo)); return valore_out_minimo + ((valore_in_limitato - valore_in_minimo) / scala); }