Rough Implementation of the Operations Buffer

The Operations Buffer is basically a buffer of changes to the Graph Buffer. Instead of writing all the changes to the Graph Buffer directly, I plan to have those changes written to the Operation Buffer, so you can visually see what would be changed before it's applied.
This commit is contained in:
Jacob Litewski 2024-04-11 08:57:26 -04:00
commit c2e43c3f46
4 changed files with 49 additions and 0 deletions

View file

@ -26,6 +26,7 @@
int g_GraphBuffer[MAX_GRAPH_TRACE_LEN];
int g_OperationBuffer[MAX_GRAPH_TRACE_LEN];
size_t g_GraphTraceLen;
/* write a manchester bit to the graph
@ -68,6 +69,7 @@ void AppendGraph(bool redraw, uint16_t clock, int bit) {
size_t ClearGraph(bool redraw) {
size_t gtl = g_GraphTraceLen;
memset(g_GraphBuffer, 0x00, g_GraphTraceLen);
memset(g_OperationBuffer, 0x00, g_GraphTraceLen);
g_GraphTraceLen = 0;
g_GraphStart = 0;
g_GraphStop = 0;
@ -78,6 +80,7 @@ size_t ClearGraph(bool redraw) {
return gtl;
}
// option '1' to save g_GraphBuffer any other to restore
void save_restoreGB(uint8_t saveOpt) {
static int SavedGB[MAX_GRAPH_TRACE_LEN];

View file

@ -48,6 +48,7 @@ bool fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, int *firstClockEdge);
#define GRAPH_RESTORE 0
extern int g_GraphBuffer[MAX_GRAPH_TRACE_LEN];
extern int g_OperationBuffer[MAX_GRAPH_TRACE_LEN];
extern size_t g_GraphTraceLen;
#ifdef __cplusplus

View file

@ -778,6 +778,44 @@ void Plot::plotGridLines(QPainter *painter, QRect r) {
}
}
void Plot::plotOperations(int *buffer, size_t len, QPainter *painter, QRect plotRect) {
if(len == 0) {
return;
}
QPainterPath penPath;
int32_t x = xCoordOf(g_GraphStart, plotRect), prevX = 0;
int32_t y = yCoordOf(buffer[g_GraphStart], plotRect, gs_absVMax), prevY = 0;
int32_t past = 0, current = 0;
for (uint32_t pos = g_GraphStart; pos < len && xCoordOf(pos, plotRect) < plotRect.right(); pos++) {
if(pos == 0) continue; //Skip the first value of the buffer to prevent underflows
//Store the previous x and y values to move the pen to if we need to draw a line
prevX = x;
prevY = y;
x = xCoordOf(pos, plotRect);
current = buffer[pos];
past = buffer[pos - 1]; //Get the previous value for checking
y = yCoordOf(current, plotRect, gs_absVMax);
//We don't want to graph a line over the zero line, only operations stored in the buffer
if(current == 0 && past == 0) continue;
penPath.moveTo(prevX, prevY); //Move the pen
penPath.lineTo(x, y); //Draw the line from the previous coords to the new ones
if (g_GraphPixelsPerPoint > 10) {
QRect point(QPoint(x - 3, y - 3), QPoint(x + 3, y + 3));
painter->fillRect(point, WHITE);
}
}
painter->setPen(CITRON);
painter->drawPath(penPath);
}
#define HEIGHT_INFO 60
#define WIDTH_AXES 80
@ -824,6 +862,12 @@ void Plot::paintEvent(QPaintEvent *event) {
if (g_DemodBufferLen > 8) {
PlotDemod(g_DemodBuffer, g_DemodBufferLen, plotRect, infoRect, &painter, 2, g_DemodStartIdx);
}
//Plot the Operation Overlay
//setMaxAndStart(g_OperationBuffer, g_GraphTraceLen, plotRect);
plotOperations(g_OperationBuffer, g_GraphTraceLen, &painter, plotRect);
//Plot the Overlay
if (gs_useOverlays) {
//init graph variables
setMaxAndStart(s_OverlayBuff, g_GraphTraceLen, plotRect);

View file

@ -48,6 +48,7 @@ class Plot: public QWidget {
void PlotGraph(int *buffer, size_t len, QRect plotRect, QRect annotationRect, QPainter *painter, int graphNum);
void PlotDemod(uint8_t *buffer, size_t len, QRect plotRect, QRect annotationRect, QPainter *painter, int graphNum, uint32_t plotOffset);
void plotGridLines(QPainter *painter, QRect r);
void plotOperations(int *buffer, size_t len, QPainter *painter, QRect rect);
int xCoordOf(int i, QRect r);
int yCoordOf(int v, QRect r, int maxVal);
int valueOf_yCoord(int y, QRect r, int maxVal);