195 lines
7.1 KiB
C
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);
|
|
}
|
|
|