Files
squeow/squeow_sw/Src/squeow.c.save
nzasch b9232f66b0 v1.2
2025-01-28 19:01:22 +01:00

183 lines
4.1 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <main.h>
#include <math.h>
#include <stdio.h>
#include <stm32g4xx_hal_conf.h>
#include "si5351.h"
#include "squeow.h"
#include "squeow_ui.h"
/* SQUEOW
TIM3 eventi 98304000/(49152×200) 10hz
TIM2 PWM 98304000/2048 48khz
risoluzione PWM 4*2048 -> 8192 (13bit)
*/
// SYS
uint8_t sys_tick, sys_tick_prescale, pwm_tick;
// UART
uint8_t UART_RX_buf[UART_RX_BUF_SIZE];
// SYNTH
uint32_t freq;
// ADC1
uint16_t adc1_valore;
// ADC2
uint16_t adc2_valori[4];
uint8_t adc2_done, adc_blocco, adc_allarmi[4];
// audio
uint16_t sample_value;
uint8_t stato_audio;
double sine_increment;
uint16_t samples_ringbuf[SAMPLES_BUFFER_SIZE]; ///< buffer ad anello dei dati RX
uint32_t samples_ringbuf_input_index, samples_ringbuf_output_index;
uint8_t usb_audio_tick;
// VU
uint8_t analog_wd_status;
// MOD
uint16_t pwm_value1, pwm_value2, pwm_value3, pwm_value4;
uint8_t rails_number;
// ###################################
void squeow_init(void) {
seriow_log(2, "squeow init");
sine_increment = 0.4;
samples_ringbuf_input_index = 0;
samples_ringbuf_output_index = 0;
freq = DEFAULT_SYNTH_FREQUENCY;
adc2_valori[0] = 10;
adc2_valori[1] = 20;
adc2_valori[2] = 30;
adc2_valori[3] = 40;
}
uint32_t sat_sub(uint16_t x, uint16_t y) {
uint16_t res = x - y;
res &= -(res <= x);
return res;
}
uint16_t u12_sine(void) {
static double angle;
angle += sine_increment;
if (angle >= 6.28)
angle = 0;
return (uint16_t)((sin(angle) * 0x7ff) + 0x7ff);
}
/*
uint16_t get_adc_sample(void) {
uint16_t adc_sample_value;
// stato_audio == STATO_AUDIO_ADC;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
// store_sample(HAL_ADC_GetValue(&hadc1) << 4);
adc_sample_value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return adc_sample_value;
}
*/
void store_samples(uint16_t *data, uint32_t size) {
for (uint32_t i = 0; i < size; ++i) {
store_sample(data[i]);
}
}
void store_sample(uint16_t sample) {
samples_ringbuf[samples_ringbuf_input_index] = sample;
ringbuf_increment(&samples_ringbuf_input_index, SAMPLES_BUFFER_SIZE_MASK);
}
uint16_t get_sample(void) {
ringbuf_increment(&samples_ringbuf_output_index, SAMPLES_BUFFER_SIZE_MASK);
return samples_ringbuf[samples_ringbuf_output_index];
}
uint32_t ringbuf_increment(uint32_t *index, uint32_t buff_size_mask) {
(*index)++;
*index &= buff_size_mask;
return *index;
}
void store_buffer(uint8_t *buf, uint32_t size) {
for (uint32_t s = 0; s < size / 4; s++) {
uint16_t LL = buf[s * 2];
uint16_t RR = buf[(s * 2) + 1];
store_sample(RR);
}
}
int vu_meter(uint16_t sample) {
uint16_t abs_sample, scaled_abs_sample;
uint16_t zero = 0x7FF;
abs_sample = (sample > zero) ? sample - zero : zero - sample;
scaled_abs_sample = abs_sample >> 3;
if (scaled_abs_sample >= vu_tmp_value)
return scaled_abs_sample;
else {
return vu_tmp_value;
}
}
// adc
void adc_rileva_soglie(uint16_t *adc_valori) {
if (adc_valori[0] > SOGLIA_TEMPERATURA) {
seriow_log(1, "ADC0 threshold detect");
HAL_GPIO_WritePin(TEMP_OL_GPIO_Port, TEMP_OL_Pin, 1);
adc_allarmi[0] = 1;
adc_blocco = 1;
}
if (adc_valori[1] > SOGLIA_CORRENTE) {
seriow_log(1, "ADC1 threshold detect");
adc_allarmi[1] = 1;
adc_blocco = 1;
}
if (adc_valori[3] > SOGLIA_RIFLESSA) {
seriow_log(1, "ADC3 threshold detect");
HAL_GPIO_WritePin(REFL_OL_GPIO_Port, REFL_OL_Pin, 1);
adc_allarmi[3] = 1;
adc_blocco = 1;
}
}
// synth
void squeow_synth_init(void) {
// occhio che blocca!
seriow_log(2, "synth init");
si5351_initialize();
}
void squeow_synth_set(freq) {
seriow_log(2, "synth set freq");
si5351_set_frequency(freq, 0);
si5351_set_frequency(freq, 1);
}
void squeow_synth_on(void) {
seriow_log(2, "synth on");
si5351_on_clk(0);
si5351_on_clk(1);
}
void squeow_synth_off(void) {
seriow_log(2, "synth off");
si5351_off_clk(0);
si5351_off_clk(1);
}