#define MAXCOLORTC
#include "wingraph.h"

const int cc = RGB (197, 203, 201); // разные цвета
const int ca = RGB (196, 244, 203);
const int cb = RGB (255, 248, 127);
const int cw = RGB (255, 255, 255);

struct LongMsg
{
  int w;
  int boilerNumber;
};

void B () // функция для пункта заготовления топлива
{
  int w, x;
  unsigned long s, foo;
  LongMsg m;
  // канал для информирования пункта заготовления топлива энергоблоками о том, что
  // какой-то энергоблок пустой
  HANDLE BoilerProviderChan = CreateFile ("\\\\.\\pipe\\BPChan",
    GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  // канал для обмена информацией между пунктом заготовления топлива и транспортнвм средством
  HANDLE ProviderTransporterChan = CreateFile ("\\\\.\\pipe\\PTChan",
    GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

  randomize ();
  delay(1500);
  WriteFile (ProviderTransporterChan, &m, sizeof m, &s, 0); // начальное информирование транспортного
  if (s == 0)                            // средства начать движение
    ExitProcess(0);
  while (1)
  {
    w = random (7) + 4; // 4..10 - вес топлива определяем случайным образом
    for (int i = 0; i < w; i++) // размещаем все топливо в пункте
    {                                // заготовления топлива
      setfillstyle (1, ca);
      bar (40, 85 + i * 20, 99, 85 + i * 20 + 19);
      delay (250);
    }
    ReadFile (ProviderTransporterChan, &foo, 4, &s, 0); // ждем готовность транспортного средства
    if (s == 0)
      break;
    int boilerNumber;                    // номер котла
    // ждем информирования от одного из котлов, что он пуст
    ReadFile (BoilerProviderChan, &boilerNumber, 4, &s, 0);
    for (int i = w - 1; i >= 0; i--) // заливаем топливо в транспортное средство
    {
      setfillstyle (1, cw);
      bar (40, 85 + i * 20, 99, 85 + i * 20 + 19);
      delay (100);
    }
    m.w = w; // вес топлива
    m.boilerNumber = boilerNumber; // номер энергоблока, в который нужно везти топливо
    WriteFile (ProviderTransporterChan, &m, sizeof m, &s, 0);// отправляем транспортному средству
    if (s == 0)               // информируем транспортное средство, что закончили заливать в него топливо
      break;
  }
  ExitProcess(0);
}

void mainx ()
{
  resize (520, 320);
  outtextxy(230, 10, "e-station");
  setfillstyle (1, cc);
  bar (40, 80, 99, 83);
  B();
}
