mirror of
https://github.com/dimoniche/solarium.git
synced 2026-01-30 01:43:30 +03:00
983 lines
26 KiB
C
983 lines
26 KiB
C
#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;
|
||
}
|