UI led
This commit is contained in:
@@ -9,51 +9,186 @@
|
||||
|
||||
/* SQUEOW UI
|
||||
|
||||
|
||||
su tosta (8x16 caratteri)
|
||||
F: stringa frequenza
|
||||
V: barra volume
|
||||
D: barra diretta
|
||||
R: barra riflessa
|
||||
T: barra temperatura
|
||||
S: stringa stato
|
||||
*/
|
||||
|
||||
// VU
|
||||
uint8_t vu_on, vu_value, vu_tmp_value;
|
||||
uint8_t adc_stampa;
|
||||
uint16_t ui_volume;
|
||||
|
||||
uint8_t uart_sent;
|
||||
volatile uint8_t uart_sent;
|
||||
|
||||
// ################
|
||||
|
||||
void squeow_ui_init(void) {
|
||||
vu_on = 1;
|
||||
adc_stampa = 1;
|
||||
#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
|
||||
|
||||
// 10hz
|
||||
void seriow_var_dump(void) {
|
||||
char buf[64];
|
||||
snprintf(buf, 64, "\e[3dDMP V=%lu T=%u C=%u D=%u R=%u\n", vu_value, adc2_valori[0], adc2_valori[1], adc2_valori[2], adc2_valori[3]);
|
||||
serial_write(buf, strlen(buf));
|
||||
vu_tmp_value = 0;
|
||||
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");
|
||||
}
|
||||
|
||||
// ogni 5sec
|
||||
void seriow_stab_dump(void) {
|
||||
char buf[64];
|
||||
snprintf(buf, 64, "DMP F=%lu\n", freq);
|
||||
serial_write(buf, strlen(buf));
|
||||
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) {
|
||||
char buf[64];
|
||||
snprintf(buf, 64, "\e[2dLOG %u %s\n", sev, msg);
|
||||
serial_write(buf, strlen(buf));
|
||||
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);
|
||||
}
|
||||
|
||||
int serial_write(char *ptr, int len) {
|
||||
// todo sia dma che it corrompono
|
||||
// HAL_UART_Transmit_DMA(&huart1, ptr, len);
|
||||
// HAL_UART_Transmit_IT(&huart1, ptr, len);
|
||||
HAL_UART_Transmit(&huart1, ptr, len, 1000);
|
||||
uart_sent = 0;
|
||||
return len;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user