//---------------------------------------------------------------------------
#pragma hdrstop

#include "AVRFunctions.h"       // переменные для функций работы с чипами AVR
#include "PortFunctions.h"      // переменные для функций работы с портом
#include "LogFunctions.h"       // переменные для отправки сообщений в лог
#include "ChipFunctions.h"      // переменные для работы с чипом
#include "Main.h"               // переменные для работы с главной формой
//---------------------------------------------------------------------------
#pragma package(smart_init)
////////////////////////////////////////////////////////////
// В ЭТОМ МОДУЛЕ У НАС ФУНКЦИИ, ОДИНАКОВЫЕ ДЛЯ ВСЕХ ЧИПОВ //
////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//--- ПЕРЕВОД ЧИПА В РЕЖИМ ПРОГРАММИРОВАНИЯ КОМАНДОЙ PROGRAMMING ENABLE -----
//---------------------------------------------------------------------------
bool ProgrammingEnable()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных

  SendMsgToLog(18," execute Programming Enable without echo back reading.");    // сообщаем о попытке синхронизировать чип
  //--- устанавливаем высокий уровень на линии SS ---
  wr_buf.Size=1;
  wr_buf.Data[0]=0x48;                                    // SetSS_SPI
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x48");         // ошибка отправки команды
                         CloseHandle(Port);
                         Port=INVALID_HANDLE_VALUE;
                         return false;
                       }
  Sleep(Delays);//////////
  //--- устанавливаем низкий уровень на линии SS ---
  wr_buf.Size=1;
  wr_buf.Data[0]=0x47;                                    // ClearSS_SPI
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x47");         // ошибка отправки команды
                         CloseHandle(Port);
                         Port=INVALID_HANDLE_VALUE;
                         return false;
                       }
  //--- ждём минимум 20 мс ---
  Sleep(20);
  //--- загружаем и отправляем пакет с командой Programming Enable ---
  wr_buf.Size=5;
  wr_buf.Data[0]=0x44;                                    // LoadPaket_SPI
  wr_buf.Data[1]=0x00;                                    // начиная с младшего байта
  wr_buf.Data[2]=0x00;
  wr_buf.Data[3]=0x53;
  wr_buf.Data[4]=0xAC;                                    // и заканчивая старшим
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x44 0x00 0x00 0x53 0xAC");   // ошибка отправки команды
                         CloseHandle(Port);
                         Port=INVALID_HANDLE_VALUE;
                         return false;
                       }
  wr_buf.Size=1;
  wr_buf.Data[0]=0x46;                                  // StartChange_SPI
  if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x46");       // ошибка отправки команды
                         CloseHandle(Port);
                         Port=INVALID_HANDLE_VALUE;
                         return false;
                       }
  // не все чипы отсылают назад эхо, так что здесь больше ничего проверять не будем
  SendMsgToLog(19," with success.");                    // сообщаем, что синхронизация выполнена успешно
  return true;
}
//---------------------------------------------------------------------------
//--- ЧТЕНИЕ БАЙТОВ СИГНАТУРЫ -----------------------------------------------
//---------------------------------------------------------------------------
unsigned int ReadSignatureBytes()
{ WRITE_BUFFER wr_buf;          // буфер для отправки данных
  READ_BUFFER rd_buf;           // буфер для приёма данных
  unsigned int ChipID, Temp;    // ответ функции

  SendMsgToLog(18," read signature bytes");     // сообщаем о попытке прочитать байты сигнатуры
  ChipID = 0;                                   // обнуляем ответ
  //--- загружаем и отправляем пакет с командой Read Signature Byte ---
  for(unsigned char i=0;i<3;i++)
  {     wr_buf.Size=5;
        wr_buf.Data[0]=0x44;                                 // LoadPaket_SPI
        wr_buf.Data[1]=0x0;
        wr_buf.Data[2]=i;                                    // номер байта сигнатуры
        wr_buf.Data[3]=0x0;
        wr_buf.Data[4]=0x30;                                 // команда Read Signature Byte
        if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x44 0x00 i 0x00 0x30");   // ошибка отправки команды
                               CloseHandle(Port);
                               Port=INVALID_HANDLE_VALUE;
                               return 0;
                             }
        wr_buf.Size=1;
        wr_buf.Data[0]=0x46;                                  // StartChange_SPI
        if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x46");       // ошибка отправки команды
                               CloseHandle(Port);
                                           Port=INVALID_HANDLE_VALUE;
                               return 0;
                             }
        //--- Читаем SPI - буфер (там в четвёртом байте должен быть прочитанный байт сигнатуры) ---
        wr_buf.Size=1;
        wr_buf.Data[0]=0x45;                                  // ReadPaketSPI
        if(!WriteTo(wr_buf)) { SendMsgToLog(6," 0x45");       // ошибка отправки команды
                         CloseHandle(Port);
                         Port=INVALID_HANDLE_VALUE;
                         return 0;
                       }
        // принимаем байт, содержащий SPI - буфер
        rd_buf=ReadFrom(8);                                   // читаем
        if(!rd_buf.Size) { SendMsgToLog(7," (SPI paket)");    // ошибка приёма пакета
                           CloseHandle(Port);
                           Port=INVALID_HANDLE_VALUE;
                           return 0;
                         }
        //--- вычисляем ID чипа
        Temp = rd_buf.Data[0];
        ChipID += (Temp << (8*i));
  }
  SendMsgToLog(19,"");            // чтение байтов сигнатуры завершено
  return ChipID;
}
//---------------------------------------------------------------------------
