maj bluetooth compatible webapp

This commit is contained in:
thomas committed 2026-10-24 00:54:19 +02:00
1 parent 3757975e51
commit e94499ba1e
22 files changed
+68217 -67436

No files matched your search

@@ -16,6 +16,8 @@
#include <touchgfx/widgets/TextAreaWithWildcard.hpp>
#include <touchgfx/widgets/ToggleButton.hpp>
#include <texts/TextKeysAndLanguages.hpp>
#include <audio_effects.h>
#include <string.h>
namespace ui
{
@@ -144,6 +146,44 @@ inline void layoutParamRow(touchgfx::TextArea& label, touchgfx::Slider& slider,
slider.setXY(184, y); /* curseur 456x52 */
value.init(touchgfx::TypedText(T_VALUE_M_LEFT), accentColor, 656, y + 10, 136, 34);
}
/* Detecte qu'un autre acteur que l'ecran (controle a distance BLE) a modifie les parametres
* d'effets. snapshot() memorise l'etat affiche ; changed() compare tous les PERIOD ticks IHM
* (~100 ms a 60 Hz) et renvoie true une fois par changement : l'ecran relit alors les parametres. */
class ParamsWatcher
{
public:
ParamsWatcher() : ticks(0)
{
memset(&last, 0, sizeof(last));
}
void snapshot()
{
last = *AudioEffects_GetParams();
ticks = 0;
}
bool changed()
{
if (++ticks < PERIOD)
{
return false;
}
ticks = 0;
if (memcmp(&last, AudioEffects_GetParams(), sizeof(last)) == 0)
{
return false;
}
snapshot();
return true;
}
private:
static const uint8_t PERIOD = 6;
AudioEffectsParams last;
uint8_t ticks;
};
} // namespace ui
#endif // UITHEME_HPP
@@ -12,12 +12,16 @@ public:
virtual ~EchoView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void sliderDelaiChanged(int value);
virtual void sliderFeedbackChanged(int value);
virtual void sliderMixChanged(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[3];
};
@@ -12,6 +12,7 @@ public:
virtual ~EqualizerView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void sliderBand1Changed(int value);
@@ -25,6 +26,9 @@ public:
virtual void sliderBand9Changed(int value);
virtual void sliderBand10Changed(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[10];
touchgfx::Box zeroDbLine;
@@ -12,6 +12,7 @@ public:
virtual ~OctaverView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void slider1Clicked(int value);
@@ -20,6 +21,9 @@ public:
virtual void slider4Clicked(int value);
virtual void slider5Clicked(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[5];
@@ -12,12 +12,16 @@ public:
virtual ~OverdriveView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void sliderDriveChanged(int value);
virtual void sliderToneChanged(int value);
virtual void sliderLevelChanged(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[3];
};
@@ -33,6 +33,9 @@ protected:
};
void onCardOpen(const EffectCard& card);
/* Relit marche/arret, volume et etat des cartes (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
void setLooperState(LooperState state);
/* Buffer du CanvasWidgetRenderer (voyant du looper), propre a cet ecran comme
@@ -12,12 +12,16 @@ public:
virtual ~ReverbView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void sliderTailleChanged(int value);
virtual void sliderAmortiChanged(int value);
virtual void sliderMixChanged(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[3];
};
@@ -12,11 +12,15 @@ public:
virtual ~SaturationView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();
virtual void toggleClicked();
virtual void sliderDriveClicked(int value);
virtual void sliderLevelClicked(int value);
protected:
/* Relit les parametres d'effets dans les widgets (setupScreen + changements distants) */
void syncFromParams();
ui::ParamsWatcher watcher;
ui::Header header;
ui::ValueText values[2];
};
@@ -20,14 +20,30 @@ void EchoView::setupScreen()
add(values[i]);
}
syncFromParams();
}
void EchoView::syncFromParams()
{
FxEchoParams& p = AudioEffects_GetParams()->echo;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
slider1.setValue((int16_t)(p.delay_ms / 10.0f + 0.5f));
slider2.setValue((int16_t)(p.feedback / 0.95f * 100.0f + 0.5f));
slider3.setValue((int16_t)(p.mix * 100.0f + 0.5f));
values[0].show("%d ms", slider1.getValue() * 10);
values[1].show("%d %%", slider2.getValue());
values[2].show("%d %%", slider3.getValue());
watcher.snapshot();
}
void EchoView::handleTickEvent()
{
EchoViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void EchoView::tearDownScreen()
@@ -42,8 +42,6 @@ void EqualizerView::setupScreen()
&bandSlider6, &bandSlider7, &bandSlider8, &bandSlider9, &bandSlider10 };
touchgfx::TextArea* labels[10] = { &textArea2, &textArea2_1, &textArea2_2, &textArea2_3, &textArea2_4,
&textArea2_5, &textArea2_6, &textArea2_7, &textArea2_8, &textArea2_9 };
const FxEqualizerParams& p = AudioEffects_GetParams()->equalizer;
toggleButton1.forceState(p.enabled);
for (int i = 0; i < 10; i++)
{
@@ -53,10 +51,34 @@ void EqualizerView::setupScreen()
labels[i]->setColor(ui::textMuted());
values[i].init(touchgfx::TypedText(T_VALUE_S_CENTER), accent, x - 10, VALUE_Y, 76, 24);
add(values[i]);
}
syncFromParams();
}
void EqualizerView::syncFromParams()
{
touchgfx::Slider* sliders[10] = { &bandSlider1, &bandSlider2, &bandSlider3, &bandSlider4, &bandSlider5,
&bandSlider6, &bandSlider7, &bandSlider8, &bandSlider9, &bandSlider10 };
const FxEqualizerParams& p = AudioEffects_GetParams()->equalizer;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
for (int i = 0; i < 10; i++)
{
sliders[i]->setValue((int16_t)((p.bands[i].gain_db + GAIN_RANGE_DB / 2.0f) / GAIN_RANGE_DB * 100.0f + 0.5f));
values[i].showDb(sliderToDb(sliders[i]->getValue()));
}
watcher.snapshot();
}
void EqualizerView::handleTickEvent()
{
EqualizerViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void EqualizerView::tearDownScreen()
@@ -33,17 +33,34 @@ void OctaverView::setupScreen()
add(values[i]);
}
syncFromParams();
}
void OctaverView::syncFromParams()
{
FxOctaverParams& p = AudioEffects_GetParams()->octaver;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
slider1.setValue((int16_t)(p.level_down2 * 100.0f + 0.5f));
slider2.setValue((int16_t)(p.level_down1 * 100.0f + 0.5f));
slider3.setValue((int16_t)(p.level_dry * 100.0f + 0.5f));
slider4.setValue((int16_t)(p.level_up1 * 100.0f + 0.5f));
slider5.setValue((int16_t)(p.level_up2 * 100.0f + 0.5f));
touchgfx::Slider* sliders[5] = { &slider1, &slider2, &slider3, &slider4, &slider5 };
for (int i = 0; i < 5; i++)
{
showLevel(i, sliders[i]->getValue());
}
watcher.snapshot();
}
void OctaverView::handleTickEvent()
{
OctaverViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void OctaverView::tearDownScreen()
@@ -20,14 +20,30 @@ void OverdriveView::setupScreen()
add(values[i]);
}
syncFromParams();
}
void OverdriveView::syncFromParams()
{
FxOverdriveParams& p = AudioEffects_GetParams()->overdrive;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
slider1.setValue((int16_t)(p.drive * 100.0f + 0.5f));
slider2.setValue((int16_t)(p.tone * 100.0f + 0.5f));
slider3.setValue((int16_t)(p.level * 100.0f + 0.5f));
values[0].show("%d %%", slider1.getValue());
values[1].show("%d %%", slider2.getValue());
values[2].show("%d %%", slider3.getValue());
watcher.snapshot();
}
void OverdriveView::handleTickEvent()
{
OverdriveViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void OverdriveView::tearDownScreen()
@@ -95,11 +95,23 @@ void OverviewView::setupScreen()
buttonWithLabel7.setLabelText(touchgfx::TypedText(T_SPECTRUM));
/* --- Etat initial --- */
syncFromParams();
setLooperState(LOOPER_IDLE);
}
void OverviewView::syncFromParams()
{
const AudioEffectsParams* params = AudioEffects_GetParams();
toggleButton1.forceState(params->audio_on_off);
toggleButton1.invalidate();
const int volume = (int)(params->master_volume * 100.0f + 0.5f);
slider1.setValue((int16_t)volume);
volumeValue.show("%d %%", volume);
setLooperState(LOOPER_IDLE);
for (int i = 0; i < 6; i++)
{
cards[i].refresh();
}
watcher.snapshot();
}
void OverviewView::tearDownScreen()
@@ -152,6 +164,11 @@ void OverviewView::handleTickEvent()
{
OverviewViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
/* repeatButton1 declenche une action a l'appui puis en continu tant qu'il est
* maintenu (comportement standard TouchGFX d'un RepeatButton) : ca ne donne pas
* directement un evenement "relache". On detecte donc nous-memes le front sur son
@@ -24,14 +24,30 @@ void ReverbView::setupScreen()
add(values[i]);
}
syncFromParams();
}
void ReverbView::syncFromParams()
{
FxReverbParams& p = AudioEffects_GetParams()->reverb;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
slider1.setValue((int16_t)(p.room_size * 100.0f + 0.5f));
slider2.setValue((int16_t)(p.damping * 100.0f + 0.5f));
slider3.setValue((int16_t)(p.mix * 100.0f + 0.5f));
values[0].show("%d %%", slider1.getValue());
values[1].show("%d %%", slider2.getValue());
values[2].show("%d %%", slider3.getValue());
watcher.snapshot();
}
void ReverbView::handleTickEvent()
{
ReverbViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void ReverbView::tearDownScreen()
@@ -17,12 +17,28 @@ void SaturationView::setupScreen()
add(values[0]);
add(values[1]);
syncFromParams();
}
void SaturationView::syncFromParams()
{
FxSaturationParams& p = AudioEffects_GetParams()->saturation;
toggleButton1.forceState(p.enabled);
toggleButton1.invalidate();
slider1.setValue((int16_t)(p.drive * 100.0f + 0.5f));
slider2.setValue((int16_t)(p.level * 100.0f + 0.5f));
values[0].show("%d %%", slider1.getValue());
values[1].show("%d %%", slider2.getValue());
watcher.snapshot();
}
void SaturationView::handleTickEvent()
{
SaturationViewBase::handleTickEvent();
if (watcher.changed())
{
syncFromParams();
}
}
void SaturationView::tearDownScreen()