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

//Project:  Level Meter
//Compiler: IAR EWARM 6.50
//Target:   STM32F100C8T6B

//Linker extra options: --basic_heap
//Stack size: 0x400
//Heap size: 0xFFF

//------------------------- Описание программы: ------------------------------

//Измеритель уровня использует цифровую обработку сигнала. Сигнал звуковой
//частоты левого и правого каналов подается через схему сдвига уровня на входы
//встроенного АЦП микроконтроллера. Чтобы исключить необходимость anti-alias
//фильтра, частота дискретизации выбрана сравнительно большой (96 кГц). Это
//также способствует более точному измерению пикового уровня. Каждый из каналов
//измерителя имеет две независимых ветки обработки, каждая из которых может
//производить измерение среднего, квазипикового или пикового уровня. Результат
//измерения первой ветки выводится в виде светящихся столбиков, второй ветки -
//в виде светящихся точек. Каждая из веток имеет возможность удержания
//максимальных значений с индикацией в виде точек. Вывод показаний производится
//на светодиодный дисплей, собранный из матриц в виде линеек светодиодов.
//Для снижения уровня помех используется статическое управление светодиодами,
//которые подключены к выходам цепочки регистров 74HC595. Дополнительно имеются
//светодиоды подсветки шкалы и светодиоды трафаретов, которые могут выводить
//любую дополнительную информацию (например, режим работы). Яркость линеек
//и светодиодов подсветки регулируется индивидуально. Как опция, в качестве
//устройств индикации могут быть подключены стрелочные приборы, для этого
//задействуются встроенные в микроконтроллер ЦАП. Программирование всех
//параметров измерителя уровня производится из сервисной программы по USB
//через переходник USB-UART. По этому же интерфейсу производится и прошивка
//микроконтроллера. Если измеритель встраивается в какой-то аппарат, то имеется
//возможность управления его режимами работы через интерфейс RS-485.

//----------------------- Структура программы: -------------------------------
//
//                              [main]
//                                 |
//     |------------|----------|------------------------|
// [systimer]    [gpio]    [control]                  [port]
//                             |                        |
//     |---------|--------|-----------|             [wakeport]
// [process] [display] [bright]   [eeprom]              |
//     |         |        |           |               [wake]
//   [adc]     [sreg]   [dac]    |-------|--------|
//                            [i2csw] [eemap] [presets]

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

#include "main.hpp"
#include "control.hpp"
#include "port.hpp"

//----------------------------- Переменные: ----------------------------------

TControl *Control;
TPort *Port;
uint8_t *Addr; //TODO: memory profiling

//----------------------------------------------------------------------------
//------------------------- Основная программа: ------------------------------
//----------------------------------------------------------------------------

int main(void)
{
  TSysTimer::Init();        //инициализация системного таймера
  Control = new TControl(); //создание объекта управления
  Port = new TPort();       //создание объекта порта

  do                        //основной цикл
  {
    TSysTimer::Sync();      //синхронизация системных тиков с основным циклом
    Control->Execute();     //выполнение местного управления
    Port->Execute();        //выполнение команд компьютера
  }
  while(1);
}

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