//---------------------------------------------------------------------------
#ifndef AYRA01FRKZ_H
#define AYRA01FRKZ_H
//---------------------------------------------------------------------------
#include "../Printer.h"
#include "../../ComPort.h"
//#include <stdTools.h>
//#include <string>
//---------------------------------------------------------------------------
//Добавил когда делал кросплатформеного кассирра
typedef unsigned long       DWORD;
//---------------------------------------------------------------------------
#define fc3F 0x3F //63 ? Запрос состояния ККМ 29
#define fc41 0x41 //65 A Аннулирование 45
#define fc43 0x43 //67 C Скидка / Надбавка 47
#define fc45 0x45 //69 E Запрос кода состояния ККМ 37
#define fc46 0x46 //70 F Чтение таблицы 55
#define fcBeep 0x47 //71 G Гудок 27
#define fc48 0x48 //72 H Выход из текущего режима 22
#define fc49 0x49 //73 I Внесение денег 43
#define fc4A 0x4A //74 J Закрыть чек (со сдачей) 48
#define fc4B 0x4B //75 K Программирование времени 39
#define fc4C 0x4C //76 L Печать строки 23
#define fc4D 0x4D //77 M Запрос наличных денег в ящике ККМ 30
#define fc4E 0x4E //78 N Сторно 44
#define fc4F 0x4F //79 O Выплата денег 43
#define fc50 0x50 //80 P Программирование таблицы 54
#define fc52 0x52 //82 R Регистрация 44
#define fc56 0x56 //86 V Вход в режим 21
#define fc57 0x57 //87 W Возврат 46
#define fc58 0x58 //88 X Получение последнего сменного итога 31
#define fcCancelFiscalInv 0x59 //89 Y Аннулирование всего чека 43
#define fcDailyFinancialReport 0x5A //90 Z Снятие суточного отчета с гашением 51
#define fc61 0x61 //97 a Ввод заводского номера 57
#define fc62 0x62 //98 b Фискализация / перерегистрация 57
#define fc63 0x63 //99 c Запрос диапазонов дат и смен 58
#define fc64 0x64 //100 d Программирование даты 39
#define fc65 0x65 //101 e Фискальный отчет по диапазону дат 58
#define fc66 0x66 //102 f Фискальный отчет по диапазону смен 59
#define fc67 0x67 //103 g Начало снятия отчета без гашения 49
#define fc6B 0x6B //107 k Технологическое обнуление ККМ 41
#define fc6C 0x6C //108 l Команда печати клише чека 27
#define fc6D 0x6D //109 m Ввод кода защиты ККМ 41
#define fc6E 0x6E //110 n Тестовый прогон 40
#define fc71 0x71 //113 q Инициализация таблиц нач. значениями 41
#define fc73 0x73 //115 s Команда печати нижней части чека 50
#define fc74 0x74 //116 t Запрос активизированности кода защиты ККМ 39
#define fc75 0x75 //117 u Отрезать чек 27
#define fc77 0x77 //119 w Общее гашение 52
#define fc78 0x78 //120 x Отмена последней скидки/надбавки 47
#define fcOpenCashDrawer 0x80 //128 А Открыть денежный ящик 27
#define fc82 0x82 //130 В Демонстрационный прогон 41
#define fc84 0x84 //132 Д Получение очередного блока данных ПО ККМ 55
#define fc85 0x85 //133 Е Импульсное открытие денежного ящика 28
#define fc86 0x86 //134 Ж Получить очередную строку картинки по номеру 57
#define fc87 0x87 //135 З Печать поля 23
#define fc88 0x88 //136 И Звуковой сигнал 27
#define fc8A 0x8A //138 К Очистить массив картинок 56
#define fc8B 0x8B //139 Л Добавить строку картинки 56
#define fc8C 0x8C //140 М Статус массива картинок 32
#define fc8D 0x8D //141 Н Печать картинки по номеру 26
#define fc8E 0x8E //142 О Печать картинки с хоста 25
#define fc8F 0x8F //143 П Передать данные в порт 28
#define fc90 0x90 //144 Р Параметры картинки в массиве 33
#define fc91 0x91 //145 С Считать регистр 33
#define fc92 0x92 //146 T Открыть чек 43
#define fc99 0x99 //153 Щ Расчет по чеку (с закрытием) 47
#define fc9A 0x9A //154 Ъ Открыть смену 42
#define fc9B 0x9B //155 Ы Сторно расчета по чеку 48
#define fc9C 0x9C //156 Ь Начало считывания дампа 55
#define fc9D 0x9D //157 Э Получение версии 29
#define fc9E 0x9E //158 Ю Закрыть картинку 56
#define fc9F 0x9F //159 Я Начать считывание картинки по номеру 56
#define fcA5 0xA5 //165 е Получить тип устройства 31
#define fcB6 0xB6 //182 Печать документа по номеру 53
#define fcB7 0xB7 //183 Печать контрольной ленты 53

/*
#define fcDisplayClear 0x21 //(33)Очистка дисплея
#define fcDispalyLower 0x23 //(35)Вывод текста в нижнюю строку дисплея
#define fcOpenServiceInv 0x26 //(38)Открытие нефискального чека
#define fcCloseServiceInv 0x27 //(39)Закрытие нефискального чека
#define fcSwitchPrg 0x29 //(41)Программирование конфигурационных ключей
#define fcPrintFreeTextInServiceInv 0x2A //(42)Печать свободного текста в нефискальном чеке
#define fcPrintSetup 0x2B //(43)Установка HEADER и FOOTER и опций печати
#define fcFeedPaper 0x2C //(44)Протяжка ленты
#define fcCutPaper 0x2D //(45)Обрезка ленты
#define fcDispalyUpper 0x2F //(47)Вывод текста в верхнюю строку дисплея
#define fcOpenFiscalInv 0x30 //(48)Открытие фискального (клиентского) чека
#define fcRegisterSale 0x31 //(49)Регистрация продажи
#define fcReportOnTaxRates 0x32 //(50)Отчет по налоговым ставкам и положению десятичной точки за период
#define fcSubtotal 0x33 //(51)Подитог
#define fcRegisterSaleDisp 0x34 //(52)Регистрация продажи с выводом на дисплей
#define fcTotal 0x35 //(53)Оплата (итог)
#define fcPrintFreeTextInFiscalInv 0x36 //(54)Печать свободного текста в фискальном чеке
#define fcCloseFiscalInv 0x38 //(56)Закрытие фискального чека
#define fcRegisterArticleSale 0x3A //(58)Регистрация продажи запрограммированного артикула
#define fcCancelFiscalInv 0x3C //(60)Аннуляция (сторно) фискального чека
#define fcSetDateTime 0x3D //(61)Установка даты и времени
#define fcGetDateTime 0x3E //(62)Чтение даты и времени
#define fcDisplayDateTime 0x3F //(63)Вывод даты и времени на дисплей
#define fcLatestFiscalRecord 0x40 //(64)Информация о последней фискальной записи
#define fcAmountOfSavingsPerDay 0x41 //(65)Информация о сумме накоплений за день
#define fcDepartmentReport 0x42 //(66)Отчет по секциям
#define fcFreeFieldsByFiscalMemory 0x44 //(68)Количество свободных полей в фискальной памяти
#define fcDailyFinancialReport 0x45 //(69)Дневной финансовый отчет
#define fcParishOrConsumption 0x46 //(70)Служебный приход или расход
#define fcPrintDiagnostic 0x47 //(71)Печать диагностической информации
#define fcFiscalization 0x48 //(72)Фискализация и пререгистрация
#define fcFullFiscalReportByNumber 0x49 //(73)Полный фискальный отчет за период заданный номерами смен
#define fcGetStatusFP 0x4A //(74)Получение статуса
#define fcFiscalTransactionsStatus  0x4C //(76)Статус фискальной транзакции
#define fcReduceFiscalReportByDate 0x4F //(79)Сокращенный фискальный отчет за период заданный датами
#define fcBeep 0x50 //(80)Звуковой сигнал
#define fcOpenBackInv 0x52 //(82)Открытие чека возврата
#define fcSetTaxRates 0x53 //(83)Установка положения десятичной точки и налоговых ставок
#define fcPrintBarCode 0x54 //(84)Печать штрих-кода
#define fcSetAddTypesOfPayment 0x55 //(85)Установка наименований дополнительных типов оплаты
#define fcDateOfLastEntryByFiscalMemory 0x56 //(86)Дата последней записи в фискальную память
#define fcSetDepartmentName 0x57 //(87)Программирование наименования секции
#define fcGetDepartmentInfo 0x58 //(88)Получение информации по секции
#define fcPrgProductionTestArea 0x59 //(89)Программирование производственной тестовой области
#define fcDiagnosticInfo 0x5A //(90)Диагностическая информация
#define fcSetManufacturersSerialNumber 0x5B //(91)Программирование заводского номера принтера
#define fcFullFiscalReportByDate 0x5E //(94)Полный фискальный отчет за период заданный датами
#define fcReduceFiscalReportByNumber 0x5F //(95)Сокращенный фискальный отчет за период заданный номерами смен
#define fcGetTaxRates 0x61 //(97)Чтение запрограммированных налоговых ставок
#define fcSetRNNAndRNM 0x62 //(98)Установка РНН и РНМ
#define fcGetRNNAndRNM 0x63 //(99)Чтение РНН и РНМ
#define fcDispalyFree 0x64 //(100)Вывод на дисплей свободного текста
#define fcSetOperatorPassword 0x65 //(101)Установка пароля оператора
#define fcSetOperatorName 0x66 //(102)Установка наименования оператора
#define fcInfoByCurrentInv 0x67 //(103)Информация о текущем чеке
#define fcOperatorReport 0x69 //(105)Отчет по операторам
#define fcOpenCashDrawer 0x6A //(106)Открытие денежного ящика
#define fcPrgAndReadArticle 0x6B //(107)Программирование и чтение данных артикула
#define fcPrintDuplicateInv 0x6D //(109)Печать дубликата чека
#define fcDailyReportByTypesOfPayment 0x6E //(110)Дневной отчет по типам оплаты
#define fcReportByArticle 0x6F //(111)Отчет по артикулам
#define fcReportByOperators 0x70 //(112)Отчет по операторам
#define fcGetLastPrintedDocNumber 0x71 //(113)Получение номера последнего напечатанного документа
#define fcGetInfoOfFiscalRecords 0x72 //(114)Получение информации о фискальной записи или записях за период
#define fcPrgGraphicLogo 0x73 //(115)Программирование графического логотипа
#define fcReadFiscalMemoryBlock 0x74 //(116)Чтение блока фискальной памяти
#define fcEJ 0x78 //(120)Работа с электронной контрольной лентой
#define fcReadROMBlock 0x79 //(121)Чтение блока из ПЗУ
#define fcServiceClearEJ 0x7E //(126)Сервисная очистка контрольной ленты
#define fcServiceClearRAM 0x7F //(127)Сервисное обнуление ОЗУ
*/
//---------------------------------------------------------------------------
//unsigned int MakeCRC(unsigned char* Buf, unsigned int BufStart,unsigned int BufLen);
//---------------------------------------------------------------------------
typedef char int1;
typedef unsigned char uint1;
typedef unsigned int uint4;
#if !defined( _BORLAND )
	typedef unsigned short Word; // 0..65535
#endif
typedef unsigned char BYTE;
//---------------------------------------------------------------------------
class AYRA01FRKZ : public CPrinter
{
	private:
	protected:
	public:
		ComPort* cPort;
		std::string m_Password; //Пароль кассира

		AYRA01FRKZ();
		virtual ~AYRA01FRKZ();


		bool WriteReqwest(std::string reqwest); //Послать запрос принтеру
		bool ReadAnswer(std::string &answer); //Прочитать ответ принтера
		
		bool CutPaper(bool full = true); ///<Отрезать бумагу
		bool FeedPaper(int lines); ///<Протянуть бумагу
		bool OpenCashDrawer(int mSec = 0); ///<Открытие денежного ящика

		//Функции из родительского класса
		bool isOk(); //Готов ли к работе принтер (должна быстро выполнятся)
		bool OpenCOMPort(int ComNumber = -1,int BaudRate = -1); ///<Соедениться по COM порту
		bool PrinterInit(); //Инициализация принтера. 
		bool GetCashSum(double& sum);  //<Получить сумму наличности в кассе.
		bool Beep(int Hz = 0,int mSec = 0); ///<Звуковой сигнал
		bool PrintZReport(); ///<Печатать дневной отчёт с гашением
		bool PrintXReport(); ///<Печатать дневной отчёт без гашения
		bool PrintLine(std::wstring line); ///<Печатает строку текста
		bool GetStateKKM(std::string& state);

		std::wstring GetErrorDesc(int ResultCode); ///<Описание кода ошибки ко его коду


		//Не из родителя функции а те которые в протоколе!!!
		bool SetDateTime(unsigned char ye,unsigned char mo,unsigned char de,unsigned char ho,unsigned char mi,unsigned char se);
		bool Abort(bool test, bool nal, double price,double count); //Аннулирование
		bool Return(bool test, bool nal, double price,double count); //Возврат

		bool GetCashSum(double* sum); ///<Наличных в ден ящике
		
		
		bool PrintTail(); ///<Печать окончание чека
		bool PrintEJ(bool full,bool clear); ///<Печать контрольной ленты
		bool EnterInState(int state,int password); ///<Вход в режим
		bool ExitFromState(); ///<Выход из режима	
		bool ReturnDiscount(); ///<Отменить последнюю скидку/надбавку

		bool Discount(bool test, bool area, bool abs, double price); ///<Скидка либо надбавка

		bool Settle(bool test,int type,double price); ///<Расчёт по чеку
		bool ReturnSettle(bool test,int type,double price, double* remainder, double* deal); ///<Сторно расчёт по чеку
		bool CloseFiscalInv(bool test, int type, double price); ///<Закрыть чек со здачей

		//***Общие комманды***
		bool GetStateKKM(unsigned char &state1,unsigned char &state2,unsigned char &flags); ///<Запрос состояния ККМ
		bool GetDeviseType(); //Получить тип устройства

		//***Команды режима регистрации***
		bool OpenGang(bool test, std::wstring text); ///<Открыть смену
		bool OpenFiscalInv(unsigned char type); ///<Открытие фискального (клиентского) чека
		bool Storno(); //Анулирование всего чека (сторнирование)
		bool CashInOut(bool test, double sum); //<Внесение +, выемка -
		bool RegisterSale(double price, double count, unsigned char section); ///<Регистрация продажи
		bool StornoSale(bool test, double price, double count, unsigned char section); ///<Сторнирование продажи

		//***Команды режима отчётов без гашения***
		bool PrintReport(unsigned char type);

		//***Общие команды***

		//***Команды режима программирования***
		bool ReadTable(unsigned char table,unsigned short row,unsigned char field, std::string& ans); ///<Чтение поля из таблицы


		//Функции из родительского класса которые не совпали с протокоольными...
};
//---------------------------------------------------------------------------
#endif
