This commit is contained in:
2026-07-20 23:18:26 +02:00
parent a2f8c110c4
commit 98d971d92d
13 changed files with 799 additions and 711 deletions
+31 -22
View File
@@ -1,14 +1,11 @@
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <SDL2/SDL.h>
#include "font.h"
#include "cpustatusui.h"
#include "decoder.h"
#include "goertzel.h"
#include "texteditor.h"
#include "hexdump.h"
//The window we'll be rendering to
SDL_Window *window = NULL;
@@ -38,8 +35,7 @@ static const char *tx_state_name(TxState state) {
switch (state) {
case TX_IDLE: return "IDLE";
case TX_PREAMBLE: return "PREAMBLE";
case TX_SYNC: return "SYNC";
case TX_DATA: return "DATA";
case TX_PACKET: return "PACKET";
case TX_END: return "END";
}
return "?";
@@ -48,9 +44,9 @@ static const char *tx_state_name(TxState state) {
static const char *rx_state_name(RxState state) {
switch (state) {
case RX_SEARCH: return "SEARCH";
case RX_ALIGN: return "ALIGN";
case RX_SYNC: return "SYNC";
case RX_LOCKED: return "LOCKED";
case RX_MAGIC: return "MAGIC";
case RX_DATA: return "DATA";
}
return "?";
}
@@ -65,8 +61,8 @@ static const char *setting_name(int setting) {
case 5: return "CLOCK1";
case 6: return "OUT DEVICE";
case 7: return "IN DEVICE";
default: return "UNKNOWN";
}
return "?";
}
static void apply_modem_settings(void) {
@@ -79,12 +75,12 @@ static void apply_modem_settings(void) {
encoder.clock0,
SAMPLE_RATE,
encoder.symbolSamples);
encoder.clock1 = goertzel_bin_freq(
encoder.clock1,
SAMPLE_RATE,
encoder.symbolSamples);
decoder.bitCount = encoder.bitCount;
decoder.startFreq = encoder.startFreq;
decoder.endFreq = encoder.endFreq;
decoder.dataSpacing = encoder.dataSpacing;
@@ -135,6 +131,7 @@ static void adjust_modem_setting(int delta) {
static void render_modem_text(SDL_Renderer *renderer) {
char line[256];
// TX info on the left
snprintf(
line,
sizeof(line),
@@ -147,6 +144,7 @@ static void render_modem_text(SDL_Renderer *renderer) {
encoder.syncIndex);
renderText(renderer, smallerFont, line, 10, 8);
// RX info on the right
snprintf(
line,
sizeof(line),
@@ -156,18 +154,19 @@ static void render_modem_text(SDL_Renderer *renderer) {
decoder.lastDecodedByte,
decoder.bestSyncScore,
decoder.bestSyncPhase);
renderText(renderer, smallerFont, line, 10, 22);
renderText(renderer, smallerFont, line, 640, 8);
// Clock info below RX
snprintf(
line,
sizeof(line),
"CLK E0 %.5f E1 %.5f R %.1f HIST %02X/%u",
"CLK E0 %08.5f E1 %08.5f R %02.1f HIST %02X/%u",
decoder.clockEnergy0,
decoder.clockEnergy1,
decoder.clockRatio,
decoder.clockHistory,
decoder.clockCount);
renderText(renderer, smallerFont, line, 10, 36);
renderText(renderer, smallerFont, line, 640, 22);
// Settings display with highlighting
const char *settingStr = setting_name(selectedModemSetting);
@@ -192,10 +191,11 @@ static void render_modem_text(SDL_Renderer *renderer) {
}
static void render_tone_bars(SDL_Renderer *renderer) {
const int tones = decoder.bitCount * 2 + 2;
const int dataTones = MAX_FSK_TONES;
const int tones = dataTones + 2; // clocks are indices 0,1
const int x = 500;
const int y = 560;
const int maxHeight = 72;
const int y = 650;
const int maxHeight = 192;
const int barWidth = 8;
const int gap = 4;
@@ -203,10 +203,15 @@ static void render_tone_bars(SDL_Renderer *renderer) {
SDL_Rect frame = {x - 4, y - maxHeight - 4, tones * (barWidth + gap) + 4, maxHeight + 24};
SDL_RenderDrawRect(renderer, &frame);
// Draw clocks first (indices 0 and 1)
for (int i = 0; i < tones; i++) {
int idx;
if (i < 2) idx = i; // clock indices 0,1
else idx = 2 + (i - 2); // data indices start at 2
float ratio = 0.0f;
if (decoder.maxEnergy > 0.0f)
ratio = decoder.energies[i] / decoder.maxEnergy;
ratio = decoder.energies[idx] / decoder.maxEnergy;
if (ratio > 1.0f)
ratio = 1.0f;
@@ -216,18 +221,18 @@ static void render_tone_bars(SDL_Renderer *renderer) {
barRect.x = x + i * (barWidth + gap);
barRect.y = y - barRect.h;
if (i >= decoder.bitCount * 2)
SDL_SetRenderDrawColor(renderer, 255, 192, 64, 255);
else if (i & 1)
SDL_SetRenderDrawColor(renderer, 80, 180, 255, 255);
if (idx < 2)
SDL_SetRenderDrawColor(renderer, 255, 192, 64, 255); // clock
else if ((idx - 2) & 1)
SDL_SetRenderDrawColor(renderer, 80, 180, 255, 255); // 1-tone
else
SDL_SetRenderDrawColor(renderer, 80, 255, 140, 255);
SDL_SetRenderDrawColor(renderer, 80, 255, 140, 255); // 0-tone
SDL_RenderFillRect(renderer, &barRect);
}
char label[128];
snprintf(label, sizeof(label), "TONE ENERGY: BIT0..BIT7, CLOCK0, CLOCK1");
snprintf(label, sizeof(label), "TONE ENERGY: CLOCK0, CLOCK1, BIT0..BIT15");
renderText(renderer, smallerFont, label, x, y + 6);
}
@@ -320,6 +325,9 @@ int init() {
updateDump(&transmitEditor, renderer);
// Auto-start encoder for testing
//startEncoder(&encoder);
SDL_Rect viewport = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
SDL_RenderSetViewport(renderer, &viewport);
@@ -477,6 +485,7 @@ int processEvent(SDL_Event e) {
break;
case SDLK_F5:
updateDump(&transmitEditor, renderer);
updateDump(&receivedEditor, renderer);
break;
case SDLK_F7:
startEncoder(&encoder);