//Иллюстрируется работа с ЦАП QMS45 для вывода постоянных напряжений
//(асинхронный режим)

#include "../../dll/qmx.h"
#include <shellapi.h>
#include <stdio.h>
#include <conio.h> 
#include <math.h>


HANDLE SD;                              // Дескриптор системы
QMX_CONFIG CFG;                         // Конфигурация системы
QMX_CC_F CC_Dac1[8];					// Калибровочные коэффициенты


static unsigned int out_cntr=0;
static unsigned short int *out_buf[2];
static double DCVolts[8]={0.1, 9.5, -3., 0.1, 6.1, 6., -6., -8.}; // Значения в Вольтах для вывода на ЦАП
static WORD DCCodes[8]; // Значения в кодах для вывода на ЦАП

void CheckErr(void);
void quit(void);




//void main(void)
void main(int argc, char* argv[])
{
	char s_wrk[64];
	int i_wrk;

	printf("Please wait....\r");
	
	// Запустим сервер
	ShellExecuteW(NULL, TEXT("open"), TEXT("qmbox_ds.exe"), TEXT("-p3"), NULL, SW_SHOWNORMAL);
	Sleep(500);

	// Получим дискриптор системы
	SD = 0;
	SD=QMX_CircBufAttach(0);
	if (SD == NULL) {
		printf("ERROR: No QMBox found.");
		quit(); 
	}

	// Проинициализуем систему
	QMX_InitModules(SD, QMX_LOG_NONE, NULL);
	CheckErr();

	// Фиктивный вызов QMX_Prepare - выясним конфигурацию устройства
	// т.е. из каких модулей оно состоит
	QMX_MOD_SetActive(SD, 0, QMX_ON);
	QMX_Prepare(SD, 100, &CFG);
	CheckErr();
	QMX_MOD_SetActive(SD, 0, QMX_OFF);

	
	// Убедимся, что первый модуль системы - QMS45
	strncpy_s (s_wrk, CFG.ModName[0], 5); s_wrk[5] = 0;
	if (!_stricmp(s_wrk, "QMS45"))	printf("Module name OK\n");
	else{ printf("Module Name error\n");	quit();	}


	
	//Считаем калибровочные коэффициенты для ЦАП
	//для всех его 8ми каналов 
	for (i_wrk = 0; i_wrk < 8; i_wrk++) QMX_QMS45_ReadCC(SD, 0, i_wrk, &CC_Dac1[i_wrk]);


	//Преобразуем нужные Вольты в коды ЦАП
	for (i_wrk = 0; i_wrk < 8; i_wrk++) DCCodes[i_wrk] =  (WORD)(DCVolts[i_wrk] * CC_Dac1[i_wrk].Scale + CC_Dac1[i_wrk].Offset);



	// Переключим ЦАП в режим асинхронной записи.
	QMX_QMS45_SetMode(SD, 0, 1);


	// Запишем нужные коды в соответствующий канал ЦАП
	for (i_wrk = 0; i_wrk < 8; i_wrk++) QMX_QMS45_SetDac(SD, 0, i_wrk, DCCodes[i_wrk]);


	// Разрешим работу ЦАП
	QMX_QMS45_EnableDac(SD, 0, 1);


	printf("Now DACs are ready\n");
	printf("Press any key to quit\n");

	while(!_kbhit()){			
	  Sleep(10);
	}

	// Переключим ЦАП в потоковый режим.
	QMX_QMS45_SetMode(SD, 0, 0);


	quit();											// выход из программы
}


// Выход из программы
void quit(void){
	
	printf("\n\n Please wait....\r");
	QMX_Stop(SD, QMX_STOP_ALL);			// Остановим систему
	QMX_MOD_SetStartMode(SD, 0xFF, QMX_START_MODE_MANUAL); 									
										
	QMX_CircBufDetach(SD);              // Освободим виртуальный слот USB
										// Остановим сервер
	ShellExecute(NULL, TEXT("open"), TEXT("qmbox_ds.exe"), TEXT("-s0"), NULL, SW_SHOWNORMAL);
	printf("\n\n");
	ExitProcess(0);
}


// Проверка на ошибки
void CheckErr(void) {
char tmp_str[1024];

if (QMX_GetLastError(SD, tmp_str, sizeof(tmp_str))==QMX_OK){ return;}
else  {	printf("%s\n", tmp_str);	quit();}
}







