//На примере устройства, состоящего из одного модуля QMS75, 
//иллюстрируется применения основных библиотечных
//функций и правильная очередность их вызова.

//Пример работает по следующему алгоритму:

//1. Инициализация устройства.
//2. Установка реле в нужное значение (в примере - 0х55)
//3. Ожидание нажатия кнопки клавиатуры.
//4. По нажатию реле сбрасываются в 0х00, выход из программы. 


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

#define QMS75SLOT	0


HANDLE SD;                              // Дескриптор системы
QMX_CONFIG CFG;                         // Конфигурация системы

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


void main(int argc, char* argv[])
{
	char s_wrk[64];
	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(); 
	}

	// Проинициализуем систему
	// ВНИМАНИЕ! Файлы прошивок (qms75v1.ttf и usb30kv1.ttf) должны находиться в рабочем каталоге!
	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);


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


	// Вся работа с QMS75 заключается в использовании всего одной функции QMX_QMS75_SetRelay, например
	// Включим реле в положение 0x55
	QMX_QMS75_SetRelay(SD, QMS75SLOT, 0x55);		


	printf("Press any key   ....\r");
	while (!_kbhit()){											// Ожидание нажатия кнопки клавиатуры
																
		Sleep(100);									
	
	}

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



// Выход из программы
void quit(void){
	
	printf("\n\n Please wait....\r");
	QMX_Stop(SD, QMX_STOP_ALL);			// Остановим систему

	QMX_QMS75_SetRelay(SD, QMS75SLOT, 0x0);		// Выключим реле, если были включены

	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();}
}

