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

//Файл определений

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

#ifndef DEFS_H
#define DEFS_H

//------------------------------- gpio.hpp -----------------------------------

enum PinMode_t
{
  OFF = 0,
  ON  = 1
};

//----------------------------- keyboard.hpp ---------------------------------

enum KeyCode_t //коды кнопок
{
  KEY_NO,     //нет нажатия
  KEY_REC,    //запись
  KEY_STOP,   //стоп
  KEY_PLAYF,  //воспроизведение вперед
  KEY_FFD,    //перемотка вперед
  KEY_REW,    //перемотка назад
  KEY_PLAYR,  //воспроизведение назад
  KEY_PAUSE,  //пауза
  KEY_ROLL,   //откат
  KEY_UNROLL, //выключение отката
  KEY_PLAY,   //воспроизведение (RC only)
  KEY_REV,    //реверс (RC only)
  NC = KEY_NO //краткий синоним для KEY_NO
};

enum KeyMsg_t //коды сообщений клавиатуры
{
  MSG_NO,     //нет нажатия
  MSG_PRESS,  //нажатие кнопки
  MSG_REL,    //отпускание кнопки
  MSG_HOLD,   //удержание кнопки
  MSG_LONG    //длительное удержание кнопки
};

//------------------------------- leds.hpp -----------------------------------

//Маски светодиодов:

enum LedMask_t
{
  LED_NONE  = 0,
  LED_REC   = 1 << 0,
  LED_STOP  = 1 << 1,
  LED_PLAYF = 1 << 2,
  LED_FFD   = 1 << 3,
  LED_REW   = 1 << 4,
  LED_PLAYR = 1 << 5,
  LED_PAUSE = 1 << 6,
  LED_ALL   = 0xFF
};

//Режимы светодиодов:

enum LedMode_t
{
  LEDS_CONT, //непрерывное горение
  LEDS_SLOW, //медленное мигание
  LEDS_NORM, //нормальное мигание
  LEDS_FAST, //быстрое мигание
  LEDS_OFF,  //выключение
  LEDS_MODES = LEDS_OFF
};

typedef struct
{
  uint8_t cont; //непрерывно горящие светодиоды
  uint8_t slow; //медленно мигабщие светодиоды
  uint8_t norm; //нормально мигабщие светодиоды
  uint8_t fast; //быстро мигабщие светодиоды
} leds_t;

//------------------------------- spool.hpp ----------------------------------

static int32_t const TEN_MAX = UINT16_MAX; //макс. значение кода натяжения
static uint16_t const T_UNITS = 1000; //дискретность задания натяжения 0.1%

enum SpoolMode_t //режимы подмотки
{
  SPOOL_OFF,
  SPOOL_BRAKE,
  SPOOL_PLAYF,
  SPOOL_PLAYR,
  SPOOL_FFD,
  SPOOL_REW,
  SPOOL_AFFD,
  SPOOL_AREW,
  SPOOL_MODES,
  //дополнительные режимы:
  SPOOL_FORCEF,
  SPOOL_FORCER
};

typedef struct //коэффициенты PID
{
  uint8_t p;
  uint8_t i;
  uint8_t d;
} kpid_t;

typedef struct //набор натяжений для двигателей M1 и M2
{
  uint16_t m1;
  uint16_t m2;
} ten_t;

//------------------------------ capstan.hpp ---------------------------------

enum CapDir_t
{
  CAP_FWD = 0,
  CAP_REV = 1
};

//----------------------------- movesensor.hpp -------------------------------

enum MoveSpeed_t
{
  MOVE_FAST = 0,
  MOVE_SLOW = 1
};

//------------------------------- audio.hpp ----------------------------------

enum AudioState_t
{
  AUD_MUTE = 1 << 0,
  AUD_REV  = 1 << 1,
  AUD_REC  = 1 << 2
};

//----------------------------- transport.hpp --------------------------------

enum TransportMode_t
{
  TR_STOP,  //стоп с торможением двигателями
  TR_PLAYF, //воспроизведение вперед
  TR_PLAYR, //воспроизведение назад
  TR_REC,   //запись (то же воспр. вперед, но с сигналом REC)
  TR_PAUSE, //пауза (тот же стоп, только без MUTE)
  TR_FFD,   //перемотка вперед
  TR_REW,   //перемотка назад
  TR_AFFD,  //архивная перемотка вперед
  TR_AREW,  //архивная перемотка назад

  //внутренние коды:
  TR_ASTOP, //стоп с механическим торможением
  TR_FFFD,  //быстрый переход из AFFD в FFD
  TR_FREW,  //быстрый переход из AREW в REW
  TR_CAPF,  //включение прямого вращения тонвала
  TR_CAPR,  //включение реверсного вращения тонвала
  TR_NONE   //неопределенное состояние
};

enum TransportState_t
{
  TRS_CAP   = 1 << 0, //capstan вращается
  TRS_REV   = 1 << 1, //capstan в режиме реверс
  TRS_LOCK  = 1 << 2, //capstan разогнался
  TRS_BRAKE = 1 << 3, //торможение двигателями
  TRS_TAPE  = 1 << 4, //лента загружена
  TRS_MOVE  = 1 << 5, //лента движется
  TRS_CUE   = 1 << 6  //режим обзора
};

enum CapMode_t
{
  CAP_START   = 1 << 0, //capstan start bit
  CAP_REVERSE = 1 << 1  //capstan reverse bit
};

enum Solenoids_t
{
  SOL_BRAKE = 1 << 0, //brake solenoid bit
  SOL_PRESS = 1 << 1, //press solenoid bit
  SOL_LIFT  = 1 << 2  //lift solenoid bit
};

enum SateBits_t
{
  STB_BRAKE = 1 << 0, //brake solenoid bit
  STB_PRESS = 1 << 1, //press solenoid bit
  STB_LIFT  = 1 << 2, //lift solenoid bit
  STB_MOVE  = 1 << 3, //tape move bit
  STB_TAPE  = 1 << 4, //tape load bit
  STB_RUN   = 1 << 5, //capstan start bit
  STB_REV   = 1 << 6, //capstan reverse bit
  STB_READY = 1 << 7  //capstan ready bit
};

enum tr_opt_t               //опции
{
  OPT_BRKASENABLE = 1 << 0, //разрешение автостопа при торможении
  OPT_PREASENABLE = 1 << 1, //разрешение автостопа по пред. натяжению
  OPT_TENASENABLE = 1 << 2, //разрешение автостопа по натяжению
  OPT_MOVASENABLE = 1 << 3, //разрешение автостопа по ДД
  OPT_MOTORBRK    = 1 << 4  //торможение двигателями
};

//----------------------------- control.hpp ----------------------------------

enum ct_opt_t                 //опции
{
  OPT_PAUSELEDBLINK = 1 << 0,  //мигание светодиодапаузы, иначе - горит
  OPT_AUTORECPAUSE  = 1 << 1,  //автоматическое вкл. паузы при вкл. записи
  OPT_SHOWDIR       = 1 << 2,  //разрешение индикации направления capstan
  OPT_USEARCHIVE    = 1 << 3,  //использовать архивную перемотку
  OPT_ROLLCUE       = 1 << 4,  //при откате включен обзор (и выключен Mute)
  OPT_ENABLECUE     = 1 << 5,  //разреш. обзора кнопкой Roll при арх. перем.
  OPT_NOSOUND       = 1 << 6,  //запрещение генерации звуковых сигналов
  OPT_AUTOREVERSE   = 1 << 7,  //включение режима автореверса
  OPT_ENABLEPROG    = 1 << 8,  //разрешение программирования режимов
  OPT_PROGBLINK     = 1 << 9,  //прогрммный режим мигает, иначе горит
  OPT_MUTEPAUSE     = 1 << 10, //разрешение mute в паузе
  OPT_PLAYRECEN     = 1 << 11, //разрешение включения Rec в режиме Play
  OPT_RECPLAYEN     = 1 << 12, //разрешение включения Play в режиме Rec
  OPT_PLAYEXPAUSE   = 1 << 13  //Play выключает Pause
};

//-------------------------------- State: ------------------------------------

typedef struct
{
  leds_t leds;
  int b;
  int a;
  int s;
  int t1;
  int t2;
  int e1;
  int e2;
  int m1;
  int m2;
  int r1;
  int r2;
} state_t;

//-------------------------------- Params: -----------------------------------

typedef struct
{
  int kp1;
  int ki1;
  int kd1;
  int kp2;
  int ki2;
  int kd2;
  int CapStart;
  int EndTau;
  int EmForce;
  int AsBrkDel;
  int AsPreDel;
  int AsTenDel;
  int TrOptions;
  int CtOptions;
} params_t;

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

#endif
