#ifndef K_DESCRIPTION_H
#define K_DESCRIPTION_H

namespace KD {

enum Sections {
	Startup,
	Spectrometer,
	Switch,
	Formats,
	Logs,
	Detector,
	CoreOutput,
};

enum LogFormat {
	Text, //b text
	Binary, //b binary
};

enum LogType {
	Data, //b write data logs
	Spec, //b write spectrogram logs
	ARINC, //b ARINC
};

enum KLogConfig {
	// LogFormat = Formats
	StartupWrite, //b
	ApplyBinaryLogHeader, //b Apply settings under ID = 255 for binary log
	MaximumWriteFrequency, //f Maximum frequency for log in Hz, or 0 for unlimited
};

enum SwitchType {
	BaySpec,
	DiCon,
};

enum SpectrometerConnection {
	TCP,
	USB,
};

enum PeakSearchMode {
	Left,
	Max,
	Right,
};

enum CoreMode {
	ModeSpectrometer,
	ModePlayer,
	ModePeaks,
};

enum KSpectrometer {
	Connection, //e ${SpectrometerConnection}
	Temperature_compensation, //b Use temperature sensor or default temperature witout compensation
	Temperature_default, //f Default temperature using if compensation disabled
};

enum KSwitch {
	Enabled, //b 0 or 1 Use optical switch or not
	Wait, //n Delay after switching channel, ms
	Autoscan, //e {0 - scan with our forces, 1 - SDK autoscan}
	Autoscan_offset, //n Offset for SDK autoscan
	Type, //e ${SwitchType}
};

enum KDetector {
	Threshold_Min, //f
	Threshold_Max, //f
	SideSize, //f
	SideOffset, //f
	PeaksSearch, //e ${PeakSearchMode}
};

enum KCoreOutput {
	SendSpectrum, //b Send spectrum data or empty vector
	SendOnlyCurrentValue, //b Send current values or all stored in 20Hz
};

enum CoreOutputChannel {
	GUI,
	SecGUI,
	ThirdGUI,
};

enum KDescription {
	// KSpectrometer = Spectrometer
	// KSwitch = Switch
	// KDetector = Detector
	// KCoreOutput[CoreOutputChannel] = CoreOutput
	// KLogConfig[LogType] = Logs
	Gratings_history, //n Gratings peak values history, count
	Amplitude_history_size, //n Count of history values to calculate sensors amplitude
	Fourier_enabled, //b Global fourier enable flag
	Fourier_size, //n Size of fourier window, in counts
	Fourier_YScale, //f scale for fourier amplitude
	Fourier_Max_or_Density, //n 0 - Maximum in fourier window, 1 - Density of fourier window
	Mode, //e ${CoreMode} Work mode
	SynchronizationEnabled, //b When enabled, start logs and reset time when sync signal received
	SynchronizationMode, //e {0 - disabled, 1 - new file, 2 - column in log}
	LambdasAutoReset, //b Set lambdas_0 to grating values on first data receive
	Gauss_size, //n
	//Peak_max_offset, //f in pixels
	//Peak_LF_coeff, //f 1. - no filtering
	GratingOverloadMax, //n
	GratingOverloadMin, //n
	SendLED, //b Send to LED Arduino serial port current state
	SynchronizationClearValues, //b clear gratings and sensors values and history on sync
	PeaksModeFrequency, //f
	PeaksModeAdditionNm_1, //f Addition nm to peaks in ModePeaks, channel 1
	PeaksModeAdditionNm_2, //f Addition nm to peaks in ModePeaks, channel 2
	PeaksModeAdditionNm_3, //f Addition nm to peaks in ModePeaks, channel 3
	PeaksModeAdditionNm_4, //f Addition nm to peaks in ModePeaks, channel 4
};

enum XDescription {
	// KSpectrometer = Spectrometer
	// KSwitch = Switch
	// KDetector = Detector
	// KCoreOutput[CoreOutputChannel] = CoreOutput
	// KLogConfig[LogType] = Logs
	State, //b 
	Frequency, //n cur freq
	//Fourier_enabled, //b Global fourier enable flag
};

enum CDescription {
	// KSpectrometer = Spectrometer
	// KCoreOutput[CoreOutputChannel] = CoreOutput
	// KLogConfig[LogType] = Logs
	Halt, //b 
	Reboot, //n cur freq
	Pause, //b Global fourier enable flag
};

enum MDescription {
	Main, //b 
	Core, //s
	Warnings, //b Global fourier enable flag
};

}

#endif // K_DESCRIPTION_H
