Files
squeow/squeow_sw/Src/squeow_ui.c
2025-06-28 00:58:29 +02:00

195 lines
7.1 KiB
C

#include <main.h>
#include <math.h>
#include <stdio.h>
#include <stm32g4xx_hal_conf.h>
#include <string.h>
#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);
}