//---------------------------------------------------------------------------
// Функции для работы с чипами DS2405
//---------------------------------------------------------------------------
#pragma hdrstop
#include "DS2405.h"
#include "ProgressBar.h"        // для использования прогресс-бара
#include "MainProgram.h"        // для работы с формой
#include "ChipFunctions.h"      // переменные для работы с памятью чипа
#include "PortFunctions.h"      // для работы с портом
#include "SendMsgFunctions.h"   // для отправки сообщений в лог
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//--- ЧТЕНИЕ ТЕКУЩЕГО СОСТОЯНИЯ PIO (байт после Search ROM 0xF0) ------------
//---------------------------------------------------------------------------
// output:      Test - байт, принятый после отправки всех данных (0xFF) + Success
DS2405_OUTPUT_DATA DS2405_ReadState()
{ WRITE_BUFFER wr_buf;                  // буфер для отправки данных
  READ_BUFFER rd_buf;                   // буфер для приёма данных
  DS2405_OUTPUT_DATA OutputData;       // результат выполнения команды
  unsigned int CurrentByte, CurrentBit; // текущие передаваемый байт и бит

  OutputData.Test=0x55;
  OutputData.Success=false;             // инициализируем результаты нулями

  // включаем прогресс-бар
  Application->CreateForm(__classid(TLBar),&LBar);      // создаём форму с прогресс-баром
  LBar->Show();                                         // показываем её в немодальном окне

  // посылаем Reset
  wr_buf.Size=1;
  wr_buf.Data[0]=0x60;
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();            // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // посылаем Search ROM
  wr_buf.Size=2;
  wr_buf.Data[0]=0x61;                                  // SendByte_1W
  wr_buf.Data[1]=0xF0;                                  // Search ROM
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();            // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // читаем 2 бита, посылаем бит ROM (и так 64 раза)
  for(unsigned int i=0; i<64; i++)                       // перебираем все биты ROM
  {   CurrentByte=i/8; CurrentBit=i-8*CurrentByte;
      //читаем с шины первый бит
      wr_buf.Size=1;
      wr_buf.Data[0]=0x64; // команда чтения бита
      if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");// ошибка загрузки пакета
                             LBar->Free();        // уничтожаем форму с прогресс-баром
                             ClosePort();
                             return OutputData;
                           }
      Sleep(1);
      //принимаем пакет
      rd_buf=ReadFrom();
      if(!rd_buf.Size){ SendMsgToLogForm(11,"");// ошибка загрузки пакета
                        LBar->Free();        // уничтожаем форму с прогресс-баром
                        ClosePort();
                        return OutputData;
                      }
      //читаем с шины второй бит
      wr_buf.Size=1;
      wr_buf.Data[0]=0x64; // команда чтения бита
      if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");// ошибка загрузки пакета
                             LBar->Free();        // уничтожаем форму с прогресс-баром
                             ClosePort();
                             return OutputData;
                           }
      Sleep(1);
      //принимаем пакет
      rd_buf=ReadFrom();
      if(!rd_buf.Size){ SendMsgToLogForm(11,"");// ошибка загрузки пакета
                        LBar->Free();        // уничтожаем форму с прогресс-баром
                        ClosePort();
                        return OutputData;
                      }
      //отправляем бит в шину
      wr_buf.Size=2;
      wr_buf.Data[0]=0x63;
      wr_buf.Data[1]=SelectedChip.ROM[CurrentByte]>>CurrentBit; // берём нужный байт ROM и сдвигаем передаваемый бит в младшую позицию
      if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");              // ошибка загрузки пакета
                             LBar->Free();                      // уничтожаем форму с прогресс-баром
                             ClosePort();
                             return OutputData;
                           }
      Sleep(1);
  }
  // посылаем команду чтения байта
  wr_buf.Size=1;
  wr_buf.Data[0]=0x62;                                // ReadByte_1W
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();          // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // читаем очередной байт
  rd_buf=ReadFrom();                              // читаем
  if(!rd_buf.Size) { SendMsgToLogForm(21,"");          // ошибка приёма пакета
                     LBar->Free();                    // уничтожаем форму с прогресс-баром
                     ClosePort();
                     return OutputData;
                   }
  OutputData.Test=rd_buf.Data[0];               // сохраняем прочитанный байт (текущее состояние 0x0 или 0xFF)
  // посылаем Reset когда всё записали
  wr_buf.Size=1;
  wr_buf.Data[0]=0x60;
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();            // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  LBar->Free();                                         // уничтожаем форму с прогресс-баром
  OutputData.Success=true;
  return OutputData;          // посылаем принятый ранее Test в качестве ответа
}
//---------------------------------------------------------------------------
//--- ПЕРЕКЛЮЧЕНИЕ СОСТОЯНИЯ PIO (Match ROM 0x55) ---------------------------
//---------------------------------------------------------------------------
// output:      Test + Success
DS2405_OUTPUT_DATA DS2405_ToggleState()
{ WRITE_BUFFER wr_buf;                  // буфер для отправки данных
  READ_BUFFER rd_buf;                   // буфер для приёма данных
  DS2405_OUTPUT_DATA OutputData;        // здесь формируем ответ

  OutputData.Test=0x55;
  OutputData.Success=false;             // инициализируем ответ

  // включаем прогресс-бар
  Application->CreateForm(__classid(TLBar),&LBar);      // создаём форму с прогресс-баром
  LBar->Show();                                         // показываем её в немодальном окне

  // посылаем Reset
  wr_buf.Size=1;
  wr_buf.Data[0]=0x60;
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();            // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // посылаем Match ROM
  wr_buf.Size=2;
  wr_buf.Data[0]=0x61;                                  // SendByte_1W
  wr_buf.Data[1]=0x55;                                  // Match ROM
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();            // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // посылаем 8 байт ROM-адреса
  for(unsigned int i=0; i<8; i++)                       // перебираем все слова
  { wr_buf.Size=2;
    wr_buf.Data[0]=0x61;                                // SendByte_1W
    wr_buf.Data[1]=SelectedChip.ROM[i];                 // ROM Bytes
    if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                           LBar->Free();          // уничтожаем форму с прогресс-баром
                           ClosePort();
                           return OutputData;
                         }
    Sleep(1);
  }
  // посылаем команду чтения байта
  wr_buf.Size=1;
  wr_buf.Data[0]=0x62;                                // ReadByte_1W
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();          // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  // читаем очередной байт
  rd_buf=ReadFrom();                              // читаем
  if(!rd_buf.Size) { SendMsgToLogForm(21,"");          // ошибка приёма пакета
                     LBar->Free();                    // уничтожаем форму с прогресс-баром
                     ClosePort();
                     return OutputData;
                   }
  OutputData.Test=rd_buf.Data[0];               // сохраняем прочитанный байт (текущее состояние 0x0 или 0xFF)
  // посылаем Reset когда всё прочитали
  wr_buf.Size=1;
  wr_buf.Data[0]=0x60;
  if(!WriteTo(wr_buf)) { SendMsgToLogForm(11,"");          // ошибка загрузки пакета
                         LBar->Free();                  // уничтожаем форму с прогресс-баром
                         ClosePort();
                         return OutputData;
                       }
  Sleep(1);
  LBar->Free();                                         // уничтожаем форму с прогресс-баром
  OutputData.Success=true;
  return OutputData;
}
//---------------------------------------------------------------------------
