Skip to content

Commit c7150a1

Browse files
committed
dlog view
1 parent 5615890 commit c7150a1

File tree

1 file changed

+114
-108
lines changed

1 file changed

+114
-108
lines changed

src/eez/modules/psu/dlog_view.cpp

Lines changed: 114 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,15 @@ struct BlockElement {
7171
float max;
7272
};
7373

74-
static const uint32_t NUM_ELEMENTS_PER_BLOCKS = 480 * MAX_NUM_OF_Y_VALUES;
75-
static const uint32_t BLOCK_SIZE = NUM_ELEMENTS_PER_BLOCKS * sizeof(BlockElement);
76-
static const uint32_t NUM_BLOCKS = FILE_VIEW_BUFFER_SIZE / (BLOCK_SIZE + sizeof(CacheBlock));
74+
static uint8_t *g_rowDataStart = FILE_VIEW_BUFFER;
75+
static const uint32_t ROW_VALUES_BUFFER_SIZE = 65536;
7776

78-
CacheBlock *g_cacheBlocks = (CacheBlock *)FILE_VIEW_BUFFER;
77+
static CacheBlock *g_cacheBlocks = (CacheBlock *)(FILE_VIEW_BUFFER + ROW_VALUES_BUFFER_SIZE);
78+
static const uint32_t CACHE_BLOCKS_BUFFER_SIZE = FILE_VIEW_BUFFER_SIZE - ROW_VALUES_BUFFER_SIZE;
79+
80+
static uint32_t NUM_ELEMENTS_PER_BLOCKS;
81+
static uint32_t BLOCK_SIZE;
82+
static uint32_t NUM_BLOCKS;
7983

8084
static bool g_isLoading;
8185
static bool g_interruptLoading;
@@ -298,7 +302,7 @@ State getState() {
298302
}
299303

300304
static inline BlockElement *getCacheBlock(unsigned blockIndex) {
301-
return (BlockElement *)(FILE_VIEW_BUFFER + NUM_BLOCKS * sizeof(CacheBlock) + blockIndex * BLOCK_SIZE);
305+
return (BlockElement *)((uint8_t *)g_cacheBlocks + NUM_BLOCKS * sizeof(CacheBlock) + blockIndex * BLOCK_SIZE);
302306
}
303307

304308
static inline unsigned getNumElementsPerRow() {
@@ -312,6 +316,10 @@ void invalidateAllBlocks() {
312316
osDelay(1);
313317
}
314318

319+
NUM_ELEMENTS_PER_BLOCKS = 480 * getNumElementsPerRow();
320+
BLOCK_SIZE = NUM_ELEMENTS_PER_BLOCKS * sizeof(BlockElement);
321+
NUM_BLOCKS = CACHE_BLOCKS_BUFFER_SIZE / (sizeof(CacheBlock) + BLOCK_SIZE);
322+
315323
for (unsigned blockIndex = 0; blockIndex < NUM_BLOCKS; blockIndex++) {
316324
g_cacheBlocks[blockIndex].valid = false;
317325
}
@@ -349,9 +357,6 @@ float getSample(Recording &recording, uint8_t *rowData, unsigned columnIndex) {
349357
}
350358

351359
void loadBlock() {
352-
static const int NUM_VALUES_ROWS = 16;
353-
uint8_t values[dlog_file::MAX_NUM_OF_Y_AXES * NUM_VALUES_ROWS * sizeof(double)];
354-
355360
auto numSamplesPerValue = (unsigned)round(g_loadScale);
356361
if (numSamplesPerValue > 0) {
357362
File file;
@@ -376,32 +381,33 @@ void loadBlock() {
376381

377382
unsigned iStart = i;
378383

384+
const uint32_t NUM_VALUES_ROWS = ROW_VALUES_BUFFER_SIZE / g_dlogFile.numBytesPerRow;
385+
386+
uint8_t *rowData = g_rowDataStart;
387+
uint32_t rowDataLength = 0;
388+
379389
for (unsigned j = 0; j < numSamplesPerValue; j++) {
380390
i = iStart;
381391

382-
auto valuesRow = j % NUM_VALUES_ROWS;
383-
384-
if (valuesRow == 0) {
392+
if (rowDataLength == 0) {
385393
if (g_interruptLoading) {
386394
i = NUM_ELEMENTS_PER_BLOCKS;
387395
goto closeFile;
388396
}
389397

390398
// read up to NUM_VALUES_ROWS
391399
uint32_t bytesToRead = MIN(NUM_VALUES_ROWS, numSamplesPerValue - j) * g_dlogFile.numBytesPerRow;
392-
assert(bytesToRead <= sizeof(values));
393-
uint32_t bytesRead = file.read(values, bytesToRead);
400+
uint32_t bytesRead = file.read(g_rowDataStart, bytesToRead);
394401
if (bytesToRead != bytesRead) {
395402
i = NUM_ELEMENTS_PER_BLOCKS;
396403
goto closeFile;
397404
}
398405

406+
rowData = g_rowDataStart;
407+
rowDataLength = bytesRead;
399408
totalBytesRead += bytesRead;
400409
}
401410

402-
unsigned valuesOffset = valuesRow * g_dlogFile.numBytesPerRow;
403-
uint8_t *rowData = values + valuesOffset;
404-
405411
if (isValidSample(g_dlogFile, rowData)) {
406412
for (unsigned columnIndex = 0; columnIndex < numElementsPerRow; columnIndex++) {
407413
float value = getSample(g_dlogFile, rowData, columnIndex);
@@ -422,6 +428,9 @@ void loadBlock() {
422428
}
423429
}
424430
}
431+
432+
rowData += g_dlogFile.numBytesPerRow;
433+
rowDataLength -= g_dlogFile.numBytesPerRow;
425434
}
426435

427436
if (totalBytesRead > NUM_ELEMENTS_PER_BLOCKS * sizeof(BlockElement)) {
@@ -1664,107 +1673,104 @@ void data_recording(DataOperationEnum operation, Cursor cursor, Value &value) {
16641673
} else if (operation == DATA_OPERATION_YT_DATA_GET_CURSOR_OFFSET) {
16651674
value = Value(recording.cursorOffset, VALUE_TYPE_UINT32);
16661675
} else if (operation == DATA_OPERATION_YT_DATA_TOUCH_DRAG) {
1667-
TouchDrag *touchDrag = (TouchDrag *)value.getVoidPointer();
1668-
1669-
static union {
1670-
struct {
1671-
float valueAtTouchDown;
1672-
int yAtTouchDown;
1673-
} y;
1674-
struct {
1675-
float valueAtTouchDown;
1676-
int xAtTouchDown;
1677-
} x;
1678-
struct {
1679-
bool dragCursor;
1680-
int offset;
1681-
int dragStartX;
1682-
uint32_t dragStartPosition;
1683-
} cursor;
1684-
} g_dragState;
1685-
1686-
if (g_focusDataId == DATA_ID_DLOG_VISIBLE_VALUE_OFFSET) {
1687-
dlog_view::DlogValueParams *dlogValueParams = dlog_view::getVisibleDlogValueParams(recording,
1688-
!dlog_view::isMulipleValuesOverlayHeuristic(recording) || persist_conf::devConf.viewFlags.dlogViewLegendViewOption == persist_conf::DLOG_VIEW_LEGEND_VIEW_OPTION_DOCK
1689-
? recording.selectedVisibleValueIndex : g_focusCursor);
1690-
1691-
if (touchDrag->type == EVENT_TYPE_TOUCH_DOWN) {
1692-
g_dragState.y.valueAtTouchDown = dlogValueParams->offset;
1693-
g_dragState.y.yAtTouchDown = touchDrag->y;
1694-
} else {
1695-
float newOffset = g_dragState.y.valueAtTouchDown + dlogValueParams->div * (g_dragState.y.yAtTouchDown - touchDrag->y) * dlog_view::NUM_VERT_DIVISIONS / dlog_view::VIEW_HEIGHT;
1696-
1697-
float min = getMin(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_OFFSET).getFloat();
1698-
float max = getMax(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_OFFSET).getFloat();
1699-
1700-
newOffset = clamp(newOffset, min, max);
1701-
1702-
dlogValueParams->offset = newOffset;
1703-
}
1704-
} else if (g_focusDataId == DATA_ID_DLOG_VISIBLE_VALUE_DIV) {
1705-
dlog_view::DlogValueParams *dlogValueParams = dlog_view::getVisibleDlogValueParams(recording,
1706-
!dlog_view::isMulipleValuesOverlayHeuristic(recording) || persist_conf::devConf.viewFlags.dlogViewLegendViewOption == persist_conf::DLOG_VIEW_LEGEND_VIEW_OPTION_DOCK
1707-
? recording.selectedVisibleValueIndex : g_focusCursor);
1708-
1709-
if (touchDrag->type == EVENT_TYPE_TOUCH_DOWN) {
1710-
g_dragState.y.valueAtTouchDown = dlogValueParams->div;
1711-
1712-
//uint32_t position = ytDataGetPosition(cursor, DATA_ID_RECORDING);
1713-
//Value::YtDataGetValueFunctionPointer ytDataGetValue = ytDataGetGetValueFunc(cursor, DATA_ID_RECORDING);
1714-
//for (int i = position + touchDrag->x - 10; i < position + touchDrag->x + 10; )
1715-
1716-
g_dragState.y.yAtTouchDown = touchDrag->y;
1717-
} else {
1718-
float scale = 1.0f * (dlog_view::VIEW_HEIGHT - g_dragState.y.yAtTouchDown) / (dlog_view::VIEW_HEIGHT - touchDrag->y);
1719-
1720-
float newDiv = g_dragState.y.valueAtTouchDown * scale;
1721-
1722-
float min = getMin(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_DIV).getFloat();
1723-
float max = getMax(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_DIV).getFloat();
1676+
enum DragObject {
1677+
DRAG_CURSOR,
1678+
DRAG_X_OFFSET,
1679+
DRAG_X_DIV,
1680+
DRAG_Y_OFFSET,
1681+
DRAG_Y_DIV
1682+
};
1683+
1684+
static struct {
1685+
DragObject dragObject;
1686+
1687+
union {
1688+
struct {
1689+
bool dragCursor;
1690+
int offset;
1691+
} cursor;
1692+
1693+
struct {
1694+
float valueAtTouchDown;
1695+
int yAtTouchDown;
1696+
} y;
1697+
1698+
struct {
1699+
float valueAtTouchDown;
1700+
int xAtTouchDown;
1701+
} x;
1702+
1703+
struct {
1704+
int dragStartX;
1705+
uint32_t dragStartPosition;
1706+
} xOffset;
1707+
};
1708+
} g_dragState;
17241709

1725-
newDiv = clamp(newDiv, min, max);
1726-
1727-
dlogValueParams->offset = dlogValueParams->offset * newDiv / dlogValueParams->div;
1728-
dlogValueParams->div = newDiv;
1729-
}
1730-
} else if (g_focusDataId == DATA_ID_DLOG_X_AXIS_DIV) {
1731-
if (touchDrag->type == EVENT_TYPE_TOUCH_DOWN) {
1732-
g_dragState.x.valueAtTouchDown = recording.xAxisDiv;
1733-
g_dragState.x.xAtTouchDown = touchDrag->x;
1734-
} else {
1735-
float scale = 1.0f * (dlog_view::VIEW_WIDTH - touchDrag->x) / (dlog_view::VIEW_WIDTH - g_dragState.x.xAtTouchDown);
1736-
1737-
float newDiv = g_dragState.x.valueAtTouchDown * scale;
1738-
1739-
float min = getMin(g_focusCursor, DATA_ID_DLOG_X_AXIS_DIV).getFloat();
1740-
float max = getMax(g_focusCursor, DATA_ID_DLOG_X_AXIS_DIV).getFloat();
1741-
1742-
newDiv = clamp(newDiv, min, max);
1710+
TouchDrag *touchDrag = (TouchDrag *)value.getVoidPointer();
17431711

1744-
dlog_view::changeXAxisDiv(recording, newDiv);
1745-
}
1746-
} else {
1747-
if (touchDrag->type == EVENT_TYPE_TOUCH_DOWN) {
1748-
g_dragState.cursor.offset = recording.cursorOffset - touchDrag->x;
1749-
g_dragState.cursor.dragCursor = (abs((long)g_dragState.cursor.offset) < 30) && (touchDrag->y > (touchDrag->widgetCursor.widget->h - 60));
1750-
g_dragState.cursor.dragStartX = touchDrag->x;
1751-
g_dragState.cursor.dragStartPosition = dlog_view::getPosition(recording);
1752-
}
1712+
dlog_view::DlogValueParams *dlogValueParams = dlog_view::getVisibleDlogValueParams(recording,
1713+
!dlog_view::isMulipleValuesOverlayHeuristic(recording) || persist_conf::devConf.viewFlags.dlogViewLegendViewOption == persist_conf::DLOG_VIEW_LEGEND_VIEW_OPTION_DOCK
1714+
? recording.selectedVisibleValueIndex : g_focusCursor);
17531715

1716+
if (touchDrag->type == EVENT_TYPE_TOUCH_DOWN) {
1717+
g_dragState.cursor.offset = recording.cursorOffset - touchDrag->x;
1718+
g_dragState.cursor.dragCursor = (abs((long)g_dragState.cursor.offset) < 30) && (touchDrag->y > (touchDrag->widgetCursor.widget->h - 60));
17541719
if (g_dragState.cursor.dragCursor) {
1755-
recording.cursorOffset = MIN(dlog_view::VIEW_WIDTH - 1, MAX(touchDrag->x + g_dragState.cursor.offset, 0));
1720+
g_dragState.dragObject = DRAG_CURSOR;
17561721
} else {
1757-
int32_t newPosition = g_dragState.cursor.dragStartPosition + (g_dragState.cursor.dragStartX - touchDrag->x);
1722+
if (g_focusDataId == DATA_ID_DLOG_VISIBLE_VALUE_OFFSET) {
1723+
g_dragState.dragObject = DRAG_Y_OFFSET;
1724+
g_dragState.y.valueAtTouchDown = dlogValueParams->offset;
1725+
g_dragState.y.yAtTouchDown = touchDrag->y;
1726+
} else if (g_focusDataId == DATA_ID_DLOG_VISIBLE_VALUE_DIV) {
1727+
g_dragState.dragObject = DRAG_Y_DIV;
1728+
g_dragState.y.valueAtTouchDown = dlogValueParams->div;
1729+
g_dragState.y.yAtTouchDown = touchDrag->y;
1730+
} else if (g_focusDataId == DATA_ID_DLOG_X_AXIS_DIV) {
1731+
g_dragState.dragObject = DRAG_X_DIV;
1732+
g_dragState.x.valueAtTouchDown = recording.xAxisDiv;
1733+
g_dragState.x.xAtTouchDown = touchDrag->x;
1734+
} else {
1735+
g_dragState.dragObject = DRAG_X_OFFSET;
1736+
g_dragState.xOffset.dragStartX = touchDrag->x;
1737+
g_dragState.xOffset.dragStartPosition = dlog_view::getPosition(recording);
1738+
}
1739+
}
1740+
} else {
1741+
if (g_dragState.dragObject == DRAG_CURSOR) {
1742+
recording.cursorOffset = MIN(dlog_view::VIEW_WIDTH - 1, MAX(touchDrag->x + g_dragState.cursor.offset, 0));
1743+
} else if (g_dragState.dragObject == DRAG_X_OFFSET) {
1744+
int32_t newPosition = g_dragState.xOffset.dragStartPosition + (g_dragState.xOffset.dragStartX - touchDrag->x);
17581745
if (newPosition < 0) {
17591746
newPosition = 0;
1760-
} else {
1761-
if (newPosition + recording.pageSize > recording.size) {
1762-
newPosition = recording.size - recording.pageSize;
1763-
}
1747+
} else if (newPosition + recording.pageSize > recording.size) {
1748+
newPosition = recording.size - recording.pageSize;
17641749
}
17651750
dlog_view::changeXAxisOffset(recording, newPosition * recording.parameters.period);
1766-
}
1767-
}
1751+
} else if (g_dragState.dragObject == DRAG_X_DIV) {
1752+
float scale = 1.0f * (dlog_view::VIEW_WIDTH - touchDrag->x) / (dlog_view::VIEW_WIDTH - g_dragState.x.xAtTouchDown);
1753+
float newDiv = g_dragState.x.valueAtTouchDown * scale;
1754+
float min = getMin(g_focusCursor, DATA_ID_DLOG_X_AXIS_DIV).getFloat();
1755+
float max = getMax(g_focusCursor, DATA_ID_DLOG_X_AXIS_DIV).getFloat();
1756+
newDiv = clamp(newDiv, min, max);
1757+
dlog_view::changeXAxisDiv(recording, newDiv);
1758+
} else if (g_dragState.dragObject == DRAG_Y_OFFSET) {
1759+
float newOffset = g_dragState.y.valueAtTouchDown + dlogValueParams->div * (g_dragState.y.yAtTouchDown - touchDrag->y) * dlog_view::NUM_VERT_DIVISIONS / dlog_view::VIEW_HEIGHT;
1760+
float min = getMin(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_OFFSET).getFloat();
1761+
float max = getMax(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_OFFSET).getFloat();
1762+
newOffset = clamp(newOffset, min, max);
1763+
dlogValueParams->offset = newOffset;
1764+
} else if (g_dragState.dragObject == DRAG_Y_DIV) {
1765+
float scale = 1.0f * (dlog_view::VIEW_HEIGHT - g_dragState.y.yAtTouchDown) / (dlog_view::VIEW_HEIGHT - touchDrag->y);
1766+
float newDiv = g_dragState.y.valueAtTouchDown * scale;
1767+
float min = getMin(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_DIV).getFloat();
1768+
float max = getMax(g_focusCursor, DATA_ID_DLOG_VISIBLE_VALUE_DIV).getFloat();
1769+
newDiv = clamp(newDiv, min, max);
1770+
dlogValueParams->offset = dlogValueParams->offset * newDiv / dlogValueParams->div;
1771+
dlogValueParams->div = newDiv;
1772+
}
1773+
}
17681774
} else if (operation == DATA_OPERATION_YT_DATA_GET_CURSOR_X_VALUE) {
17691775
float xValue = (dlog_view::getPosition(recording) + recording.cursorOffset) * recording.parameters.period;
17701776
if (recording.parameters.xAxis.scaleType == dlog_file::SCALE_LOGARITHMIC) {

0 commit comments

Comments
 (0)