@@ -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
8084static bool g_isLoading;
8185static bool g_interruptLoading;
@@ -298,7 +302,7 @@ State getState() {
298302}
299303
300304static 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
304308static 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
351359void 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