/* (C) D L BIRD
   Эта функция построит график на ePaper / TFT / LCD дисплее, используя данные из массива,
   содержащего данные для отображения на графике.
Переменная 'max_readings' определяет максимальное количество элементов данных для каждого массива.
Вызовите его со следующими параметрическими данными:
x_pos - положение оси x в верхнем левом углу графика
y_pos - верхнее левое положение графика по оси y, например, 100, 200 будет отображать график на 100 пикселей
вдоль и на 200 пикселей вниз от верхнего левого края экрана
gwidth - ширина графика в пикселях
height - высота графика в пикселях
Y1_Max - устанавливает масштаб отображаемых данных, например, 5000 будет масштабировать все данные
по оси Y максимум на 5000
data_array1 анализируется по значению, внешне они могут называться как угодно иначе, например,
внутри процедуры это называется data_array1, но внешне может быть temperature_readings
auto_scale - логическое значение (TRUE или FALSE), которое включает или выключает автоматическое
масштабирование по оси Y
barchart_on - логическое значение (TRUE или FALSE), которое переключает режим рисования
между barhcart и линейным графиком
barchart_colour -задает цвет заголовка и построения графика
Если вызывается со значением Y!_Max равным 500 и данные никогда не превышают 500, то автомасштабирование 
сохранит масштаб 0-500 Y, если включено, масштаб увеличивается / уменьшается в соответствии с данными.
auto_scale_margin, например, если установлено значение 1000, то автоматическое масштабирование
увеличивает масштаб на 1000 шагов.
*/
void DrawGraph(int x_pos, int y_pos, int gwidth, int gheight, float Y1Min, float Y1Max, String title, float DataArray[], int readings, boolean auto_scale, boolean barchart_mode) {
#define auto_scale_margin 0 // Устанавливает автоматическое увеличение масштаба, так что ось увеличивается после изменения, например, на 3
#define y_minor_axis 5      // 5 y-axis division markers маркеры деления по оси y
  display.setFont();
  int maxYscale = -10000;
  int minYscale =  10000;
  int last_x, last_y;
  float x2, y2;
//   Serial.print("readings=");
 // Serial.println(readings);
 // for (int gx = 0; gx < readings; gx++) {
 //    Serial.print("gx=");
 // Serial.println(DataArray[gx]);
 // }
  if (auto_scale == true) {
    for (int i = 1; i < readings; i++ ) {
      if (DataArray[i] >= maxYscale) maxYscale = DataArray[i];
      if (DataArray[i] <= minYscale) minYscale = DataArray[i];
    }
    
    maxYscale = round(maxYscale + auto_scale_margin); // Auto scale the graph and round to the nearest value defined, default was Y1Max
    Y1Max = round(maxYscale + 0.5);
    if (minYscale != 0) minYscale = round(minYscale - auto_scale_margin); // Auto scale the graph and round to the nearest value defined, default was Y1Min
    Y1Min = round(minYscale);
  }
  // Draw the graph
  last_x = x_pos + 1;
  last_y = y_pos + (Y1Max - constrain(DataArray[1], Y1Min, Y1Max)) / (Y1Max - Y1Min) * gheight;
  display.drawRect(x_pos, y_pos, gwidth + 3, gheight + 2, GxEPD_BLACK);
  drawString(x_pos - 40 + gwidth / 2, y_pos - 10, title, CENTER);

  for (int gx = 0; gx < readings; gx++) {
    x2 = x_pos + gx * gwidth / (readings - 1) - 1 ; // max_readings is the global variable that sets the maximum data that can be plotted

    y2 = y_pos + (Y1Max - constrain(DataArray[gx], Y1Min, Y1Max)) / (Y1Max - Y1Min) * gheight + 1;
    
    if (barchart_mode) {
      display.fillRect(last_x + 2, y2, (gwidth / readings) - 1, y_pos + gheight - y2 + 2, GxEPD_BLACK);
    } else {
      display.drawLine(last_x, last_y - 1, x2, y2 - 1, GxEPD_BLACK); // Two lines for hi-res display
      display.drawLine(last_x, last_y, x2, y2, GxEPD_BLACK);
    }
    last_x = x2;
    last_y = y2;
  }
  //Draw the Y-axis scale
#define number_of_dashes 20
  for (int spacing = 0; spacing <= y_minor_axis; spacing++) {
  
    for (int j = 0; j < number_of_dashes; j++) { //  пунктирные линии сетки графика
      if (spacing < y_minor_axis) display.drawFastHLine((x_pos + 3 + j * gwidth / number_of_dashes), y_pos + (gheight * spacing / y_minor_axis), gwidth / (2 * number_of_dashes), GxEPD_BLACK);
    }
    if ((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing) < 5 ) {
      drawString(x_pos - 20, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 1), RIGHT);
    }
    else
    {
      if (Y1Min < 1 && Y1Max < 10) {
        drawString(x_pos - 3-6, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 1), RIGHT);
      }
      else {
        if (Y1Min >99  && Y1Max < 9999)
        {drawString(x_pos - 20, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 0), RIGHT);
        }
        else
        {
         drawString(x_pos - 7-10, y_pos + gheight * spacing / y_minor_axis - 5, String((Y1Max - (float)(Y1Max - Y1Min) / y_minor_axis * spacing + 0.01), 0), RIGHT); 
        }
      }
    }
  }
  for (int i = 0; i < 3; i++) {
    drawString(28 + x_pos + gwidth / 3 * i, y_pos + gheight + 5, String(i) + "d", LEFT);//день1,2,3
    if (i < 2) display.drawFastVLine(x_pos + gwidth / 3 * i + gwidth / 3, y_pos, gheight, GxEPD_BLACK);
  }
}
//**********************************************************************************************************
