solarium/.svn/pristine/7e/7ea2debb32f5cf8bb087808d270a7143a1a91f3c.svn-base
2021-04-15 21:07:13 +03:00

983 lines
26 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <includes.h>
#include "app_serv.h"
#include "fiscal.h"
#include "fr.h"
#include "uart0.h"
#include "data.h"
#include "datadesc.h"
#include "journal.h"
#include "time.h"
TFiscDevType FiscDevInfo;
static TFiscFullStatus FiscFullStatus;
CPU_INT08U FiscalConnState = FISCAL_NOCONN;
OS_EVENT *FLock = NULL;
//OS_EVENT *FReportLock = NULL;
//OS_STK FiscalTaskStk[FISCAL_TASK_STK_SIZE];
// ïðîâåðêà è îáðàáîòêà òåêóùåãî ñòàòóñà ÔÐ
int CheckFiscalStatus()
{
CPU_INT08U err;
int poll;
CPU_INT32U time1, time2;
CPU_INT32U enable;
GetData(&EnableFiscalDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
if (!enable) return 0;
time1 = time2 = OSTimeGet();
while (labs(time2 - time1) < WAIT_PRINT_TIMEOUT)
{
OSTimeDly(100);
time2 = OSTimeGet();
// ñíà÷àëà ïîëëèì
poll = FiscPollExt();
if (poll == FISC_UNDEF)
{
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
return -1;
}
else if (poll == FISC_BUSY)
{
continue;
}
// òåïåðü çàïðàøèâàåì ñòàòóñ
if (FiscGetFullStatus(DEFAULT_PASS, &FiscFullStatus, &err) != FISC_OK)
{
if (err)
{
// åñòü êàêàÿ-òî ãëîáàëüíàÿ îøèáêà
if (err) SetFiscalErrorByCode(err);
FiscalConnState = FISCAL_CONN;
ClrErrorFlag(ERROR_FR_CONN);
}
else
{
// ïðîñòî íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
}
return -2;
}
// äàëåå ðàçáèðàåì ñòàòóñ
FiscalConnState = FISCAL_CONN;
ClrErrorFlag(ERROR_FR_CONN);
CPU_INT16U flags;
memcpy(&flags, &FiscFullStatus.Flags, sizeof(CPU_INT16U));
// ÊÐÈÒÈ×ÍÛÅ ÔËÀÃÈ:
// ÝÊËÇ (0 íåò, 1 åñòü)
if (!(flags & (1L<<5)))
{
// íåò ÝÊËÇ
SetFiscalErrorByCode(FR_ERROR_CODE_a1);
return -3;
}
else
{
ClrFiscalErrorByCode(FR_ERROR_CODE_a1);
}
ClrFiscalErrorByCode(FR_ERROR_CODE_6b);
// ÏÎÄÐÅÆÈÌ
switch (FiscFullStatus.SubMode)
{
case 1:
// 1. Ïàññèâíîå îòñóòñòâèå áóìàãè ÔÐ íå â ôàçå ïå÷àòè îïåðàöèè íå ïðèíèìàåò îò
// õîñòà êîìàíäû, ñâÿçàííûå ñ ïå÷àòüþ íà òîì äîêóìåíòå, äàò÷èê êîòîðîãî ñîîáùàåò îá
// îòñóòñòâèè áóìàãè.
SetFiscalErrorByCode(FR_ERROR_CODE_6b);
return -4;
case 2:
// 2. Àêòèâíîå îòñóòñòâèå áóìàãè ÔÐ â ôàçå ïå÷àòè îïåðàöèè ïðèíèìàåò òîëüêî
// êîìàíäû, íå ñâÿçàííûå ñ ïå÷àòüþ. Ïåðåõîä èç ýòîãî ïîäðåæèìà òîëüêî â ïîäðåæèì 3.
SetFiscalErrorByCode(FR_ERROR_CODE_6b);
return -5;
case 3:
// 3. Ïîñëå àêòèâíîãî îòñóòñòâèÿ áóìàãè ÔÐ æäåò êîìàíäó ïðîäîëæåíèÿ ïå÷àòè. Êðîìå
// ýòîãî ïðèíèìàåò êîìàíäû, íå ñâÿçàííûå ñ ïå÷àòüþ.
SetFiscalErrorByCode(FR_ERROR_CODE_6b);
// äîïå÷àòûâàåì ÷åê
FiscPrintContinue(DEFAULT_PASS, &err);
return -6;
case 4: //Ôàçà ïå÷àòè îïåðàöèè ïîëíûõ ôèñêàëüíûõ îò÷åòîâ
case 5: //Ôàçà ïå÷àòè îïåðàöèè
continue;
default:
break;
}
// ÐÅÆÈÌ
switch (FiscFullStatus.Mode)
{
case 0:
// 0. Ïðèíòåð â ðàáî÷åì ðåæèìå.
// èëè ïå÷àòü îò÷åòîâ èç áóôåðà
// OK
ClearFiscalErrors();
goto check_exit;
case 1:
// 1. Âûäà÷à äàííûõ.
// OK
ClearFiscalErrors();
goto check_exit;
case 2:
// 2. Îòêðûòàÿ ñìåíà, 24 ÷àñà íå êîí÷èëèñü.
// OK
ClearFiscalErrors();
goto check_exit;
case 3:
// 3. Îòêðûòàÿ ñìåíà, 24 ÷àñà êîí÷èëèñü.
{
CPU_INT32U autoclose;
GetData(&EnableFiscalDayClearDesc, &autoclose, 0, DATA_FLAG_SYSTEM_INDEX);
if (autoclose==2)
{
// çàêðûâàåì ñìåíó â áóôåð
FiscPrintDayReportToBuf(30, &err);
// êàê òîëüêî ïåðåïîëíåíèå áóôåðà, ïå÷àòàåì èç áóôåðà
if (err == FR_ERROR_CODE_4b)
{
SetFiscalErrorByCode(err);
SaveEventRecord(0, JOURNAL_EVENT_PRINT_BUF, GetTimeSec());
FiscPrintDayReportsFromBuf(30, &err);
if (err)
{
SetFiscalErrorByCode(err);
return -8;
}
}
else if (err)
{
SetFiscalErrorByCode(err);
return -9;
}
}
else if (autoclose==1)
{
// çàêðîåì ñìåíó Z-îò÷åòîì
FiscPrintDayReportClear(30, &err);
SaveEventRecord(0, JOURNAL_EVENT_PRINT_Z, GetTimeSec());
if (err)
{
SetFiscalErrorByCode(err);
return -10;
}
}
else if (autoclose==0)
{
// îøèáêà - äîëæåí ïðèéòè îïåðàòîð è çàêðûòü ñìåíó
SetFiscalErrorByCode(FR_ERROR_CODE_4e);
return -11;
}
}
goto check_exit;
case 4:
// 4. Çàêðûòàÿ ñìåíà.
ClearFiscalErrors();
goto check_exit;
case 5:
// 5. Áëîêèðîâêà ïî íåïðàâèëüíîìó ïàðîëþ íàëîãîâîãî èíñïåêòîðà.
SetFiscalErrorByCode(FR_ERROR_CODE_4f);
goto check_exit;
case 6:
// 6. Îæèäàíèå ïîäòâåðæäåíèÿ ââîäà äàòû.
SetFiscalErrorByCode(FR_ERROR_CODE_c0);
goto check_exit;
case 8:
// 8. Îòêðûòûé äîêóìåíò:
// 8.0. Ïðîäàæà.
// 8.1. Ïîêóïêà.
// 8.2. Âîçâðàò ïðîäàæè.
// 8.3. Âîçâðàò ïîêóïêè.
// 8.4. Íåôèñêàëüíûé.
{
CPU_INT64U cash = 0;
CPU_INT08U tax[4] = {0,0,0,0};
FiscCloseBill(DEFAULT_PASS, &cash, &tax[0], "Ñïàñèáî çà ïîêóïêó!!!", &err);
if (err)
{
SetFiscalErrorByCode(err);
return -11;
}
}
goto check_exit;
case 12:
// èäåò ïå÷àòü Z-îò÷åòà
continue;
default:
goto check_exit;
}
}
check_exit:
if (labs(time2 - time1) < WAIT_PRINT_TIMEOUT)
{
// OK
return 0;
}
return -1;
}
#define FISCAL_BAUDS_COUNT 7
static const CPU_INT32U fiscal_bauds[FISCAL_BAUDS_COUNT] = {2400, 4800, 9600, 19200, 38400, 57600, 115200};
// ïîäêëþ÷åíèå ÔÐ
int ConnectFiscal(void)
{
int i, poll;
CPU_INT08U err;
CPU_INT32U enable;
GetData(&EnableFiscalDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
FPend();
if (enable)
{
int j;
// ïîëëèì
for (j = FISCAL_BAUDS_COUNT-1; j >= 0; j--)
{
Uart0_Init(fiscal_bauds[j]);
i = 10;
do
{
OSTimeDly(100);
poll = FiscPollExt();
if ((poll == FISC_READY) || (poll == FISC_BUSY)) break;
} while (--i);
// íå íàøëè ïîëëèíãîì
if (i)
{
break;
}
}
if (j < 0)
{
SetErrorFlag(ERROR_FR_CONN);
FiscalConnState = FISCAL_NOCONN;
FPost();
return -1;
}
// çàïðîñèì ñòàòóñ
if (FiscGetFullStatus(DEFAULT_PASS, &FiscFullStatus, &err) != FISC_OK)
{
if (err)
{
// åñòü êàêàÿ-òî ãëîáàëüíàÿ îøèáêà
// íàäî ðàçîáðàòü ïîäðîáíî
if (err) SetFiscalErrorByCode(err);
}
else
{
// ïðîñòî íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
FPost();
return -2;
}
}
// ïîäêëþ÷èèëè
FiscalConnState = FISCAL_CONN;
ClrErrorFlag(ERROR_FR_CONN);
}
else
{
// ÔÐ îòêëþ÷åí
FiscalConnState = FISCAL_NOCONN;
ClearFiscalErrors();
ClrErrorFlag(ERROR_FR_CONN);
FPost();
return -3;
}
FPost();
return 0;
}
// ïîäêëþ÷åíèå ÔÐ
int ConnectFiscalFast(void)
{
int i, poll;
CPU_INT08U err;
CPU_INT32U enable;
GetData(&EnableFiscalDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
FPend();
if (enable)
{
int j;
// ïîëëèì
for (j = FISCAL_BAUDS_COUNT-1; j >= 0; j--)
{
Uart0_Init(fiscal_bauds[j]);
i = 2;
do
{
poll = FiscPollExt();
if ((poll == FISC_READY) || (poll == FISC_BUSY)) break;
} while (--i);
// íå íàøëè ïîëëèíãîì
if (i)
{
break;
}
}
if (j < 0)
{
SetErrorFlag(ERROR_FR_CONN);
FiscalConnState = FISCAL_NOCONN;
FPost();
return -1;
}
// çàïðîñèì ñòàòóñ
if (FiscGetFullStatus(DEFAULT_PASS, &FiscFullStatus, &err) != FISC_OK)
{
if (err)
{
// åñòü êàêàÿ-òî ãëîáàëüíàÿ îøèáêà
// íàäî ðàçîáðàòü ïîäðîáíî
if (err) SetFiscalErrorByCode(err);
}
else
{
// ïðîñòî íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
FPost();
return -2;
}
}
// ïîäêëþ÷èèëè
FiscalConnState = FISCAL_CONN;
ClrErrorFlag(ERROR_FR_CONN);
}
else
{
// ÔÐ îòêëþ÷åí
FiscalConnState = FISCAL_NOCONN;
ClearFiscalErrors();
ClrErrorFlag(ERROR_FR_CONN);
FPost();
return -3;
}
FPost();
return 0;
}
// èíèöèàëèçàöèÿ
void InitFiscal(void)
{
if (!FLock)
{
FLock = OSSemCreate(1);
//FReportLock = OSSemCreate(1);
//OSTaskCreate(FiscalTask, (void *)0, (OS_STK *)&FiscalTaskStk[FISCAL_TASK_STK_SIZE-1], FISCAL_TASK_PRIO);
}
if (ConnectFiscal()) return;
CheckFiscalStatus();
}
int IsFiscalConnected(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int retval;
if (FiscalConnState == FISCAL_CONN) retval=1;
else retval=0;
OS_EXIT_CRITICAL();
return retval;
}
// çàíÿòü
void FPend(void)
{
CPU_INT08U err;
do{
OSSemPend(FLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}while (err);
}
// îñâîáîäèòü
void FPost(void)
{
OSTimeDly(200);
OSSemPost(FLock);
}
/*
// çàíÿòü
void FReportPend(void)
{
CPU_INT08U err;
do{
OSSemPend(FReportLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}while (err);
}
// çàíÿòü 2
int FReportGet(void)
{
CPU_INT08U err;
OSSemPend(FReportLock, 1, &err);
if (!err) return 1;
return 0;
}
// îñâîáîäèòü
void FReportPost(void)
{
if (!FReportTest()) OSSemPost(FReportLock);
}
// ïðîâåðèòü
// 0 - íåäîñòóïåí
// >0 - äîñòóïåí
CPU_INT16U FReportTest(void)
{
return OSSemCheck(FReportLock);
}
*/
// î÷èñòêà âñåõ îøèáîê ÔÐ
void ClearFiscalErrors(void)
{
for (unsigned char i=ERROR_FR; i<ERROR_FR+FR_ERROR_NUMBER; i++)
{
ClrErrorFlag(i);
}
}
static const CPU_INT08U error_codes[FR_ERROR_NUMBER] = {
0x1,//Íåèñïðàâåí íàêîïèòåëü ÔÏ 1, ÔÏ 2 èëè ÷àñû
0x2,//Îòñóòñòâóåò ÔÏ 1
0x3,//Îòñóòñòâóåò ÔÏ 2
0x4,//Íåêîððåêòíûå ïàðàìåòðû â êîìàíäå îáðàùåíèÿ ê ÔÏ
0x5,//Íåò çàïðîøåííûõ äàííûõ
0x6,//ÔÏ â ðåæèìå âûâîäà äàííûõ
0x7,//Íåêîððåêòíûå ïàðàìåòðû â êîìàíäå äëÿ äàííîé ðåàëèçàöèè ÔÏ
0x8,//Êîìàíäà íå ïîääåðæèâàåòñÿ â äàííîé ðåàëèçàöèè ÔÏ
0x9,//Íåêîððåêòíàÿ äëèíà êîìàíäû
0x0A,//Ôîðìàò äàííûõ íå BCD
0x0B,//Íåèñïðàâíà ÿ÷åéêà ïàìÿòè ÔÏ ïðè çàïèñè èòîãà
0x11,//Íå ââåäåíà ëèöåíçèÿ
0x12,//Çàâîäñêîé íîìåð óæå ââåäåí
0x13,//Òåêóùàÿ äàòà ìåíüøå äàòû ïîñëåäíåé çàïèñè â ÔÏ
0x14,//Îáëàñòü ñìåííûõ èòîãîâ ÔÏ ïåðåïîëíåíà
0x15,//Ñìåíà óæå îòêðûòà
0x16,//Ñìåíà íå îòêðûòà,//
0x17,//Íîìåð ïåðâîé ñìåíû áîëüøå íîìåðà ïîñëåäíåé ñìåíû,//
0x18,//Äàòà ïåðâîé ñìåíû áîëüøå äàòû ïîñëåäíåé ñìåíû,//
0x19,//Íåò äàííûõ â ÔÏ,//
0x1A,//Îáëàñòü ïåðåðåãèñòðàöèé â ÔÏ ïåðåïîëíåíà,//
0x1B,//Çàâîäñêîé íîìåð íå ââåäåí,//
0x1C,//Â çàäàííîì äèàïàçîíå åñòü ïîâðåæäåííàÿ çàïèñü,//
0x1D,//Ïîâðåæäåíà ïîñëåäíÿÿ çàïèñü ñìåííûõ èòîãîâ,//
0x1F,//Îòñóòñòâóåò ïàìÿòü ðåãèñòðîâ,//
0x20,//Ïåðåïîëíåíèå äåíåæíîãî ðåãèñòðà ïðè äîáàâëåíèè,//
0x21,//Âû÷èòàåìàÿ ñóììà áîëüøå ñîäåðæèìîãî äåíåæíîãî ðåãèñòðà,//
0x22,//Íåâåðíàÿ äàòà,//
0x23,//Íåò çàïèñè àêòèâèçàöèè,//
0x24,//Îáëàñòü àêòèâèçàöèé ïåðåïîëíåíà,//
0x25,//Íåò àêòèâèçàöèè ñ çàïðàøèâàåìûì íîìåðîì,//
0x28,//Â ÔÐ áîëåå 2õ ñáîéíûõ çàïèñåé,//
0x33,//Íåêîððåêòíûå ïàðàìåòðû â êîìàíäå,//
0x35,//Íåêîððåêòíûé ïàðàìåòð ïðè äàííûõ íàñòðîéêàõ,//
0x36,//Íåêîððåêòíûå ïàðàìåòðû â êîìàíäå äëÿ äàííîé ðåàëèçàöèè ÔÐ,//
0x37,//Êîìàíäà íå ïîääåðæèâàåòñÿ â äàííîé ðåàëèçàöèè ÔÐ,//
0x38,//Îøèáêà â ÏÇÓ,//+
0x39,//Âíóòðåííÿÿ îøèáêà ÏÎ ÔÐ,//
0x3A,//Ïåðåïîëíåíèå íàêîïëåíèÿ ïî íàäáàâêàì â ñìåíå,//
0x3C,//ÝÊËÇ: íåâåðíûé ðåãèñòðàöèîííûé íîìåð,//
0x3E,//Ïåðåïîëíåíèå íàêîïëåíèÿ ïî ñåêöèÿì â ñìåíå,//
0x3F,//Ïåðåïîëíåíèå íàêîïëåíèÿ ïî ñêèäêàì â ñìåíå,//
0x40,//Ïåðåïîëíåíèå äèàïàçîíà ñêèäîê,//
0x41,//Ïåðåïîëíåíèå äèàïàçîíà îïëàòû íàëè÷íûìè,//
0x42,//Ïåðåïîëíåíèå äèàïàçîíà îïëàòû òèïîì 2,//
0x43,//Ïåðåïîëíåíèå äèàïàçîíà îïëàòû òèïîì 3,//
0x44,//Ïåðåïîëíåíèå äèàïàçîíà îïëàòû òèïîì 4
0x45,//Cóììà âñåõ òèïîâ îïëàòû ìåíüøå èòîãà ÷åêà,//
0x46,//Íå õâàòàåò íàëè÷íîñòè â êàññå,//
0x47,//Ïåðåïîëíåíèå íàêîïëåíèÿ ïî íàëîãàì â ñìåíå,//
0x48,//Ïåðåïîëíåíèå èòîãà ÷åêà,//
0x4A,//Îòêðûò ÷åê - îïåðàöèÿ íåâîçìîæíà,//
0x4B,//Áóôåð ÷åêà ïåðåïîëíåí,//
0x4C,//Ïåðåïîëíåíèå íàêîïëåíèÿ ïî îáîðîòó íàëîãîâ â ñìåíå,//
0x4D,//Âíîñèìàÿ áåçíàëè÷íîé îïëàòîé ñóììà áîëüøå ñóììû ÷åêà,//
0x4E,//Ñìåíà ïðåâûñèëà 24 ÷àñà,//
0x4F,//Íåâåðíûé ïàðîëü,//
0x50,//Èäåò ïå÷àòü ïðåäûäóùåé êîìàíäû,//
0x51,//Ïåðåïîëíåíèå íàêîïëåíèé íàëè÷íûìè â ñìåíå,//
0x52,//Ïåðåïîëíåíèå íàêîïëåíèé ïî òèïó îïëàòû 2 â ñìåíå,//
0x53,//Ïåðåïîëíåíèå íàêîïëåíèé ïî òèïó îïëàòû 3 â ñìåíå,//
0x54,//Ïåðåïîëíåíèå íàêîïëåíèé ïî òèïó îïëàòû 4 â ñìåíå,//
0x56,//Íåò äîêóìåíòà äëÿ ïîâòîðà,//
0x57,//ÝÊËÇ: êîëè÷åñòâî çàêðûòûõ ñìåí íå ñîâïàäàåò ñ ÔÏ,//
0x58,//Îæèäàíèå êîìàíäû ïðîäîëæåíèÿ ïå÷àòè,//
0x59,//Äîêóìåíò îòêðûò äðóãèì îïåðàòîðîì,//
0x5B,//Ïåðåïîëíåíèå äèàïàçîíà íàäáàâîê,//
0x5C,//Ïîíèæåíî íàïðÿæåíèå 24Â
0x5D,//Òàáëèöà íå îïðåäåëåíà,//
0x5E,//Íåêîððåêòíàÿ îïåðàöèÿ,//
0x5F,//Îòðèöàòåëüíûé èòîã ÷åêà,//
0x60,//Ïåðåïîëíåíèå ïðè óìíîæåíèè,//
0x61,//Ïåðåïîëíåíèå äèàïàçîíà öåíû,//
0x62,//Ïåðåïîëíåíèå äèàïàçîíà êîëè÷åñòâà,//
0x63,//Ïåðåïîëíåíèå äèàïàçîíà îòäåëà,//
0x64,//ÔÏ îòñóòñòâóåò,//+
0x65,//Íå õâàòàåò äåíåã â ñåêöèè,//
0x66,//Ïåðåïîëíåíèå äåíåã â ñåêöèè,//
0x67,//Îøèáêà ñâÿçè ñ ÔÏ,//+
0x68,//Íå õâàòàåò äåíåã ïî îáîðîòó íàëîãîâ,//
0x69,//Ïåðåïîëíåíèå äåíåã ïî îáîðîòó íàëîãîâ,//
0x6A,//Îøèáêà ïèòàíèÿ â ìîìåíò îòâåòà ïî I
0x6B,//Íåò ÷åêîâîé ëåíòû,//
0x6C,//Íåò êîíòðîëüíîé ëåíòû,//
0x6D,//Íå õâàòàåò äåíåã ïî íàëîãó,//
0x6E,//Ïåðåïîëíåíèå äåíåã ïî íàëîãó,//
0x6F,//Ïåðåïîëíåíèå ïî âûïëàòå â ñìåíå,//
0x70,//Ïåðåïîëíåíèå ÔÏ,//
0x71,//Îøèáêà îòðåç÷èêà,//+
0x72,//Êîìàíäà íå ïîääåðæèâàåòñÿ â äàííîì ïîäðåæèìå,//
0x73,//Êîìàíäà íå ïîääåðæèâàåòñÿ â äàííîì ðåæèìå,//
0x74,//Îøèáêà ÎÇÓ,//
0x75,//Îøèáêà ïèòàíèÿ,//+
0x76,//Îøèáêà ïðèíòåðà: íåò èìïóëüñîâ ñ òàõîãåíåðàòîðà,//+
0x77,//Îøèáêà ïðèíòåðà: íåò ñèãíàëà ñ äàò÷èêîâ,//+
0x78,//Çàìåíà ÏÎ,//
0x79,//Çàìåíà ÔÏ,//
0x7A,//Ïîëå íå ðåäàêòèðóåòñÿ
0x7B,//Îøèáêà îáîðóäîâàíèÿ,//
0x7C,//Íå ñîâïàäàåò äàòà,//
0x7D,//Íåâåðíûé ôîðìàò äàòû,//
0x7E,//Íåâåðíîå çíà÷åíèå â ïîëå äëèíû,//
0x7F,//Ïåðåïîëíåíèå äèàïàçîíà èòîãà ÷åêà,//
0x80,//Îøèáêà ñâÿçè ñ ÔÏ,//+
0x81,//Îøèáêà ñâÿçè ñ ÔÏ,//+
0x82,//Îøèáêà ñâÿçè ñ ÔÏ,//+
0x83,//Îøèáêà ñâÿçè ñ ÔÏ,//+
0x84,//Ïåðåïîëíåíèå íàëè÷íîñòè,//
0x85,//Ïåðåïîëíåíèå ïî ïðîäàæàì â ñìåíå,//
0x86,//Ïåðåïîëíåíèå ïî ïîêóïêàì â ñìåíå,//
0x87,//Ïåðåïîëíåíèå ïî âîçâðàòàì ïðîäàæ â ñìåíå,//
0x88,//Ïåðåïîëíåíèå ïî âîçâðàòàì ïîêóïîê â ñìåíå,//
0x89,//Ïåðåïîëíåíèå ïî âíåñåíèþ â ñìåíå,//
0x8A,//Ïåðåïîëíåíèå ïî íàäáàâêàì â ÷åêå,//
0x8B,//Ïåðåïîëíåíèå ïî ñêèäêàì â ÷åêå,//
0x8C,//Îòðèöàòåëüíûé èòîã íàäáàâêè â ÷åêå,//
0x8D,//Îòðèöàòåëüíûé èòîã ñêèäêè â ÷åêå,//
0x8E,//Íóëåâîé èòîã ÷åêà,//
0x8F,//Êàññà íå ôèñêàëèçèðîâàíà,//,//
0x90,//Ïîëå ïðåâûøàåò ðàçìåð, óñòàíîâëåííûé â íàñòðîéêàõ
0x91,//Âûõîä çà ãðàíèöó ïîëÿ ïå÷àòè ïðè äàííûõ íàñòðîéêàõ øðèôòà
0x92,//Íàëîæåíèå ïîëåé
0x93,//Âîññòàíîâëåíèå ÎÇÓ ïðîøëî óñïåøíî
0x94,//Èñ÷åðïàí ëèìèò îïåðàöèé â ÷åêå
0xA0,//Îøèáêà ñâÿçè ñ ÝÊËÇ
0xA1,//ÝÊËÇ îòñóòñòâóåò
0xA2,//ÝÊËÇ: Íåêîððåêòíûé ôîðìàò èëè ïàðàìåòð êîìàíäû
0xA3,//Íåêîððåêòíîå ñîñòîÿíèå ÝÊËÇ
0xA4,//Àâàðèÿ ÝÊËÇ
0xA5,//Àâàðèÿ ÊÑ â ñîñòàâå ÝÊËÇ
0xA6,//Èñ÷åðïàí âðåìåííîé ðåñóðñ ÝÊËÇ
0xA7,//ÝÊËÇ ïåðåïîëíåíà
0xA8,//ÇÊËÇ: Íåâåðíûå äàòà è âðåìÿ
0xA9,//ÝÊËÇ: Íåò çàïðîøåííûõ äàííûõ
0xAA,//Ïåðåïîëíåíèå ÝÊËÇ (îòðèöàòåëüíûé èòîã äîêóìåíòà)
0xB0,//ÝÊËÇ: Ïåðåïîëíåíèå â ïàðàìåòðå êîëè÷åñòâî
0xB1,//ÝÊËÇ: Ïåðåïîëíåíèå â ïàðàìåòðå ñóììà
0xB2,//ÝÊËÇ: Óæå àêòèâèçèðîâàíà
0xC0,//Êîíòðîëü äàòû è âðåìåíè (ïîäòâåðäèòå äàòó è âðåìÿ)
0xC1,//ÝÊËÇ: ñóòî÷íûé îò÷?ò ñ ãàøåíèåì ïðåðâàòü íåëüçÿ
0xC2,//Ïðåâûøåíèå íàïðÿæåíèÿ â áëîêå ïèòàíèÿ
0xC3,//Íåñîâïàäåíèå èòîãîâ ÷åêà è ÝÊËÇ
0xC4,//Íåñîâïàäåíèå íîìåðîâ ñìåí
//0xC5,//Áóôåð ïîäêëàäíîãî äîêóìåíòà ïóñò
//0xC6,//Ïîäêëàäíîé äîêóìåíò îòñóòñòâóåò,//
//0xC7,//Ïîëå íå ðåäàêòèðóåòñÿ â äàííîì ðåæèìå
//0xC8,//Îòñóòñòâóþò,//èìïóëüñû îò òàõîäàò÷èêà
};
// óñòàíîâêà ãëîáàëüíîãî ôëàãà îøèáêè ÔÐ ïî îøèáêè êîäó äðàéâåðà
void SetFiscalErrorByCode(CPU_INT08U err)
{
if (!err) return;
for (unsigned char i=0; i<FR_ERROR_NUMBER; i++)
{
if (error_codes[i] == err)
{
SetErrorFlag(ERROR_FR+i);
break;
}
}
}
// ñáðîñ ãëîáàëüíîãî ôëàãà îøèáêè ÔÐ ïî îøèáêè êîäó äðàéâåðà
void ClrFiscalErrorByCode(CPU_INT08U err)
{
for (unsigned char i=0; i<FR_ERROR_NUMBER; i++)
{
if (error_codes[i] == err)
{
ClrErrorFlag(ERROR_FR+i);
break;
}
}
}
// ïå÷àòü ÷åêà íà ÔÐ
// time òåïåðü â ñåêóíäàõ
int PrintFiscalBill(CPU_INT32U money, CPU_INT32U time)
{
CPU_INT08U err;
CPU_INT64U count = (time*1000)/60;
CPU_INT64U cash = money*100;
CPU_INT64U price = (CPU_INT64U)(((double)money*100*60)/time);
CPU_INT08U tax[4] = {0,0,0,0};
CPU_INT32U format = 0;
CPU_INT08U repeat;
FPend();
if (CheckFiscalStatus() < 0)
{
FPost();
return -100;
}
repeat = 0;
repeat_open:
if (FiscOpenBill(DEFAULT_PASS, FISC_BILL_SELL, &err) != FISC_OK)
{
if (err)
{
// îøèáêà
SetFiscalErrorByCode(err);
}
else
{
// íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
}
if (repeat)
{
FPost();
return -1;
}
repeat++;
}
if (repeat)
{
if (CheckFiscalStatus() == 0)
{
goto repeat_open;
}
else
{
FPost();
return -200;
}
}
GetData(&BillFormatDesc, &format, 0, DATA_FLAG_SYSTEM_INDEX);
if (format == 0)
{
repeat = 0;
repeat_sell1:
// ïå÷àòàåì êîëè÷åñòâî ìèíóò
if (FiscMakeSell(DEFAULT_PASS, &count, &price, 0, &tax[0], "Óñëóãè ñîëÿðèÿ, ìèí.", &err) != FISC_OK)
{
if (err)
{
SetFiscalErrorByCode(err);
}
else
{
// íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
}
if (repeat)
{
FPost();
return -2;
}
repeat++;
}
if (repeat)
{
if (CheckFiscalStatus() == 0)
{
goto repeat_sell1;
}
else
{
FPost();
return -300;
}
}
}
else if (format == 1)
{
repeat = 0;
repeat_sell2:
// ïå÷àòàåì òîëüêî îáùóþ ñóììó
count = 1000;
price = money*100;
if (FiscMakeSell(DEFAULT_PASS, &count, &price, 0, &tax[0], "Óñëóãè ñîëÿðèÿ", &err) != FISC_OK)
{
if (err)
{
SetFiscalErrorByCode(err);
}
else
{
// íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
}
if (repeat)
{
FPost();
return -3;
}
repeat++;
}
if (repeat)
{
if (CheckFiscalStatus() == 0)
{
goto repeat_sell2;
}
else
{
FPost();
return -400;
}
}
}
repeat = 0;
repeat_close:
if (FiscCloseBill(DEFAULT_PASS, &cash, &tax[0], "Ñïàñèáî çà ïîêóïêó!!!", &err) != FISC_OK)
{
if (err)
{
SetFiscalErrorByCode(err);
}
else
{
// íåò ñîåäèíåíèÿ
ClearFiscalErrors();
FiscalConnState = FISCAL_NOCONN;
SetErrorFlag(ERROR_FR_CONN);
}
if (repeat)
{
FPost();
return -4;
}
repeat++;
}
if (repeat)
{
if (CheckFiscalStatus() == 0)
{
goto repeat_close;
}
else
{
FPost();
return -400;
}
}
FPost();
return 0;
}
/*
// ïå÷àòü ÷åêà íà ÔÐ ñ ïîâòîðàìè, íà ñëó÷àé çàêðûòèÿ ñìåíû
int PrintFiscalBillRepeated(CPU_INT32U money, CPU_INT32U time)
{
int res = PrintFiscalBill(money, time);
int i=4;
while ((res != 0) && (i>0))
{
OSTimeDly(5000);
res = PrintFiscalBill(money, time);
i--;
}
return res;
}
*/
int TstFiscalErrorByCode(unsigned char code)
{
for (unsigned char i=0; i<FR_ERROR_NUMBER; i++)
{
if (error_codes[i] == code)
{
return TstErrorFlag(ERROR_FR+i);
}
}
return 0;
}
CPU_INT08U GetFiscalErrorNumberByCode(unsigned char code)
{
for (unsigned char i=0; i<FR_ERROR_NUMBER; i++)
{
if (error_codes[i] == code)
{
return i;
}
}
return 0;
}
#define FR_CRITICAL_ERROR_NUM 70
const CPU_INT08U FiscalCriticalErrorsTable[FR_CRITICAL_ERROR_NUM] = {
FR_ERROR_CODE_1,
FR_ERROR_CODE_2,
FR_ERROR_CODE_6,
FR_ERROR_CODE_a,
FR_ERROR_CODE_b,
FR_ERROR_CODE_11,
FR_ERROR_CODE_13,
FR_ERROR_CODE_14,
FR_ERROR_CODE_17,
FR_ERROR_CODE_18,
FR_ERROR_CODE_1a,
FR_ERROR_CODE_1c,
FR_ERROR_CODE_1d,
FR_ERROR_CODE_1f,
FR_ERROR_CODE_23,
FR_ERROR_CODE_24,
FR_ERROR_CODE_38,
FR_ERROR_CODE_39,
FR_ERROR_CODE_3a,
FR_ERROR_CODE_3c,
FR_ERROR_CODE_3e,
FR_ERROR_CODE_3f,
FR_ERROR_CODE_40,
FR_ERROR_CODE_41,
FR_ERROR_CODE_42,
FR_ERROR_CODE_43,
FR_ERROR_CODE_44,
FR_ERROR_CODE_47,
FR_ERROR_CODE_48,
FR_ERROR_CODE_4c,
FR_ERROR_CODE_4e,
FR_ERROR_CODE_51,
FR_ERROR_CODE_52,
FR_ERROR_CODE_53,
FR_ERROR_CODE_54,
FR_ERROR_CODE_57,
FR_ERROR_CODE_5b,
FR_ERROR_CODE_64,
FR_ERROR_CODE_67,
FR_ERROR_CODE_6a,
FR_ERROR_CODE_6b,
FR_ERROR_CODE_70,
FR_ERROR_CODE_71,
FR_ERROR_CODE_74,
FR_ERROR_CODE_75,
FR_ERROR_CODE_76,
FR_ERROR_CODE_77,
FR_ERROR_CODE_78,
FR_ERROR_CODE_79,
FR_ERROR_CODE_7b,
FR_ERROR_CODE_80,
FR_ERROR_CODE_81,
FR_ERROR_CODE_82,
FR_ERROR_CODE_83,
FR_ERROR_CODE_87,
FR_ERROR_CODE_88,
FR_ERROR_CODE_89,
FR_ERROR_CODE_8a,
FR_ERROR_CODE_8b,
FR_ERROR_CODE_a0,
FR_ERROR_CODE_a1,
FR_ERROR_CODE_a3,
FR_ERROR_CODE_a4,
FR_ERROR_CODE_a5,
FR_ERROR_CODE_a6,
FR_ERROR_CODE_a7,
FR_ERROR_CODE_a8,
FR_ERROR_CODE_a9,
FR_ERROR_CODE_c2,
FR_ERROR_CODE_c4
};
// ïðîâåðêà êðèòè÷åêèõ ôëàãîâ ÔÐ
int TstCriticalFiscalError(void)
{
int res = 0;
for (CPU_INT08U i=0; i<FR_CRITICAL_ERROR_NUM; i++)
{
res |= TstFiscalErrorByCode(FiscalCriticalErrorsTable[i]);
}
return res;
}
// ïîëó÷åíèå ïåðâîãî ïî ïîðÿäêó êðèòè÷åñêîãî ôëàãà ÔÐ
int GetFirstCriticalFiscalError(CPU_INT08U *err)
{
int res = 0;
*err = 0;
for (CPU_INT08U i=0; i<FR_CRITICAL_ERROR_NUM; i++)
{
res = TstFiscalErrorByCode(FiscalCriticalErrorsTable[i]);
if (res) {*err = ERROR_FR+GetFiscalErrorNumberByCode(FiscalCriticalErrorsTable[i]); break;}
}
return res;
}