curve plotter fixes
This commit is contained in:
		
							parent
							
								
									c37db3d4d3
								
							
						
					
					
						commit
						36d9b3dedb
					
				@ -14,8 +14,10 @@ void dp_printf(uint16_t x, uint16_t y, uint8_t font, uint8_t inv,
 | 
			
		||||
void dp_printqr(uint16_t offset_x, uint16_t offset_y, const char *Message);
 | 
			
		||||
void oledfillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
 | 
			
		||||
                  uint8_t bRender);
 | 
			
		||||
void oledScrollBufferLeft(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                          const uint16_t height);
 | 
			
		||||
void oledScrollBufferHorizontal(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                                const uint16_t height, bool left = true);
 | 
			
		||||
void oledScrollBufferVertical(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                              const uint16_t height, int offset = 0);
 | 
			
		||||
int oledDrawPixel(uint8_t *buf, const uint16_t x, const uint16_t y,
 | 
			
		||||
                  const uint8_t dot);
 | 
			
		||||
void oledPlotCurve(uint16_t count, bool reset);
 | 
			
		||||
 | 
			
		||||
@ -409,24 +409,55 @@ int oledDrawPixel(uint8_t *buf, const uint16_t x, const uint16_t y,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oledScrollBufferLeft(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                          const uint16_t height) {
 | 
			
		||||
void oledScrollBufferHorizontal(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                                const uint16_t height, bool left) {
 | 
			
		||||
 | 
			
		||||
  uint16_t col, page, idx;
 | 
			
		||||
 | 
			
		||||
  for (page = 0; page < height / 8; page++) {
 | 
			
		||||
    for (col = 0; col < width - 1; col++) {
 | 
			
		||||
      idx = page * width + col;
 | 
			
		||||
      buf[idx] = buf[idx + 1];
 | 
			
		||||
    if (left) { // scroll left
 | 
			
		||||
      for (col = 0; col < width - 1; col++) {
 | 
			
		||||
        idx = page * width + col;
 | 
			
		||||
        buf[idx] = buf[idx + 1];
 | 
			
		||||
      }
 | 
			
		||||
      buf[idx + 1] = 0;
 | 
			
		||||
    } else // scroll right
 | 
			
		||||
    {
 | 
			
		||||
      for (col = width - 1; col > 0; col--) {
 | 
			
		||||
        idx = page * width + col;
 | 
			
		||||
        buf[idx] = buf[idx - 1];
 | 
			
		||||
      }
 | 
			
		||||
      buf[idx - 1] = 0;
 | 
			
		||||
    }
 | 
			
		||||
    buf[idx + 1] = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oledScrollBufferVertical(uint8_t *buf, const uint16_t width,
 | 
			
		||||
                              const uint16_t height, int offset) {
 | 
			
		||||
 | 
			
		||||
  uint64_t buf_col;
 | 
			
		||||
 | 
			
		||||
  if (!offset)
 | 
			
		||||
    return; // nothing to do
 | 
			
		||||
 | 
			
		||||
  for (uint16_t col = 0; col < DISPLAY_WIDTH; col++) {
 | 
			
		||||
    // convert column bytes from display buffer to uint64_t
 | 
			
		||||
    buf_col = *(uint64_t *)&buf[col * DISPLAY_HEIGHT / 8];
 | 
			
		||||
 | 
			
		||||
    if (offset > 0) // scroll up
 | 
			
		||||
      buf_col >= abs(offset);
 | 
			
		||||
    else // scroll down
 | 
			
		||||
      buf_col <= offset;
 | 
			
		||||
 | 
			
		||||
    // write back uint64_t to uint8_t display buffer
 | 
			
		||||
    *(uint64_t *)&buf[col * DISPLAY_HEIGHT / 8] = buf_col;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oledPlotCurve(uint16_t count, bool reset) {
 | 
			
		||||
 | 
			
		||||
  static uint16_t last_count = 0, col = 0, row = 0;
 | 
			
		||||
  static int scalefactor = 1, oldsf = 1;
 | 
			
		||||
  uint16_t v_scroll = 0;
 | 
			
		||||
 | 
			
		||||
  if ((last_count == count) && !reset)
 | 
			
		||||
    return;
 | 
			
		||||
@ -435,47 +466,23 @@ void oledPlotCurve(uint16_t count, bool reset) {
 | 
			
		||||
    if (col < DISPLAY_WIDTH - 1) // matrix not full -> increment column
 | 
			
		||||
      col++;
 | 
			
		||||
    else // matrix full -> scroll left 1 dot
 | 
			
		||||
      oledScrollBufferLeft(displaybuf, DISPLAY_WIDTH, DISPLAY_HEIGHT);
 | 
			
		||||
      oledScrollBufferHorizontal(displaybuf, DISPLAY_WIDTH, DISPLAY_HEIGHT,
 | 
			
		||||
                                 true);
 | 
			
		||||
 | 
			
		||||
  } else // clear current dot
 | 
			
		||||
    oledDrawPixel(displaybuf, col, row, 0);
 | 
			
		||||
 | 
			
		||||
  // re-scale, if necessary
 | 
			
		||||
  oldsf = scalefactor;
 | 
			
		||||
  while (((count / scalefactor) <= DISPLAY_HEIGHT) && (scalefactor > 1))
 | 
			
		||||
    scalefactor--;
 | 
			
		||||
  while ((count / scalefactor) > DISPLAY_HEIGHT)
 | 
			
		||||
    scalefactor++;
 | 
			
		||||
  if (scalefactor != oldsf)
 | 
			
		||||
    oledRescaleBuffer(displaybuf, scalefactor);
 | 
			
		||||
  // scroll up vertical, if necessary
 | 
			
		||||
  while ((count - v_scroll) > DISPLAY_HEIGHT - 1)
 | 
			
		||||
    v_scroll++;
 | 
			
		||||
  if (v_scroll)
 | 
			
		||||
    oledScrollBufferVertical(displaybuf, DISPLAY_WIDTH, DISPLAY_HEIGHT,
 | 
			
		||||
                             v_scroll);
 | 
			
		||||
 | 
			
		||||
  // set new dot
 | 
			
		||||
  row = DISPLAY_HEIGHT - 1 - (count / scalefactor) % DISPLAY_HEIGHT;
 | 
			
		||||
  row = DISPLAY_HEIGHT - 1 - (count - v_scroll) % DISPLAY_HEIGHT;
 | 
			
		||||
  last_count = count;
 | 
			
		||||
  oledDrawPixel(displaybuf, col, row, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void oledRescaleBuffer(uint8_t *buf, const int factor) {
 | 
			
		||||
 | 
			
		||||
  if (!factor)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  uint64_t buf_col;
 | 
			
		||||
 | 
			
		||||
  for (uint16_t col = 0; col < DISPLAY_WIDTH; col++) {
 | 
			
		||||
    // convert column bytes from display buffer to uint64_t
 | 
			
		||||
    buf_col = *(uint64_t *)&buf[col * DISPLAY_HEIGHT / 8];
 | 
			
		||||
 | 
			
		||||
    if (factor < 0)
 | 
			
		||||
      // shift left: scroll up = scale down
 | 
			
		||||
      buf_col <= abs(factor);
 | 
			
		||||
    else
 | 
			
		||||
      // shift right: scroll down = scale up
 | 
			
		||||
      buf_col >= abs(factor);
 | 
			
		||||
 | 
			
		||||
    // write back uint64_t to uint8_t display buffer
 | 
			
		||||
    *(uint64_t *)&buf[col * DISPLAY_HEIGHT / 8] = buf_col;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // HAS_DISPLAY
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user