//----------------------------------------------------------------------------

//Класс поддержки порта, заголовочный файл

//----------------------------------------------------------------------------

#ifndef PORT_HPP
#define PORT_HPP

//----------------------------------------------------------------------------

#include "wakeport.hpp"

//----------------------------------------------------------------------------
//------------------------------ Класс TPort ---------------------------------
//----------------------------------------------------------------------------

class TPort
{
private:
  static uint32_t const BAUD_RATE = 115200; //скорость обмена, бод
  static uint8_t const FRAME_SIZE = 128; //максимальный размер фрейма, байт
  uint8_t Command;
public:
  TWakePort *WakePort;
  TPort(void);
  void Execute(void);
};

//----------------------------------------------------------------------------
//----------------------- Коды специальных команд: ---------------------------
//----------------------------------------------------------------------------

//TX - данные, которые передает PC
//RX - данные, которые принимает PC

enum
{
  CMD_STD_LAST = CMD_GETADDR,

  CMD_SET_PRESET, //установка номера пресета
  //TX: byte Preset
  //RX: NONE
  //Preset = 0..3 - номер пресета для установки

  CMD_GET_PRESET, //чтение номера пресета
  //TX: NONE
  //RX: byte Preset
  //см. CMD_SET_PRESET

  CMD_SET_MODE,   //установка режима отображения
  //TX: byte DispMode
  //RX: NONE
  //DispMode.0 - отображение столбиков (DP_BAR)
  //DispMode.1 - отображение пиков (DP_PEAK)
  //DispMode.2 - отображение макс. столбиков (DP_BARMAX)
  //DispMode.3 - отображение макс. пиков (DP_PEAKMAX)
  //DispMode.4 - отображение статистики (DP_ABSMAX)

  CMD_GET_MODE,   //чтение режима отображения
  //TX: NONE
  //RX: byte DispMode
  //см. CMD_SET_MODE

  CMD_GET_METER,  //чтение показаний
  //TX: NONE
  //RX: (word BarL, word BarR), (word PeakL, word PeakR),
  //    (word BarMaxL, word BarMaxR), (word GetPeakMaxL, word GetPeakMaxR)
  //Указанные пары слов передаютя в том случае, если DispMode
  //содержит DP_BAR, DP_PEAK, DP_BARMAX, DP_PEAKMAX соответственно.
  //Каждое из слов результата - код измеренного значения 0..LEVEL_LIM

  CMD_RES_STAT,   //сброс статистики
  //TX: NONE
  //RX: NONE
  //Команда обнуляет аккумулятор абсолютных максимумов.

  CMD_SET_PARAMS, //установка параметров
  //TX: word Integ1_t, word Decay1_t, word Scale1_f, word Resp1_t,
  //    word Fall1_t, word Hold1_t, word MFall1_t, word MHold1_t,
  //    word Integ2_t, word Decay2_t, word Scale2_f, word Resp2_t,
  //    word Fall2_t, word Hold2_t, word MFall2_t, word MHold2_t
  //RX: NONE
  //Integ1_t = 0..27000 *0.1 ms (0.0..2700.0 ms) - время интеграции (Bar)
  //Decay1_t = 0..65000 ms - время спада (Bar)
  //Scale1_f = 0..32000 *0.001 (0.000..32.000) - шкала (Bar)
  //Resp1_t  = 0..65000 ms - время срабатывания (Bar)
  //Fall1_t  = 0..65000 ms - время обратного хода (Bar)
  //Hold1_t  = 0..65000 ms - время удержания (Bar)
  //MFall1_t = 0..65000 ms - время обратного хода максимумов (Bar)
  //MHold1_t = 0..65000 ms - время удержания максимумов (Bar)
  //Integ2_t = 0..27000 *0.1 ms (0.0..2700.0 ms) - время интеграции (Peak)
  //Decay2_t = 0..65000 ms - время спада (Peak)
  //Scale2_f = 0..32000 *0.001 (0.000..32.000) - шкала (Peak)
  //Resp2_t  = 0..65000 ms - время срабатывания (Peak)
  //Fall2_t  = 0..65000 ms - время обратного хода (Peak)
  //Hold2_t  = 0..65000 ms - время удержания (Peak)
  //MFall2_t = 0..65000 ms - время обратного хода максимумов (Peak)
  //MHold2_t = 0..65000 ms - время удержания максимумов (Peak)

  CMD_GET_PARAMS, //чтение параметров
  //см. CMD_SET_PARAMS

  CMD_SET_TABLE,  //загрузка таблицы
  //TX: word DB[0], word DB[1] .. DB[49]
  //RX: NONE
  //DB[n] = -9900..+9900 *0.01 dB (-99.00..+99.00 dB)
  //Таблица должна быть монотонной. Максимальная разница между
  //значениями не должна превышать 80 dB. Все более низкие значения
  //считаются минус бесконечностью.

  CMD_GET_TABLE,  //чтение таблицы
  //TX: NONE
  //RX: word DB[0], word DB[1] .. DB[49]
  //см. CMD_SET_TABLE

  CMD_SET_LEDS,   //управление светодиодами
  //TX: byte BrMode, byte BrMeter, byte BrScale, word Leds
  //RX: NONE
  //BrMode = BRM_OFF - регулировка яркости выключена (минимальная яркость)
  //BrMode = BRM_VR - регулировка яркости подстроечными резисторами
  //BrMode = BRM_DAC - регулировка яркости с помощью ЦАП
  //BrMode = BRM_PWM - регулировка яркости с помощью ШИМ
  //BrMeter = 0..100% - яркость линеек
  //BrScale = 0..100% - яркость шкалы
  //Leds.0  - светодиод TR0
  //Leds.1  - светодиод TR1
  //Leds.2  - светодиод TR2
  //Leds.3  - светодиод TR3
  //Leds.4  - светодиод TR4
  //Leds.5  - светодиод TR5
  //Leds.6  - светодиод TR6
  //Leds.7  - светодиод TR7
  //Leds.8  - светодиод TR8
  //Leds.9  - светодиод TR9
  //Leds.10 - подсветка шкалы

  CMD_GET_LEDS,   //чтение состояния светодиодов
  //TX: NONE
  //RX: byte BrMode, byte BrMeter, byte BrScale, word Leds
  //см. CMD_SET_LEDS

  CMD_EE_SAVE,    //сохранение параметров в EEPROM
  //TX: NONE
  //RX: NONE
  //Команда делает сохранение текущего пресета в EEPROM.
  //Время выполнения этой команды зависит от количество изменяемых
  //данных в EEPROM и времени записи. В худшем случае время может
  //достигать 1800 мс.

  CMD_DEFAULT,     //загрузка параметров по умолчанию
  //TX: NONE
  //RX: NONE
  //Команда загружает для текущего пресета параметры по умолчанию.
  //Сохранение их в EEPROM не производится.

  CMD_TEST         //тестовая команда
  //TX: NONE
  //RX: dword v
  //v - отладочное значение
};

//----------------------------------------------------------------------------

#endif
