616 lines
18 KiB
C

#include <includes.h>
#include <stddef.h>
#include "journal.h"
#include "fram.h"
#include "fram_map.h"
#include "time.h"
#include "fr.h"
#include "crc16.h"
#include "mode.h"
#ifdef CONFIG_FTP_CLIENT_ENABLE
#include "ftp_app.h"
#endif
static CPU_INT32U GlobalErrorsFlags[JOURNAL_EVENTS_COUNT / 32 + 1] = {0};
static CPU_INT32U PrevFlags[JOURNAL_EVENTS_COUNT / 32 + 1] = {0};
CPU_INT32U journal_rec_index;
OS_EVENT *JournalLock = NULL;
void journal_getSem()
{
CPU_INT08U err;
do{
OSSemPend(JournalLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}while (err);
}
void journal_freeSem()
{
OSSemPost(JournalLock);
}
void SetErrorFlag(CPU_INT08U error)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
GlobalErrorsFlags[error/32] |= (1L << (error%32));
OS_EXIT_CRITICAL();
}
void ClrErrorFlag(CPU_INT08U error)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
GlobalErrorsFlags[error/32] &= ~(1L << (error%32));
OS_EXIT_CRITICAL();
}
int TstErrorFlag(CPU_INT08U error)
{
CPU_INT32U temp = 0;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
temp = GlobalErrorsFlags[error/32] & (1L << (error%32));
OS_EXIT_CRITICAL();
return temp;
}
int TstCriticalErrors(void)
{
CPU_INT32U errors = 0;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
CPU_INT32U ignore_fiscal = 0;
GetData(&DisableFiscalErrorsDesc, &ignore_fiscal, 0, DATA_FLAG_SYSTEM_INDEX);
OS_ENTER_CRITICAL();
if (!ignore_fiscal)
{
errors |= TstCriticalFiscalError();
errors |= TstErrorFlag(ERROR_FR_CONN);
/*
if (!FReportTest())
{ // ÔÐ íåäîñòóïåí äëÿ ëþáîé ïå÷àòè
errors |= 0x1;
}
*/
}
errors |= TstErrorFlag(ERROR_VALIDATOR_CONN);
OS_EXIT_CRITICAL();
if (errors) return 1;
return 0;
}
int TstCriticalValidatorErrors(void)
{
return 0;
}
void ClrValidatorErrors(void)
{
for (CPU_INT08U i=ERROR_VALIDATOR_FAILURE; i<ERROR_MODEM_CONN; ++i)
{
ClrErrorFlag(i);
}
}
// ïîëó÷èòü çàïèñü èç æóðíàëà ñîáûòèé
int GetEventRecord(TEventRecord* record, CPU_INT32U index)
{
if (index >= EVENT_RECORDS_COUNT) return -1;
journal_getSem();
ReadArrayFram(offsetof(TFramMap, EventRecords[0])+index*sizeof(TEventRecord), sizeof(TEventRecord), (unsigned char*)record);
journal_freeSem();
return 0;
}
void SaveEventAbonementRecord(CPU_INT08U event,
CPU_INT16U money, CPU_INT16U bonus, CPU_INT08U type_abonement,
CPU_INT32U time_before, CPU_INT32U number_abonement)
{
TEventRecord record;
journal_getSem();
record.time = GetTimeSec();
record.type_abonement = type_abonement;
record.event = event;
record.money = money;
record.bonus = bonus;
record.time_before = time_before;
record.number_abonement = number_abonement;
WriteArrayFram(offsetof(TFramMap, EventRecords[0])+journal_rec_index*sizeof(TEventRecord), sizeof(TEventRecord), (unsigned char*)&record);
journal_rec_index = (journal_rec_index + 1) % EVENT_RECORDS_COUNT;
#ifdef CONFIG_FTP_CLIENT_ENABLE
if ((journal_rec_index == 0) || (journal_rec_index == EVENT_RECORDS_COUNT / 2))
{
time_to_ftp = FTP_FLAG_SEND_COUNTERS | FTP_FLAG_SEND_LOGS;
}
#endif
journal_freeSem();
}
// çàïèñü â æóðíàë çàïèñè î ñîáûòèè
void SaveEventRecord(CPU_INT08U channel, CPU_INT08U event, CPU_INT16U data)
{
TEventRecord record;
journal_getSem();
record.time = GetTimeSec();
record.channel = channel;
record.event = event;
record.data = data;
WriteArrayFram(offsetof(TFramMap, EventRecords[0])+journal_rec_index*sizeof(TEventRecord), sizeof(TEventRecord), (unsigned char*)&record);
journal_rec_index = (journal_rec_index + 1) % EVENT_RECORDS_COUNT;
#ifdef CONFIG_FTP_CLIENT_ENABLE
if ((journal_rec_index == 0) || (journal_rec_index == EVENT_RECORDS_COUNT / 2))
{
time_to_ftp = FTP_FLAG_SEND_COUNTERS | FTP_FLAG_SEND_LOGS;
}
#endif
journal_freeSem();
}
void ClearEventJournal(void)
{
journal_getSem();
SetArrayFram(offsetof(TFramMap, EventRecords), sizeof(TEventRecord)*EVENT_RECORDS_COUNT, 0x00);
journal_freeSem();
}
void GetEventStr(char* str, char event)
{
switch (event){
case JOURNAL_CANSEL_BILL:
strcpy(str, "Îòìåíà ÷åêà");
break;
case JOURNAL_EVENT_FTP_SEND:
strcpy(str, "Îòïðàâêà íà FTP");
break;
case JOURNAL_EVENT_SOLARIUM_CLEANING_START:
sprintf(str, "Íà÷àëî óáîðêè ");
break;
case JOURNAL_EVENT_SOLARIUM_CLEANING_END:
sprintf(str, "Êîíåö óáîðêè ");
break;
case JOURNAL_EVENT_SOLARIUM_SERVICE_START:
sprintf(str, "Íà÷àëî ñåðâ.");
break;
case JOURNAL_EVENT_SOLARIUM_SERVICE_END:
sprintf(str, "Êîíåö ñåðâ.");
break;
case JOURNAL_EVENT_SOLARIUM_TESTMODE_START:
sprintf(str, "Íà÷àëî òåñòà ");
break;
case JOURNAL_EVENT_SOLARIUM_TESTMODE_END:
sprintf(str, "Êîíåö òåñòà ");
break;
case JOURNAL_EVENT_POST_UNAVIABLE:
sprintf(str, "Íåäîñòóïåí ïîñò");
break;
case JOURNAL_EVENT_MONEY_NOTE:
sprintf(str, "Âí.êóïþðà ");
break;
case JOURNAL_EVENT_MONEY_COIN:
sprintf(str, "Âí.ìîíåòû ");
break;
case JOURNAL_EVENT_CARD_ACCEPTED:
sprintf(str, "Áàíê.îïëàòà ");
break;
case JOURNAL_EVENT_CARD_REJECTED:
sprintf(str, "Áàíê.îïëàòà ");
break;
case JOURNAL_EVENT_ABONEMENT_ACCEPTED:
sprintf(str, "ÁÊÇ.îïëàòà ");
break;
case JOURNAL_EVENT_ABONEMENT_REJECTED:
sprintf(str, "ÁÊÇ.îïëàòà ");
break;
case JOURNAL_EVENT_ABONEMENT_PAY_ACCEPTED:
sprintf(str, "ÁÊÇ.ïîïîëíåíèå ");
break;
case JOURNAL_EVENT_ABONEMENT_PAY_REJECTED:
sprintf(str, "ÁÊÇ.ïîïîëíåíèå ");
break;
case JOURNAL_EVENT_ABONEMENT_BALANCE:
sprintf(str, "ÁÊÇ.áàëàíñ ");
break;
case JOURNAL_EVENT_ABONEMENT_WRONG:
sprintf(str, "ÁÊÇ.êàðòà ");
break;
case JOURNAL_EVENT_START_SESSION:
#if defined(BOARD_CENTRAL_CARWASH)
sprintf(str, "Íà÷.ðàáîòû ");
#elif defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
sprintf(str, "Íà÷.ñåàíñà ");
#endif
break;
case JOURNAL_EVENT_END_SESSION:
#if defined(BOARD_CENTRAL_CARWASH)
sprintf(str, "Êîí.áëîê. ");
#elif defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
sprintf(str, "Êîíåö ñåàíñà ");
#endif
break;
case JOURNAL_EVENT_DEVICE_ON:
#if defined(BOARD_CENTRAL_CARWASH)
sprintf(str, "Âêëþ÷åíèå");
#elif defined(BOARD_SOLARIUM_WEB)
sprintf(str, "ÂÊËÞ×ÅÍÈÅ");
#endif
break;
case JOURNAL_EVENT_PRINT_BILL:
sprintf(str, "Ïå÷àòü ÷åêà");
break;
case JOURNAL_EVENT_PRINT_Z:
sprintf(str, "Ïå÷àòü Z-îò÷åòà");
break;
case JOURNAL_EVENT_PRINT_X:
sprintf(str, "Ïå÷àòü X-îò÷åòà");
break;
case JOURNAL_EVENT_PRINT_BUF:
sprintf(str, "Ïå÷àòü îò÷.èç áóô.");
break;
case JOURNAL_EVENT_CHANGE_MODE:
sprintf(str, "Ñìåíà ðåæèìà");
break;
case JOURNAL_EVENT_INCASSATION:
sprintf(str, "Èíêàññàöèÿ");
break;
case JOURNAL_EVENT_PASS_FAIL:
sprintf(str, "Íåâåðíûé ïàðîëü");
break;
case JOURNAL_EVENT_EMAIL_FAIL:
sprintf(str, "Îøèáêà îòïð.e-mail");
break;
case JOURNAL_EVENT_EMAIL_OK:
sprintf(str, "E-mail îòïð.óñïåøíî");
break;
default:
sprintf(str, "íåò");
break;
}
}
void GetEventStrEng(char* str, char event)
{
switch (event){
case JOURNAL_EVENT_MONEY_NOTE:
sprintf(str, " | Vnesena kupura ");
break;
case JOURNAL_EVENT_MONEY_COIN:
sprintf(str, " | Vneseny monety ");
break;
case JOURNAL_EVENT_START_SESSION:
sprintf(str, " | Nachalo seansa ");
break;
case JOURNAL_EVENT_END_SESSION:
sprintf(str, " | Koneñ seansa ");
break;
case JOURNAL_EVENT_DEVICE_ON:
sprintf(str, " | Vkluchenie ");
break;
case JOURNAL_EVENT_PRINT_BILL:
sprintf(str, " | Pechat' checka ");
break;
case JOURNAL_EVENT_PRINT_Z:
sprintf(str, " | Pechat' Z-otcheta ");
break;
case JOURNAL_EVENT_PRINT_X:
sprintf(str, " | Pechat' X-otcheta ");
break;
case JOURNAL_EVENT_PRINT_BUF:
sprintf(str, " | Pechat' otcheta iz bufera ");
break;
case JOURNAL_EVENT_CHANGE_MODE:
sprintf(str, " | Smena rejima ");
break;
case JOURNAL_EVENT_INCASSATION:
sprintf(str, " | Incassaciya ");
break;
case JOURNAL_EVENT_PASS_FAIL:
sprintf(str, " | Neverniy parol' ");
break;
case JOURNAL_EVENT_EMAIL_FAIL:
sprintf(str, " | Oshibka otpravki e-mail ");
break;
case JOURNAL_EVENT_EMAIL_OK:
sprintf(str, " | E-mail otpravleno uspeshno ");
break;
default:
sprintf(str, " | Net sobytiya ");
break;
}
}
void PrintEventJournalRecordEng(char* str, TEventRecord *record)
{
if (record->event)
{
TRTC_Data rtc_data;
// íàïå÷àòàåì âðåìÿ
Sec2Date(&rtc_data, record->time);
sprintf(str, "| ");
PrintRTCDateTimeString(&str[strlen(str)], &rtc_data);
// íàïå÷àòàåì ñîáûòèå
GetEventStrEng(&str[strlen(str)], record->event);
// íàïå÷àòàåì äîïîëíèòåëüíûå ïîëÿ
if ((record->event == JOURNAL_EVENT_MONEY_NOTE) || (record->event == JOURNAL_EVENT_MONEY_COIN))
{
sprintf(&str[strlen(str)], "kanal %d ", record->channel+1);
sprintf(&str[strlen(str)], "%d rub.", record->data);
}
else if (record->event == JOURNAL_EVENT_START_SESSION)
{
sprintf(&str[strlen(str)], "kanal %d ", record->channel+1);
PrintSecToHourMinSec(&str[strlen(str)], record->data);
}
else if (record->event == JOURNAL_EVENT_END_SESSION)
{
sprintf(&str[strlen(str)], "kanal %d ", record->channel+1);
sprintf(&str[strlen(str)], "");
}
else if (record->event == JOURNAL_EVENT_DEVICE_ON)
{
sprintf(&str[strlen(str)], "");
}
else if (record->event == JOURNAL_EVENT_PRINT_BILL)
{
sprintf(&str[strlen(str)], "kanal %d ", record->channel+1);
}
else if (record->event == JOURNAL_EVENT_PRINT_Z)
{
sprintf(&str[strlen(str)], "");
}
else if (record->event == JOURNAL_EVENT_PRINT_X)
{
sprintf(&str[strlen(str)], "");
}
else if (record->event == JOURNAL_EVENT_PRINT_BUF)
{
sprintf(&str[strlen(str)], "");
}
else if (record->event == JOURNAL_EVENT_CHANGE_MODE)
{
if (record->data == MODE_WORK) sprintf(&str[strlen(str)], "rabota");
else sprintf(&str[strlen(str)], "nastroika");
}
else if (record->event == JOURNAL_EVENT_INCASSATION)
{
sprintf(&str[strlen(str)], "%u rub.", record->data);
}
else if (record->event == JOURNAL_EVENT_PASS_FAIL)
{
sprintf(&str[strlen(str)], "%u", record->data);
}
else if ((record->event == JOURNAL_EVENT_EMAIL_OK) || (record->event == JOURNAL_EVENT_EMAIL_FAIL))
{
sprintf(&str[strlen(str)], "");
}
sprintf(&str[strlen(str)], "\r\n");
}
else
{ // ïóñòàÿ çàïèñü
sprintf(str, "net zapisi\r\n");
}
}
void IncCounter(CPU_INT08U ch, CPU_INT32U time, CPU_INT32U money, CPU_INT08U card)
{
CPU_INT32U r, t, m;
TCountersLong long_ctrs;
journal_getSem();
// óâåëè÷èì êàíàëüíûå ñ÷åò÷èêè
ReadArrayFram(offsetof(TFramMap, Counters.CounterChannelRun)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&r);
ReadArrayFram(offsetof(TFramMap, Counters.CounterChannelTime)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&t);
r++;
t+=time;
WriteArrayFram(offsetof(TFramMap, Counters.CounterChannelRun)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&r);
WriteArrayFram(offsetof(TFramMap, Counters.CounterChannelTime)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&t);
if (card == 2)
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterChannelAbonement)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterChannelAbonement)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
}
else if (card)
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterChannelCard)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterChannelCard)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
}
else
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterChannelMoney)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterChannelMoney)+sizeof(CPU_INT32U)*ch, sizeof(CPU_INT32U), (unsigned char*)&m);
}
// óâåëè÷èì îáùèå ñ÷åò÷èêè
ReadArrayFram(offsetof(TFramMap, Counters.CounterRun), sizeof(CPU_INT32U), (unsigned char*)&r);
ReadArrayFram(offsetof(TFramMap, Counters.CounterTime), sizeof(CPU_INT32U), (unsigned char*)&t);
r++;
t+=time;
WriteArrayFram(offsetof(TFramMap, Counters.CounterRun), sizeof(CPU_INT32U), (unsigned char*)&r);
WriteArrayFram(offsetof(TFramMap, Counters.CounterTime), sizeof(CPU_INT32U), (unsigned char*)&t);
if (card == 2)
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterAbonement), sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterAbonement), sizeof(CPU_INT32U), (unsigned char*)&m);
}
else if (card)
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterCard), sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterCard), sizeof(CPU_INT32U), (unsigned char*)&m);
}
else
{
ReadArrayFram(offsetof(TFramMap, Counters.CounterMoney), sizeof(CPU_INT32U), (unsigned char*)&m);
m+=money;
WriteArrayFram(offsetof(TFramMap, Counters.CounterMoney), sizeof(CPU_INT32U), (unsigned char*)&m);
}
// óâåëè÷èì äëèííûå ñ÷åò÷èêè
ReadArrayFram(offsetof(TFramMap, CountersLong), sizeof(TCountersLong), (unsigned char*)&long_ctrs);
long_ctrs.CounterChannelRunLong[ch]++;
long_ctrs.CounterChannelTimeLong[ch] += time;
long_ctrs.CounterRunLong++;
long_ctrs.CounterTimeLong += time;
if (card == 2)
{
long_ctrs.CounterChannelAbonementLong[ch] += money;
long_ctrs.CounterAbonementLong += money;
}
else if (card)
{
long_ctrs.CounterChannelCardLong[ch] += money;
long_ctrs.CounterCardLong += money;
}
else
{
long_ctrs.CounterChannelMoneyLong[ch] += money;
long_ctrs.CounterMoneyLong += money;
}
long_ctrs.crc = CRC16((unsigned char*)&long_ctrs, offsetof(TCountersLong, crc));
WriteArrayFram(offsetof(TFramMap, CountersLong), sizeof(TCountersLong), (unsigned char*)&long_ctrs);
journal_freeSem();
}
void CheckLongCounters(void)
{
TCountersLong long_ctrs;
CPU_INT16U crc;
ReadArrayFram(offsetof(TFramMap, CountersLong), sizeof(TCountersLong), (unsigned char*)&long_ctrs);
crc = CRC16((unsigned char*)&long_ctrs, offsetof(TCountersLong, crc));
if (crc != long_ctrs.crc)
{
memset(&long_ctrs, 0, sizeof(TCountersLong));
long_ctrs.crc = CRC16((unsigned char*)&long_ctrs, offsetof(TCountersLong, crc));
WriteArrayFram(offsetof(TFramMap, CountersLong), sizeof(TCountersLong), (unsigned char*)&long_ctrs);
/// îáû÷íûå ñ÷åò÷èêè òîæå î÷èñòèì
ClearCounters();
ClearBillnomCounter();
}
}
void ClearCounters(void)
{
journal_getSem();
SetArrayFram(offsetof(TFramMap, Counters), sizeof(CPU_INT32U)*(CHANNELS_NUM+1)*4, 0x00);
journal_freeSem();
}
/// èíêðåìåíò ñ÷åò÷èêà êóïþð ïî íîìèíàëàì
void IncBillnomCounter(CPU_INT32U index)
{
CPU_INT32U counter;
if (index >= 24) return;
journal_getSem();
ReadArrayFram(offsetof(TFramMap, Counters.CounterBillNominals)+sizeof(CPU_INT32U)*index, sizeof(CPU_INT32U), (unsigned char*)&counter);
counter++;
WriteArrayFram(offsetof(TFramMap, Counters.CounterBillNominals)+sizeof(CPU_INT32U)*index, sizeof(CPU_INT32U), (unsigned char*)&counter);
ReadArrayFram(offsetof(TFramMap, Counters.BillsCount), sizeof(CPU_INT32U), (unsigned char*)&counter);
counter++;
WriteArrayFram(offsetof(TFramMap, Counters.BillsCount), sizeof(CPU_INT32U), (unsigned char*)&counter);
journal_freeSem();
}
/// î÷èñòêà ñ÷åò÷èêîâ êóïþð
void ClearBillnomCounter(void)
{
CPU_INT32U counter = 0;
CPU_INT32U i;
journal_getSem();
for (i = 0; i < 24; i++)
{
WriteArrayFram(offsetof(TFramMap, Counters.CounterBillNominals)+sizeof(CPU_INT32U)*i, sizeof(CPU_INT32U), (unsigned char*)&counter);
}
WriteArrayFram(offsetof(TFramMap, Counters.BillsCount), sizeof(CPU_INT32U), (unsigned char*)&counter);
journal_freeSem();
}
// ñåðâåð îøèáîê (çàíåñåíèå îøèáîê â æóðíàë)
void ErrorServer(void)
{
for (int i = ERROR_VALIDATOR_CONN; i < JOURNAL_EVENTS_COUNT; i++)
{
if (!(PrevFlags[i/32] & (1L<<(i%32)))
&& (TstErrorFlag(i)))
{
// çàïèøåì â æóðíàë
SaveEventRecord(0, i, 0);
}
}
memcpy(PrevFlags, GlobalErrorsFlags, sizeof(CPU_INT32U) * (JOURNAL_EVENTS_COUNT / 32 + 1));
}
void JournalInit(void)
{
if (!JournalLock) JournalLock = OSSemCreate(1);
journal_getSem();
TEventRecord record;
// íàéòè ñàìóþ ñòàðóþ ïî âðåìåíè çàïèñü è äîáàâèòü íîâóþ ïîñëå íå¸
CPU_INT32U i, ind=0, indm = 0, maxtime = 0;
for (i = 0; i < EVENT_RECORDS_COUNT; i++)
{
ReadArrayFram(offsetof(TFramMap, EventRecords[0])+i*sizeof(TEventRecord), sizeof(TEventRecord), (unsigned char*)&record);
if ((record.time == 0) || (record.time == 0xffffffff)) {ind = i; break;}
if (record.time >= maxtime) {maxtime = record.time; indm = i;}
}
if (i >= EVENT_RECORDS_COUNT)
{
// âñå çàïèñè çàïîëåíû - çàïèñûâàåì íà ìåñòî ñàìîé ñòàðîé
ind = (indm + 1) % EVENT_RECORDS_COUNT;
}
journal_rec_index = ind;
journal_freeSem();
}