Protocole ASCII type NMEA ($T/$C avec checksum) entre l'ESP32-C3 et le TMS320 (frequence/duty/tensions/courants/temperatures + commandes HT/PWM1/PWM2), avec simulateur local le temps que le firmware TMS320 existe. Driver SSD1322 repointe sur les GPIO du schema, dashboard texte 3 pages tournantes sur l'ecran ER-OLEDM032-1. LED RGB embarquee (GPIO8) clignotante 1 Hz vert 30% comme indicateur de vie. Serveur web laisse en stub (sera branche en STA sur le reseau local une fois l'OLED valide). Ajout de la documentation technique (schema, datasheets, protocole).
85 lines
2.1 KiB
C++
85 lines
2.1 KiB
C++
#include "oled_ui.h"
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include "er_oled.h"
|
|
#include "tms_link.h"
|
|
|
|
namespace OledUi {
|
|
|
|
namespace {
|
|
|
|
const uint32_t REFRESH_PERIOD_MS = 500;
|
|
const uint32_t PAGE_PERIOD_MS = 3000;
|
|
|
|
uint32_t g_lastRefreshMs = 0;
|
|
uint32_t g_lastPageChangeMs = 0;
|
|
uint8_t g_page = 0;
|
|
const uint8_t PAGE_COUNT = 3;
|
|
|
|
void drawLine(uint8_t y, const char *text) {
|
|
char padded[33];
|
|
snprintf(padded, sizeof(padded), "%-32s", text);
|
|
er_oled_string(0, y, padded, 0);
|
|
}
|
|
|
|
void drawEntreeCommandes(const Telemetry &t, bool linkOk) {
|
|
char l0[33], l1[33], l2[33], l3[33];
|
|
snprintf(l0, sizeof(l0), "TMS320: %s", linkOk ? "OK" : "PERDU");
|
|
snprintf(l1, sizeof(l1), "Vin=%.1fV Iin=%.2fA", t.vin, t.iin);
|
|
snprintf(l2, sizeof(l2), "Iout=%.2fA", t.iout);
|
|
snprintf(l3, sizeof(l3), "HT:%s PWM1:%s PWM2:%s", TmsLink::command().ht ? "ON " : "OFF",
|
|
TmsLink::command().pwm1 ? "ON " : "OFF", TmsLink::command().pwm2 ? "ON " : "OFF");
|
|
drawLine(0, l0);
|
|
drawLine(16, l1);
|
|
drawLine(32, l2);
|
|
drawLine(48, l3);
|
|
}
|
|
|
|
void drawEtage1(const Telemetry &t) {
|
|
char l1[33], l2[33];
|
|
snprintf(l1, sizeof(l1), "F=%.0fHz D=%.1f%%", t.freq1, t.duty1);
|
|
snprintf(l2, sizeof(l2), "V=%.1fV I=%.2fA T=%.1fC", t.v1, t.i1, t.t1);
|
|
drawLine(0, "ETAGE 1");
|
|
drawLine(16, l1);
|
|
drawLine(32, l2);
|
|
drawLine(48, "");
|
|
}
|
|
|
|
void drawEtage2(const Telemetry &t) {
|
|
char l1[33], l2[33];
|
|
snprintf(l1, sizeof(l1), "F=%.0fHz D=%.1f%%", t.freq2, t.duty2);
|
|
snprintf(l2, sizeof(l2), "V=%.1fV I=%.2fA T=%.1fC", t.vout, t.i2, t.t2);
|
|
drawLine(0, "ETAGE 2");
|
|
drawLine(16, l1);
|
|
drawLine(32, l2);
|
|
drawLine(48, "");
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void begin() {
|
|
er_oled_begin();
|
|
er_oled_clear();
|
|
}
|
|
|
|
void update(const Telemetry &t, bool linkOk) {
|
|
uint32_t now = millis();
|
|
|
|
if (now - g_lastPageChangeMs >= PAGE_PERIOD_MS) {
|
|
g_lastPageChangeMs = now;
|
|
g_page = (g_page + 1) % PAGE_COUNT;
|
|
}
|
|
|
|
if (now - g_lastRefreshMs < REFRESH_PERIOD_MS) return;
|
|
g_lastRefreshMs = now;
|
|
|
|
switch (g_page) {
|
|
case 0: drawEntreeCommandes(t, linkOk); break;
|
|
case 1: drawEtage1(t); break;
|
|
case 2: drawEtage2(t); break;
|
|
}
|
|
}
|
|
|
|
} // namespace OledUi
|