⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nxgraph.cpp

📁 Display simple data graph on 320x240 LCD module, using ucGUI library
💻 CPP
字号:
#include "nxGraph.h"

#ifdef NXGRAPH_USE_V20090205

nxGraph::nxGraph()
{
	Left = 0;
	Top = 100;
	Width = 290;
	Height = 130;
	XMin = 0.0;
	YMin = 0.0;
	XScale = 300.0; //5 min
	YScale = 100.0;	
	XStep = 60.0; //1 min

      Marker1 = 0.0;
      Marker2 = 0.0;
      Marker3 = 0.0;

	YStep = 20.0;
	Period = -1;
	
	ClearLines();
}

void nxGraph::ClearLines(void)
{
	for (unsigned char i = 0; i < NXGRAPH_MAX_LINES; ++i)
	{
		PrevX[i] = 0;
		PrevY[i] = 0;
	}
}

inline float min(float a, float b)
{
      if (a < b)
            return a;
      return b;
}

inline float max(float a, float b)
{
      if (a > b)
            return a;
      return b;
}

void nxGraph::AddXY(unsigned char Line, float x, float y, bool visible)
{
     int py = (Top + Height - BOTTOM_SHIFT) - (y * ((Height - BOTTOM_SHIFT) / YScale));
     int px = Left + (int(x) % int(XScale)) * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT;

      if ((y < YMin + YScale) && (y > YMin) && visible)
      {


            if (PrevX[Line])
            {
                  if (py == PrevY[Line])
                        GUI_DrawHLine(py, PrevX[Line], px);
                  else
                  {
                        GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
                        GUI_DrawHLine(py, PrevX[Line], px);
                  }
            }
      }

      if (x >= XScale * (Period + 1))
            Redraw(NXGRAPH_REDRAW_ALL);
      else
            PrevX[Line] = px;

      PrevY[Line] = py;
}

void nxGraph::Redraw(unsigned char Mode)
{
	switch (Mode)
	{
		case NXGRAPH_REDRAW_ALL:
		{
			ClearLines();
			Period++;

			GUI_ClearRect(Left, Top - 5, Left + Width + 8, Top + Height); //5 ???
			
                  //draw axis
			GUI_DrawVLine(Left + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawVLine(Left + LEFT_SHIFT + 1, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawHLine(Top + Height - BOTTOM_SHIFT, Left + LEFT_SHIFT, Left + Width);
			GUI_DrawHLine(Top + Height - BOTTOM_SHIFT - 1, Left + LEFT_SHIFT, Left + Width);
			
                  //draw frame
			GUI_DrawVLine(Left + Width, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawHLine(Top, Left + LEFT_SHIFT, Left + Width);

                  GUI_SetFont(&GUI_Font6x8);
                  GUI_SetLineStyle(GUI_LS_DOT);

                  //draw vertical separators and labels on X-axis
                  for (float i = 0.0; i <= XScale; i += XStep)
                  {
                        //GUI_DrawVLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
                        GUI_DrawLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top + Height - BOTTOM_SHIFT);
                        GUI_GotoXY(int(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT - 8), int((Top + Height - BOTTOM_SHIFT) + 5));
                        GUI_DispDecSpace(int(i + (XScale *Period)), 3);
                  }

                  //draw horizontal separators and labels on Y-axis
                  for (float i = 0.0; i <= YScale; i+= YStep)
                  {
                        //GUI_DrawHLine((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + LEFT_SHIFT, Left + Width);
                        GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)));
                        GUI_GotoXY(int(Left), int((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)) - 5));
                        GUI_DispDecSpace(int(i), 5);
                  }

                  GUI_SetLineStyle(GUI_LS_SOLID);
			
			break;
		}
	}
}


nxGraph::~nxGraph()
{
}

#endif


#ifdef NXGRAPH_USE_V20090301

const GUI_POINT MarkerPoints[] = {{0, 0}, {4, -3}, {4, 3}};

nxGraph::nxGraph()
{
	Left = 0;
	Top = 100;
	Width = 290;
	Height = 130;
      Mode = GRAPH_LINES;
	XMin = 0.0;
	YMin = 0.0;
      Marker1 = 25.0;
      Marker2 = 70.0;
	XScale = 300.0; //5 min
	YScale = 100.0;	
	XStep = 60.0; //1 min
	YStep = 20.0;
	Period = -1;
	
	ClearLines();
}

void nxGraph::ClearLines(void)
{
	for (unsigned char i = 0; i < NXGRAPH_MAX_LINES; ++i)
	{
		PrevX[i] = 0;
		PrevY[i] = 0;
	}
}

inline float min(float a, float b)
{
      if (a < b)
            return a;
      return b;
}

inline float max(float a, float b)
{
      if (a > b)
            return a;
      return b;
}

void nxGraph::AddXY(unsigned char Line, float x, float y, bool visible)
{
     int py = (Top + Height - BOTTOM_SHIFT) - (y * ((Height - BOTTOM_SHIFT) / YScale));
     int px = Left + (int(x) % int(XScale)) * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT;

      if ((y < YMin + YScale) && (y >= YMin) && visible)
      {
            if (Mode == GRAPH_LINES)
            {
                  if (PrevX[Line])
                  {
                        if (py == PrevY[Line])
                              GUI_DrawHLine(py, min(PrevX[Line], px), max(PrevX[Line], px));
                        else
                        {
                              if (px == PrevX[Line])
                                    GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
                              else
                                    GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
                                    GUI_DrawHLine(py, min(PrevX[Line], px), max(PrevX[Line], px));
                        }
                  }
            }
            else
                  if (Mode == GRAPH_POINTS)
                  {
                        GUI_DrawPixel(px, py);
                  }
      }

      if (x >= XScale * (Period + 1))
            Redraw(NXGRAPH_REDRAW_ALL);
      else
            PrevX[Line] = px;

      PrevY[Line] = py;
}

void nxGraph::Redraw(unsigned char Mode)
{
	switch (Mode)
	{
		case NXGRAPH_REDRAW_ALL:
		{
			ClearLines();
			Period++;

			GUI_ClearRect(Left, Top - 5, Left + Width + 8, Top + Height); //5 ???
			
                  //draw axis
			GUI_DrawVLine(Left + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawVLine(Left + LEFT_SHIFT + 1, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawHLine(Top + Height - BOTTOM_SHIFT, Left + LEFT_SHIFT, Left + Width);
			GUI_DrawHLine(Top + Height - BOTTOM_SHIFT - 1, Left + LEFT_SHIFT, Left + Width);
			
                  //draw frame
			GUI_DrawVLine(Left + Width, Top, Top + Height - BOTTOM_SHIFT);
			GUI_DrawHLine(Top, Left + LEFT_SHIFT, Left + Width);

                  GUI_SetFont(&GUI_Font6x8);
                  GUI_SetLineStyle(GUI_LS_DOT);

                  //draw vertical separators and labels on X-axis
                  for (float i = 0.0; i <= XScale; i += XStep)
                  {
                        //GUI_DrawVLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
                        GUI_DrawLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top + Height - BOTTOM_SHIFT);
                        GUI_GotoXY(int(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT - 8), int((Top + Height - BOTTOM_SHIFT) + 5));
                        GUI_DispDecSpace(int(i + (XScale *Period)), 3);
                  }


                  //draw horizontal separators and labels on Y-axis
                  for (float i = 0.0; i <= YScale; i+= YStep)
                  {
                        //GUI_DrawHLine((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + LEFT_SHIFT, Left + Width);
                        GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)));
                        GUI_GotoXY(int(Left), int((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)) - 5));
                        if (YScale > 1.0)
                              GUI_DispDecSpace(int(i), 5); //for large-scale graphs
                        else
                              GUI_DispFloatMin(i, 3);       //for small-scale graphs
                  }

                  //draw markers

                  GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)));
                  GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)));
                  GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)));

                  GUI_SetLineStyle(GUI_LS_DASH);
                  GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)));
                  GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)));
                  GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)));
                  GUI_SetLineStyle(GUI_LS_SOLID);
			
			break;
		}
	}
}


nxGraph::~nxGraph()
{
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -