второй день разработки

This commit is contained in:
dimoniche 2019-05-31 00:53:38 +03:00
parent c43a2b6898
commit 437ebc4bad
26 changed files with 1731 additions and 5656 deletions

View File

@ -54,8 +54,6 @@ void main (void)
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
}
/*
*********************************************************************************************************
* AppTaskStart()

View File

@ -1,7 +1,5 @@
#include <includes.h>
#include "app_serv.h"
#include "modem.h"
#include "validator.h"
#include "coin.h"
#include "time.h"
#include "fiscal.h"
@ -11,13 +9,10 @@
#include "menudesc.h"
#include "datadesc.h"
#include "control.h"
#include "validator.h"
#include "CCRSProtocol.h"
#include "menu.h"
#include "journal.h"
#include "fr.h"
#include "CRC16.h"
#include "modem_task.h"
#include "host_app.h"
#include "console.h"
#include "keyboard.h"
@ -26,7 +21,7 @@
//#define _DEBUG_MONEY
CPU_INT32U SystemTime;
CPU_INT32U money_timestamp;
CPU_INT32U money_timestamp[COUNT_POST];
CPU_INT08U EnabledChannelsNum;
CPU_INT08U RecentChannel;
CPU_INT08U UserMenuState;
@ -42,7 +37,6 @@ CPU_INT08U ChannelsState[CHANNELS_NUM];
CPU_INT32U ChannelsCounters[CHANNELS_NUM];
CPU_INT32U ChannelsPayedTime[CHANNELS_NUM];
extern CPU_INT32U BillNominals[24];
CPU_INT32U incas_bill_nom_counter[24];
CPU_INT32U incas_common_bill_counter;
@ -53,21 +47,21 @@ OS_EVENT *UserQuery = NULL;
void *UserTbl[USER_QUERY_LEN];
int GetUserEvent(int* event);
void UserPrintMoneyMenu(void);
void UserPrintMoneyMenu(int post);
void WorkServer(void);
void UserPrintThanksMenu(void);
void UserPrintThanksMenu(int post);
void UserPrintFirstMenu(void);
void UserPrintErrorMenu(void);
CPU_INT32U GetChannelsTimeForFree(CPU_INT08U ch);
void LoadAcceptedMoney(void);
void SetAcceptedMoney(CPU_INT32U money);
void ClearAcceptedMoney(void);
CPU_INT32U GetAcceptedMoney(void);
void SetAcceptedMoney(CPU_INT32U money,int post);
void ClearAcceptedMoney(int post);
CPU_INT32U GetAcceptedMoney(int post);
void InitPass(void);
int CheckChannelEnabled(CPU_INT08U channel);
int ChannelBusy(CPU_INT08U ch);
void UserPrintIpDeviceErrMenu(CPU_INT08U post);
void UserPrintPrintBillMenu(void);
void UserPrintPrintBillMenu(int post);
#ifdef BOARD_CENTRAL_CFG
static char incassation;
@ -94,29 +88,6 @@ void AddOutPulses(int count, int len_ms)
#endif
CPU_INT32U FindBillIndex(CPU_INT32U nom)
{
CPU_INT32U cash_mode;
GetData(&CashModeDesc, &cash_mode, 0, DATA_FLAG_SYSTEM_INDEX);
if (cash_mode == 1)
{
// ïðîñòàâèì íîìèíàëû âðó÷íóþ
BillNominals[0] = 10;
BillNominals[1] = 50;
BillNominals[2] = 100;
BillNominals[3] = 500;
BillNominals[4] = 1000;
BillNominals[5] = 5000;
}
for (int i = 0; i < 6; i++)
{
if (BillNominals[i] == nom) return i;
}
return 0xFFFFFFFF;
}
/*!
Ñåðâåð îáðàáîòêè ñîáûòèé ïîëüçîâàòåëÿ
*/
@ -126,38 +97,30 @@ void UserAppTask(void *p_arg)
CPU_INT32U print_mode;
CPU_INT32U accmoney;
int event;
#ifdef BOARD_CENTRAL_CFG
CPU_INT32U temp;
#endif
CPU_BOOLEAN dontRedraw = DEF_FALSE;
#ifdef BOARD_CENTRAL_CFG
static CPU_INT08U fr_conn_ctr = 0;
{
CPU_INT32U m=0;
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
if (m)
{
EnabledChannelsNum = 0;
for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
{
CPU_INT32U en = 0;
GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
if (en) {EnabledChannelsNum++;}
}
UserMenuState = USER_STATE_ACCEPT_MONEY;
}
}
// {
// CPU_INT32U m=0;
// GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_DIRECT_INDEX);
// if (m)
// {
// EnabledChannelsNum = 0;
// for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
// {
// CPU_INT32U en = 0;
// GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
// if (en) {EnabledChannelsNum++;}
// }
// UserMenuState = USER_STATE_ACCEPT_MONEY;
// }
// }
incassation = 0;
was_critical_error = 0;
GetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
if (temp == INCAS_SEND_FLAG)
{
PostModemTask(MODEM_TASK_SEND_INCAS);
}
#endif
while (1)
@ -205,7 +168,6 @@ void UserAppTask(void *p_arg)
// âûêëþ÷èì ïðèåì äåíåã
if (was_critical_error == 0)
{
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
CoinDisable();
was_critical_error = 1;
}
@ -215,197 +177,153 @@ void UserAppTask(void *p_arg)
// âêëþ÷èì çàíîâî ïðèåì äåíåã, åñëè áûëà îøèáêà
if (was_critical_error)
{
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
was_critical_error = 0;
break;
}
accmoney = GetAcceptedMoney();
if (accmoney > 0)
dontRedraw = DEF_FALSE;
for(int post = 0; post < COUNT_POST; post++)
{
LED_OK_ON();
CheckFiscalStatus();
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
if (print_mode == 0)
{
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÒÀÉÌÀÓÒÓ
GetData(&PrintTimeoutDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
if (labs(OSTimeGet() - money_timestamp) > 1000UL * print_timeout)
{
UserPrintPrintBillMenu();
RefreshMenu();
// íàïå÷àòàåì ÷åê
if (IsFiscalConnected())
{
if (PrintFiscalBill(accmoney) == 0)
accmoney = GetAcceptedMoney(post);
if (accmoney > 0)
{
UserPrintMoneyMenu(post);
RefreshMenu();
dontRedraw = DEF_TRUE;
LED_OK_ON();
CheckFiscalStatus();
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
if (print_mode == 0)
{
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÒÀÉÌÀÓÒÓ
GetData(&PrintTimeoutDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
if (labs(OSTimeGet() - money_timestamp[post]) > 1000UL * print_timeout)
{
UserPrintPrintBillMenu(post);
RefreshMenu();
// íàïå÷àòàåì ÷åê
if (IsFiscalConnected())
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_PRINT_BILL, GetTimeSec());
if (PrintFiscalBill(accmoney) == 0)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_PRINT_BILL, GetTimeSec());
}
}
}
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
SetAcceptedMoney(0);
OSTimeDly(1000);
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
if (IsFiscalConnected())
{
UserPrintThanksMenu();
RefreshMenu();
}
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
OSTimeDly(1000);
LED_OK_OFF();
}
}
else if (print_mode == 1)
{
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÊÍÎÏÊÅ, æäåì òàéìàóò îòìåíû
GetData(&PrintTimeoutAfterDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
if (labs(OSTimeGet() - money_timestamp) > 1000UL * print_timeout)
{
SetAcceptedMoney(0);
UserPrintThanksMenu();
RefreshMenu();
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
OSTimeDly(1000);
LED_OK_OFF();
}
}
}
else
{
LED_OK_OFF();
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
SetAcceptedMoney(0, post);
OSTimeDly(1000);
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
if (IsFiscalConnected())
{
UserPrintThanksMenu(post);
RefreshMenu();
}
OSTimeDly(1000);
LED_OK_OFF();
}
}
else if (print_mode == 1)
{
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÊÍÎÏÊÅ, æäåì òàéìàóò îòìåíû
GetData(&PrintTimeoutAfterDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
if (labs(OSTimeGet() - money_timestamp[post]) > 1000UL * print_timeout)
{
SetAcceptedMoney(0, post);
UserPrintThanksMenu(post);
RefreshMenu();
OSTimeDly(1000);
LED_OK_OFF();
}
}
}
else
{
LED_OK_OFF();
}
// ïðèíèìàåì äåíüãè
if(!dontRedraw)
{
UserPrintMoneyMenu(0xFFFF);
RefreshMenu();
}
}
break;
// ïðèíèìàåì äåíüãè
UserPrintMoneyMenu();
RefreshMenu();
break;
case EVENT_INCASSATION:
{
CPU_INT32U incas_sum = 0, temp;
for (CPU_INT32U i = 0; i < 24; i++)
{
CPU_INT32U val = 0;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
incas_sum += val*BillNominals[i];
}
incassation = 1;
sprintf((char*)str_IncasMenu_3, " ÑÓÌÌÀ %u ðóá.", incas_sum);
// âåøàåì ìåíþ èíêàññàöèÿ
GoToMenu(IncasMenuPanel);
// ñîõðàíèì ñîáûòèå ñ óêàçàíèåì ñóììû äåíåã
SaveEventRecord(0, JOURNAL_EVENT_INCASSATION, incas_sum);
GetData(&BillCounterDesc, &incas_common_bill_counter, 0, DATA_FLAG_SYSTEM_INDEX);
for (CPU_INT32U i = 0; i < 24; i++)
{
GetData(&BillnomCountersDesc, &incas_bill_nom_counter[i], i, DATA_FLAG_DIRECT_INDEX);
}
SetData(&IncasMoneyDesc, &incas_sum, 0, DATA_FLAG_SYSTEM_INDEX);
temp = GetTimeSec();
SetData(&IncasTimeDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
temp = INCAS_SEND_FLAG;
SetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
PostModemTask(MODEM_TASK_SEND_INCAS);
// î÷èùàåì ñ÷åò÷èêè êóïþð
ClearBillnomCounter();
}
break;
case EVENT_INCASSATION_FINISH:
incassation = 0;
GoToPreviousMenu();
break;
case EVENT_MODE_CHANGE:
ReInitMenu();
SaveEventRecord(0, JOURNAL_EVENT_CHANGE_MODE, GetMode());
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
break;
case EVENT_COIN_INSERTED:
{
CPU_INT32U cpp = 1;
CPU_INT32U money, accmoney;
GetData(&CoinPerPulseDesc, &cpp, 0, DATA_FLAG_SYSTEM_INDEX);
//money = cpp*GetResetCoinCount();
accmoney = GetAcceptedMoney();
accmoney += money;
SetAcceptedMoney(accmoney);
money_timestamp = OSTimeGet();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu();
RefreshMenu();
}
if (money) SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_COIN, money);
}
break;
case EVENT_CASH_INSERTED:
{
CPU_INT32U cpp = 1;
CPU_INT32U money, accmoney;
GetData(&CashPerPulseDesc, &cpp, 0, DATA_FLAG_SYSTEM_INDEX);
//money = cpp * GetResetCashCount();
accmoney = GetAcceptedMoney();
accmoney += money;
SetAcceptedMoney(accmoney);
money_timestamp = OSTimeGet();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu();
RefreshMenu();
}
if (money) SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_NOTE, money);
CPU_INT32U billnom_index = FindBillIndex(money);
if (billnom_index != 0xFFFFFFFF) IncBillnomCounter(billnom_index);
}
break;
case EVENT_BILL_ESCROW:
// êóïþðà â ïîëîæåíèè âîçâðàòà
if (IsValidatorConnected()) if (!CC_CmdPack(ADDR_FL)) SetErrorFlag(ERROR_VALIDATOR_CONN);
break;
case EVENT_BILL_STACKED:
// êóïþðà óëîæåíà
{
CPU_INT32U billnom_index;
CPU_INT32U note,accmoney;
note = GetResetBillCount(&billnom_index);
accmoney = GetAcceptedMoney();
accmoney += note;
SetAcceptedMoney(accmoney);
money_timestamp = OSTimeGet();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu();
RefreshMenu();
}
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL);
if (note)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_NOTE, note);
IncBillnomCounter(billnom_index);
}
}
break;
case EVENT_KEY_CANSEL:
#if 0
if ((GetMode() != MODE_WORK) || (incassation)) break;
if (TstCriticalErrors())
case EVENT_COIN_INSERTED_POST1:
case EVENT_COIN_INSERTED_POST2:
case EVENT_COIN_INSERTED_POST3:
case EVENT_COIN_INSERTED_POST4:
case EVENT_COIN_INSERTED_POST5:
case EVENT_COIN_INSERTED_POST6:
{
UserPrintErrorMenu();
RefreshMenu();
break;
CPU_INT32U cpp = 1;
CPU_INT32U money, accmoney;
int number_post = event - EVENT_COIN_INSERTED_POST1;
GetData(&CoinPerPulseDesc, &cpp, number_post, DATA_FLAG_DIRECT_INDEX);
money = cpp*GetResetCoinCount(number_post);
accmoney = GetAcceptedMoney(number_post);
accmoney += money;
SetAcceptedMoney(accmoney, number_post);
money_timestamp[number_post] = OSTimeGet();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu(number_post);
RefreshMenu();
}
if (money) SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_COIN_POST1 + number_post, money);
}
UserMenuState = USER_STATE_FIRST_PAGE;
UserPrintFirstMenu();
RefreshMenu();
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
#endif
break;
case EVENT_CASH_INSERTED_POST1:
case EVENT_CASH_INSERTED_POST2:
case EVENT_CASH_INSERTED_POST3:
case EVENT_CASH_INSERTED_POST4:
case EVENT_CASH_INSERTED_POST5:
case EVENT_CASH_INSERTED_POST6:
{
CPU_INT32U cpp = 1;
CPU_INT32U money, accmoney;
int number_post = event - EVENT_CASH_INSERTED_POST1;
GetData(&CashPerPulseDesc, &cpp, number_post, DATA_FLAG_DIRECT_INDEX);
money = cpp * 10 /*GetResetCashCount(number_post)*/;
accmoney = GetAcceptedMoney(number_post);
accmoney += money;
SetAcceptedMoney(accmoney, number_post);
money_timestamp[number_post] = OSTimeGet();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu(number_post);
RefreshMenu();
}
if (money) SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_NOTE_POST1 + number_post, money);
}
break;
case EVENT_KEY_CANSEL:
break;
case EVENT_KEY_START:
@ -468,46 +386,51 @@ void UserAppTask(void *p_arg)
// íàõîäèìñÿ â ðàáî÷åì ðåæèìå
// --------------------------
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
if (print_mode == 1)
for(int post = 0; post < COUNT_POST; post++)
{
// ïîëüçîâàòåëü âíåñ äåíüãè è íàæàë ÑÒÀÐÒ + ðåæèì ïå÷àòè ÏÎ ÊÍÎÏÊÅ
CPU_INT32U accmoney = GetAcceptedMoney();
if (accmoney > 0)
{
UserPrintPrintBillMenu();
RefreshMenu();
// íàïå÷àòàåì ÷åê
if (IsFiscalConnected())
{
if (PrintFiscalBill(accmoney) == 0)
if (print_mode == 1)
{
// ïîëüçîâàòåëü âíåñ äåíüãè è íàæàë ÑÒÀÐÒ + ðåæèì ïå÷àòè ÏÎ ÊÍÎÏÊÅ
CPU_INT32U accmoney = GetAcceptedMoney(post);
if (accmoney > 0)
{
UserPrintPrintBillMenu(post);
RefreshMenu();
// íàïå÷àòàåì ÷åê
if (IsFiscalConnected())
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_PRINT_BILL, GetTimeSec());
if (PrintFiscalBill(accmoney) == 0)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_PRINT_BILL, GetTimeSec());
}
}
}
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
SetAcceptedMoney(0);
OSTimeDly(1000);
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
if (IsFiscalConnected())
{
UserPrintThanksMenu();
RefreshMenu();
}
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
OSTimeDly(1000);
LED_OK_OFF();
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
SetAcceptedMoney(0, post);
OSTimeDly(1000);
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
if (IsFiscalConnected())
{
UserPrintThanksMenu(post);
RefreshMenu();
}
OSTimeDly(1000);
LED_OK_OFF();
}
}
}
break;
#else
case EVENT_KEY_F1:
PostUserEvent(EVENT_CASH_INSERTED_POST1);
break;
case EVENT_KEY_F2:
PostUserEvent(EVENT_CASH_INSERTED_POST2);
break;
#endif
default:
break;
@ -542,19 +465,12 @@ void UserStartupFunc(void)
// ïðîâåðèì ïàðîëü
InitPass();
//íèöèàëèçàöèÿ êàíàëîâ
InitChannels();
// èíèöèàëèçàöèÿ ìåíþ
InitMenu();
OSTimeDly(1000);
// çàïóñòèì âàëèäàòîð
StartUpValidator();
OSTimeDly(10000);
InitFiscal();
// ïðîèíèöèàëèçèðóåì ÷àñû
@ -563,22 +479,6 @@ void UserStartupFunc(void)
// ñäåëàåì çàïèñü î âêëþ÷åíèè
SaveEventRecord(0, JOURNAL_EVENT_DEVICE_ON, GetTimeSec());
//CPU_INT32U enable;
//GetData(&EnableModemDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
//SetData(&EnableCoinDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
// èíèöèàëèçàöèÿ ìîäåìà
#ifdef MODEM_ENABLE
if (InitModem() != 0)
{
SetErrorFlag(ERROR_MODEM_CONN);
}
else
#endif
{
ClrErrorFlag(ERROR_MODEM_CONN);
}
// çàïóñòèì ìîíåòíèê
InitCoin();
@ -640,7 +540,7 @@ void InitUserMenu(void)
}
}
void UserPrintMoneyMenu(void)
void UserPrintMoneyMenu(int post)
{
char buf[32];
CPU_INT32U accmoney;
@ -649,10 +549,15 @@ void UserPrintMoneyMenu(void)
PrintUserMenuStr(buf, 0);
sprintf(buf, " Âíåñèòå äåíüãè");
PrintUserMenuStr(buf, 1);
accmoney = GetAcceptedMoney();
accmoney = GetAcceptedMoney(post);
sprintf(buf, "Ïðèíÿòî %d ðóá.", accmoney);
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
if(post <= COUNT_POST)
sprintf(buf, " Ïîñò %d", post + 1);
else
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
@ -661,21 +566,7 @@ void UserPrintErrorMenu(void)
{
char buf[32];
if (TstErrorFlag(ERROR_VALIDATOR_CONN) || TstCriticalValidatorErrors())
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÊÓÏÞÐÎÏÐÈÅÌÍÈÊÀ");
PrintUserMenuStr(buf, 1);
if (TstErrorFlag(ERROR_VALIDATOR_CONN))
{
sprintf(buf, "ÍÅÒ ÑÂßÇÈ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
}
}
else if (TstErrorFlag(ERROR_FR_CONN))
if (TstErrorFlag(ERROR_FR_CONN))
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
@ -698,19 +589,6 @@ void UserPrintErrorMenu(void)
GetDataItem(&JournalErrorNumberDesc1, (CPU_INT08U*)buf, errcode);
PrintUserMenuStr(buf, 3);
}
/*
else if (!FReportTest())
{
sprintf(buf, "ÏÅ×ÀÒb ÎÒ×ÅÒÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÆÄÈÒÅ");
PrintUserMenuStr(buf, 1);
sprintf(buf, "ÏÐÈÍÒÅÐ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "ÍÅÄÎÑÒÓÏÅÍ");
PrintUserMenuStr(buf, 3);
}
*/
}
int CheckChannelEnabled(CPU_INT08U channel)
@ -730,7 +608,7 @@ void WorkServer(void)
}
void UserPrintPrintBillMenu(void)
void UserPrintPrintBillMenu(int post)
{
char buf[32];
sprintf(buf, " ");
@ -739,11 +617,11 @@ void UserPrintPrintBillMenu(void)
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÷åêà");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
sprintf(buf, " Ïîñò %d", post + 1);
PrintUserMenuStr(buf, 3);
}
void UserPrintThanksMenu(void)
void UserPrintThanksMenu(int post)
{
char buf[32];
sprintf(buf, " ");
@ -752,7 +630,7 @@ void UserPrintThanksMenu(void)
PrintUserMenuStr(buf, 1);
sprintf(buf, " ");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
sprintf(buf, " Ïîñò %d", post + 1);
PrintUserMenuStr(buf, 3);
}
@ -781,48 +659,50 @@ void LoadAcceptedMoney(void)
{
CPU_INT32U m,crc,crct;
// ñ÷èòàåì cîõðàíåííûå äåíüãè èç FRAM
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
// ñ÷èòàåì crc16 ýòèõ äåíåã èç FRAM
GetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
crct = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
if (crct != crc)
{ // îáíóëÿåì, åñëè crc íå ñîøëàñü
m = 0;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
}
for(int i = 0; i < COUNT_POST; i++)
{
// ñ÷èòàåì cîõðàíåííûå äåíüãè èç FRAM
GetData(&AcceptedMoneyDesc, &m, i, DATA_FLAG_DIRECT_INDEX);
// ñ÷èòàåì crc16 ýòèõ äåíåã èç FRAM
GetData(&AcceptedMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX);
crct = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
if (crct != crc)
{ // îáíóëÿåì, åñëè crc íå ñîøëàñü
m = 0;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, i, DATA_FLAG_DIRECT_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX);
}
}
}
// äîáàâèòü äåíåã
void SetAcceptedMoney(CPU_INT32U money)
void SetAcceptedMoney(CPU_INT32U money, int post)
{
CPU_INT32U m,crc;
m=money;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX);
}
// î÷èñòèòü ñ÷åò÷èê äåíåã
void ClearAcceptedMoney(void)
void ClearAcceptedMoney(int post)
{
CPU_INT32U m,crc;
m=0;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX);
}
// î÷èñòèòü ñ÷åò÷èê äåíåã
CPU_INT32U GetAcceptedMoney(void)
CPU_INT32U GetAcceptedMoney(int post)
{
CPU_INT32U m;
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
return m;
}

View File

@ -37,8 +37,20 @@ enum{
EVENT_SEC = 1,
EVENT_STARTUP,
EVENT_COIN_INSERTED,
EVENT_CASH_INSERTED,
EVENT_COIN_INSERTED_POST1,
EVENT_COIN_INSERTED_POST2,
EVENT_COIN_INSERTED_POST3,
EVENT_COIN_INSERTED_POST4,
EVENT_COIN_INSERTED_POST5,
EVENT_COIN_INSERTED_POST6,
EVENT_CASH_INSERTED_POST1,
EVENT_CASH_INSERTED_POST2,
EVENT_CASH_INSERTED_POST3,
EVENT_CASH_INSERTED_POST4,
EVENT_CASH_INSERTED_POST5,
EVENT_CASH_INSERTED_POST6,
EVENT_BILL_ESCROW,
EVENT_BILL_STACKED,
@ -56,8 +68,6 @@ enum{
EVENT_KEY_START,
EVENT_KEY_USER_START,
EVENT_INCASSATION,
EVENT_INCASSATION_FINISH,
#ifdef BOARD_POST_CFG
EVENT_PULSEOUT
#endif

View File

@ -67,8 +67,6 @@ int TstCriticalErrors(void)
*/
}
errors |= TstErrorFlag(ERROR_VALIDATOR_CONN);
OS_EXIT_CRITICAL();
if (errors) return 1;
return 0;
@ -82,10 +80,6 @@ int TstCriticalValidatorErrors(void)
void ClrValidatorErrors(void)
{
for (CPU_INT08U i=ERROR_VALIDATOR_FAILURE; i<ERROR_MODEM_CONN; ++i)
{
ClrErrorFlag(i);
}
}
// ïîëó÷èòü çàïèñü èç æóðíàëà ñîáûòèé
@ -132,12 +126,44 @@ void ClearEventJournal(void)
void GetEventStr(char* str, char event)
{
switch (event){
case JOURNAL_EVENT_MONEY_NOTE:
sprintf(str, "Âí.êóïþðà ");
case JOURNAL_EVENT_MONEY_NOTE_POST1:
sprintf(str, "Âí.êóïþðà ïîñò 1");
break;
case JOURNAL_EVENT_MONEY_COIN:
sprintf(str, "Âí.ìîíåòû ");
case JOURNAL_EVENT_MONEY_NOTE_POST2:
sprintf(str, "Âí.êóïþðà ïîñò 2");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST3:
sprintf(str, "Âí.êóïþðà ïîñò 3");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST4:
sprintf(str, "Âí.êóïþðà ïîñò 4");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST5:
sprintf(str, "Âí.êóïþðà ïîñò 5");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST6:
sprintf(str, "Âí.êóïþðà ïîñò 6");
break;
case JOURNAL_EVENT_MONEY_COIN_POST1:
sprintf(str, "Âí.ìîíåòû ïîñò 1");
break;
case JOURNAL_EVENT_MONEY_COIN_POST2:
sprintf(str, "Âí.ìîíåòû ïîñò 2");
break;
case JOURNAL_EVENT_MONEY_COIN_POST3:
sprintf(str, "Âí.ìîíåòû ïîñò 3");
break;
case JOURNAL_EVENT_MONEY_COIN_POST4:
sprintf(str, "Âí.ìîíåòû ïîñò 4");
break;
case JOURNAL_EVENT_MONEY_COIN_POST5:
sprintf(str, "Âí.ìîíåòû ïîñò 5");
break;
case JOURNAL_EVENT_MONEY_COIN_POST6:
sprintf(str, "Âí.ìîíåòû ïîñò 6");
break;
case JOURNAL_EVENT_START_SESSION:
sprintf(str, "Ïå÷àòü ÷åêà ");
break;
@ -183,12 +209,44 @@ void GetEventStr(char* str, char event)
void GetEventStrEng(char* str, char event)
{
switch (event){
case JOURNAL_EVENT_MONEY_NOTE:
sprintf(str, " | Vnesena kupura ");
case JOURNAL_EVENT_MONEY_NOTE_POST1:
sprintf(str, " | Vnesena kupura post 1");
break;
case JOURNAL_EVENT_MONEY_COIN:
sprintf(str, " | Vneseny monety ");
case JOURNAL_EVENT_MONEY_NOTE_POST2:
sprintf(str, " | Vnesena kupura post 2");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST3:
sprintf(str, " | Vnesena kupura post 3");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST4:
sprintf(str, " | Vnesena kupura post 4");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST5:
sprintf(str, " | Vnesena kupura post 5");
break;
case JOURNAL_EVENT_MONEY_NOTE_POST6:
sprintf(str, " | Vnesena kupura post 6");
break;
case JOURNAL_EVENT_MONEY_COIN_POST1:
sprintf(str, " | Vneseny monety post 1");
break;
case JOURNAL_EVENT_MONEY_COIN_POST2:
sprintf(str, " | Vneseny monety post 2");
break;
case JOURNAL_EVENT_MONEY_COIN_POST3:
sprintf(str, " | Vneseny monety post 3");
break;
case JOURNAL_EVENT_MONEY_COIN_POST4:
sprintf(str, " | Vneseny monety post 4");
break;
case JOURNAL_EVENT_MONEY_COIN_POST5:
sprintf(str, " | Vneseny monety post 5");
break;
case JOURNAL_EVENT_MONEY_COIN_POST6:
sprintf(str, " | Vneseny monety post 6");
break;
case JOURNAL_EVENT_START_SESSION:
sprintf(str, " | Print bill ");
break;
@ -245,9 +303,8 @@ void PrintEventJournalRecordEng(char* str, TEventRecord *record)
GetEventStrEng(&str[strlen(str)], record->event);
// íàïå÷àòàåì äîïîëíèòåëüíûå ïîëÿ
if ((record->event == JOURNAL_EVENT_MONEY_NOTE) || (record->event == JOURNAL_EVENT_MONEY_COIN))
if ((record->event >= JOURNAL_EVENT_MONEY_NOTE_POST1) && (record->event <= JOURNAL_EVENT_MONEY_COIN_POST6))
{
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)
@ -404,7 +461,7 @@ void ClearBillnomCounter(void)
// ñåðâåð îøèáîê (çàíåñåíèå îøèáîê â æóðíàë)
void ErrorServer(void)
{
for (int i = ERROR_VALIDATOR_CONN; i < JOURNAL_EVENTS_COUNT; i++)
for (int i = ERROR_FR_CONN; i < JOURNAL_EVENTS_COUNT; i++)
{
if (!(PrevFlags[i/32] & (1L<<(i%32)))
&& (TstErrorFlag(i)))

View File

@ -15,80 +15,39 @@ typedef struct{
// òèï ñîáûòèÿ
CPU_INT08U event;
#define JOURNAL_EVENT_NO_EVENT 0 // íåò ñîáûòèÿ
#define JOURNAL_EVENT_MONEY_NOTE 1 // ñîáûòèå ïîëó÷åíèÿ êóïþðû
#define JOURNAL_EVENT_MONEY_COIN 2 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé)
#define JOURNAL_EVENT_START_SESSION 3 // ñîáûòèå íà÷àëà ñåàíñà
#define JOURNAL_EVENT_END_SESSION 4 // ñîáûòèå êîíöà ñåàíñà
#define JOURNAL_EVENT_DEVICE_ON 6 // âêëþ÷åíèå óñòðîéñòâà
#define JOURNAL_EVENT_PRINT_BILL 7 // ïå÷àòü ÷åêà
#define JOURNAL_EVENT_PRINT_Z 8 // ïå÷àòü z-îò÷åòà
#define JOURNAL_EVENT_PRINT_X 9 // ïå÷àòü x-îò÷åòà
#define JOURNAL_EVENT_PRINT_BUF 10 // ïå÷àòü x-îò÷åòà
#define JOURNAL_EVENT_CHANGE_MODE 11 // ñìåíà ðåæèìà
#define JOURNAL_EVENT_INCASSATION 12 // èíêàññàöèÿ
#define JOURNAL_EVENT_PASS_FAIL 13 // íåâåðíûé ââîä ïàðîëÿ
#define JOURNAL_EVENT_EMAIL_OK 14 // ïðàâèëüíî îòïðàâëåí email
#define JOURNAL_EVENT_EMAIL_FAIL 15 // îøèáêà ïðè îòïðàâêå email
// îøèáêà ñâÿçè ñ êóïþðíèêîì
#define ERROR_VALIDATOR_CONN 16
// êðèòè÷åñêàÿ îøèáêà ðàáîòû êóïþðíèêà
#define ERROR_VALIDATOR_FAILURE 17
// íåêðèòè÷åñêèå îøèáêè êóïþðîïðèåìíèêà
// Âûáðîñ êóïþðû ïðè çàìèíå
#define ERROR_VALIDATOR_INSERTION 18
// Âûáðîñ êóïþðû ïî ìàã.äàò÷èêó
#define ERROR_VALIDATOR_MAGNETIC 19
// Âûáðîñ êóïþðû ïðè òðàíñïîðòèðîâêå
#define ERROR_VALIDATOR_CONVEYING 20
// Âûáðîñ êóïþðû ïî èäåíòèôèêàöèè
#define ERROR_VALIDATOR_IDENT 21
// Âûáðîñ êóïþðû ïî âåðèôèêàöèè
#define ERROR_VALIDATOR_VRFY 22
// Âûáðîñ êóïþðû ïî îïòè÷.äàò÷èêó
#define ERROR_VALIDATOR_OPT 23
// Âûáðîñ êóïþðû ïî çàïðåòó
#define ERROR_VALIDATOR_INHIBIT 24
// Âûáðîñ êóïþðû ïî åìêîñòíîìó äàò÷èêó
#define ERROR_VALIDATOR_CAP 25
// Âûáðîñ êóïþðû ïî äëèíå
#define ERROR_VALIDATOR_LNG 26
// Êàññåòà çàïîëíåíà
#define ERROR_STACKER_FULL 27
// Êàññåòà îòñóòñòâóåò
#define ERROR_STACKER_REMOVED 28
// Çàìèí â êóïþðîïðèåìíèêå
#define ERROR_BV_JAMMED 29
// Çàìèí â êàññåòå
#define ERROR_ST_JAMMED 30
// Ïîïûòêà îáìàíà
#define ERROR_CHEATED 31
// Îøèáêà ñòåêåðíîãî ìîòîðà
#define ERROR_FLR_STACKER 32
// Îøèáêà ñêîðîñòè òðàíñïîðò.ìîòîðà
#define ERROR_TR_SPEED 33
// Îøèáêà òðàíñïîðò.ìîòîðà
#define ERROR_FLR_TRANSPORT 34
// Îøèáêà ìåõàíèçìà âûðàâíèâàíèÿ
#define ERROR_FLR_ALIGNIN 35
// Êàññåòà îòñóòñòâóåò
#define ERROR_FLR_INIT_CAS 36
// Îøèáêà îïòèêè
#define ERROR_FLR_OPT 37
// Îøèáêà ìàã.äàò÷èêà
#define ERROR_FLR_MAG 38
// Îøèáêà åìêîñòíîãî äàò÷èêà
#define ERROR_FLR_CAP 39
// îøèáêà ñâÿçè ñ ìîäåìîì
#define ERROR_MODEM_CONN 40
#define JOURNAL_EVENT_MONEY_NOTE_POST1 1 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 1
#define JOURNAL_EVENT_MONEY_NOTE_POST2 2 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 2
#define JOURNAL_EVENT_MONEY_NOTE_POST3 3 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 3
#define JOURNAL_EVENT_MONEY_NOTE_POST4 4 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 4
#define JOURNAL_EVENT_MONEY_NOTE_POST5 5 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 5
#define JOURNAL_EVENT_MONEY_NOTE_POST6 6 // ñîáûòèå ïîëó÷åíèÿ êóïþðû ïîñò 6
#define JOURNAL_EVENT_MONEY_COIN_POST1 7 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 1
#define JOURNAL_EVENT_MONEY_COIN_POST2 8 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 2
#define JOURNAL_EVENT_MONEY_COIN_POST3 9 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 3
#define JOURNAL_EVENT_MONEY_COIN_POST4 10 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 4
#define JOURNAL_EVENT_MONEY_COIN_POST5 11 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 5
#define JOURNAL_EVENT_MONEY_COIN_POST6 12 // ñîáûòèå ïîëó÷åíèÿ ìîíåòû (êîë-âî ðóáëåé) ïîñò 6
#define JOURNAL_EVENT_START_SESSION 13 // ñîáûòèå íà÷àëà ñåàíñà
#define JOURNAL_EVENT_END_SESSION 14 // ñîáûòèå êîíöà ñåàíñà
#define JOURNAL_EVENT_DEVICE_ON 16 // âêëþ÷åíèå óñòðîéñòâà
#define JOURNAL_EVENT_PRINT_BILL 17 // ïå÷àòü ÷åêà
#define JOURNAL_EVENT_PRINT_Z 18 // ïå÷àòü z-îò÷åòà
#define JOURNAL_EVENT_PRINT_X 19 // ïå÷àòü x-îò÷åòà
#define JOURNAL_EVENT_PRINT_BUF 20 // ïå÷àòü x-îò÷åòà
#define JOURNAL_EVENT_CHANGE_MODE 21 // ñìåíà ðåæèìà
#define JOURNAL_EVENT_INCASSATION 22 // èíêàññàöèÿ
#define JOURNAL_EVENT_PASS_FAIL 23 // íåâåðíûé ââîä ïàðîëÿ
#define JOURNAL_EVENT_EMAIL_OK 24 // ïðàâèëüíî îòïðàâëåí email
#define JOURNAL_EVENT_EMAIL_FAIL 25 // îøèáêà ïðè îòïðàâêå email
// îøèáêà ñâÿçè ñ ôèñêàëüíèêîì
#define ERROR_FR_CONN 41
#define ERROR_FR_CONN 26
// ÂÑÅ ÎØÈÁÊÈ ÔÐ ÔÀÒÀËÜÍÛÅ
#define ERROR_FR 42
#define ERROR_FR 27
#define JOURNAL_EVENTS_COUNT (ERROR_FR+FR_ERROR_NUMBER) // ÷èñëî ñîáûòèé

View File

@ -1,691 +0,0 @@
#include <includes.h>
#include "journal.h"
#include "modem.h"
#include "modem_task.h"
#include "data.h"
#include "datadesc.h"
#include "time.h"
OS_STK ModemTaskStk[MODEM_TASK_STK_SIZE];
OS_EVENT *ModemQuery = NULL;
void *ModemTbl[MODEM_QUERY_LEN];
static int index;
static CPU_INT32U enable_journals;
#define STAT_STR_NUM 17
static void GetChannelStatStr(char* str, int ch)
{
CPU_INT32U val;
GetData(&CounterChannelMoneyDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %2d | %11d ", ch+1, val);
GetData(&CounterChannelRunDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %7d | ", val);
GetData(&CounterChannelTimeDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
static void GetChannelStatStrLong(char* str, int ch)
{
CPU_INT32U val;
GetData(&CounterChannelMoneyLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %2d | %11d ", ch+1, val);
GetData(&CounterChannelRunLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %7d | ", val);
GetData(&CounterChannelTimeLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
extern CPU_INT32U BillNominals[24];
static int GetEmailStr(char *str)
{
if (index < STAT_STR_NUM)
{
str[0] = 0;
if (index == 0)
{
// çàãîëîâîê
TRTC_Data rtc;
RTC_ReadTime(&rtc);
sprintf(str, "Systemnoe vremya: ");
PrintRTCDateTimeString(&str[strlen(str)], &rtc);
sprintf(&str[strlen(str)], "\r\n\r\n-------------------------------------------------------------\r\nStatistika obshaya. Korotkie schetchiki.\r\n-------------------------------------------------------------\r\n");
}
else if (index == 1)
{
CPU_INT32U val;
// îáùèå ñ÷åò÷èêè
sprintf(str, "| Vsego deneg, rub. | Vsego seansov | Vsego narabotka h:m:s \r\n");
GetData(&CounterMoneyDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %16d ", val);
GetData(&CounterRunDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %12d | ", val);
GetData(&CounterTimeDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
else if (index == 2)
{
sprintf(&str[strlen(str)], "\r\n-------------------------------------------------------------\r\nStatistika obshaya. Dlinnye schetchiki\r\n-------------------------------------------------------------\r\n");
}
else if (index == 3)
{
CPU_INT32U val;
// íåîáíóëÿåìûå ñ÷åò÷èêè
sprintf(str, "| Vsego deneg, rub. | Vsego seansov | Vsego narabotka h:m:s \r\n");
GetData(&CounterLongMoneyDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %16d ", val);
GetData(&CounterLongRunDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %12d | ", val);
GetData(&CounterLongTimeDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
else if (index == 4)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nStatistika po kanalam. Korotkie schetchiki.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Kanal | Deneg, rub. | Seansov | Narabotka h:m:s\r\n");
}
else if (index == 5)
{
int i;
for (i = 0; i < 3; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 6)
{
int i;
for (i = 3; i < 6; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 7)
{
int i;
for (i = 6; i < 10; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 8)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nStatistika po kanalam. Dlinnye schetchiki.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Kanal | Deneg, rub. | Seansov | Narabotka h:m:s\r\n");
}
else if (index == 9)
{
int i;
for (i = 0; i < 3; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 10)
{
int i;
for (i = 3; i < 6; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 11)
{
int i;
for (i = 6; i < 10; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 12)
{
CPU_INT32U val;
// âïå÷àòàåì ÷èñëî êóïþð â êóïþðíèêå
sprintf(str, "\r\n-------------------------------------------------------------\r\nKupuropriemnik.\r\n-------------------------------------------------------------\r\n");
GetData(&BillCounterDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
if (!val)
{
// êóïþðíèê ïóñò
sprintf(&str[strlen(str)], "Kupuropriemnik pust.\r\n\r\n");
index++;
index++;
}
else
{
sprintf(&str[strlen(str)], "| Nominal, rub. | Kolichestvo\r\n");
}
}
else if (index == 13)
{
int i;
str[0] = 0;
for (i = 0; i < 6; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
val = strlen(str);
}
}
else if (index == 14)
{
int i;
str[0] = 0;
for (i = 6; i < 12; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 15)
{
int i;
str[0] = 0;
for (i = 12; i < 18; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 16)
{
int i;
str[0] = 0;
for (i = 18; i < 24; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
index++;
return 0;
}
else if (index < STAT_STR_NUM+EVENT_RECORDS_COUNT)
{
TEventRecord record;
if (enable_journals == 0) return -1;
GetEventRecord(&record, index-STAT_STR_NUM);
str[0] = 0;
if ((index-STAT_STR_NUM) == 0)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nZhurnal sobytiy\r\n-------------------------------------------------------------\r\n");
}
if (record.time == 0x00000000)
{
index++;
return 0;
}
PrintEventJournalRecordEng(&str[strlen(str)], &record);
index++;
return 0;
}
return -1;
}
/// îòïðàâêà e-mail ñî ñ÷åò÷èêàìè è æóðíàëàìè
int SendStatistics(void)
{
CPU_INT32U dev_id;
char theme[48];
index = 0;
// íàäî ëè îòïðàâëÿòü æóðíàëû
GetData(&EnableEmailJournalSendDesc, &enable_journals, 0, DATA_FLAG_SYSTEM_INDEX);
// id óñòðîéñòâà óêàæåì â òåìå
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Report from solarium device id %d.", dev_id);
return ModemSendEmail(theme, GetEmailStr);
}
// âûåìêà íîâîãî çàäàíèÿ äëÿ ìîäåìà
static int GetModemTask(int* event)
{
CPU_INT08U err = 0;
int evt = (int)OSQPend(ModemQuery, 1, &err);
if (err != 0) return 0;
*event = evt;
return 1;
}
int GetTestText(char *str)
{
if (index == 0)
{
index++;
sprintf(str, "Test message from solarium.");
return 0;
}
return -1;
}
// îòïðàâêà òåñòîâîãî ñîîáùåíèÿ
int SendTest(void)
{
CPU_INT32U dev_id;
char theme[48];
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Test message. Device id %d.", dev_id);
index = 0;
return ModemSendEmail(theme, GetTestText);
}
static CPU_INT32U incas_money;
static CPU_INT32U incas_time;
int GetIncasText(char *str)
{
if (index == 0)
{
// çàãîëîâîê
TRTC_Data rtc;
Sec2Date(&rtc, incas_time);
sprintf(str, "Vremya incassacii: ");
PrintRTCDateTimeString(&str[strlen(str)], &rtc);
sprintf(&str[strlen(str)], "\r\n\r\nSumma %d rub.\r\n", incas_money);
}
else if (index == 1)
{
CPU_INT32U val;
// âïå÷àòàåì ÷èñëî êóïþð â êóïþðíèêå
val = incas_common_bill_counter;
if (!val)
{
// êóïþðíèê ïóñò
sprintf(&str[strlen(str)], "Kupuropriemnik byl pust.\r\n\r\n");
index=100;
}
else
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nKupuropriemnik.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Nominal, rub. | Kolichestvo\r\n");
}
}
else if (index == 2)
{
int i;
str[0] = 0;
for (i = 0; i < 6; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
val = strlen(str);
}
}
else if (index == 3)
{
int i;
str[0] = 0;
for (i = 6; i < 12; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 4)
{
int i;
str[0] = 0;
for (i = 12; i < 18; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 5)
{
int i;
str[0] = 0;
for (i = 18; i < 24; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else
{
return -1;
}
index++;
return 0;
}
// îòïðàâêà ñîîáùåíèÿ îá èíêàññàöèè
int SendIncas(void)
{
CPU_INT32U dev_id;
char theme[48];
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Incassation. Device id %d.", dev_id);
index = 0;
return ModemSendEmail(theme, GetIncasText);
}
// ñïèñîê âîçìîæíûõ èíòåðâàëîâ îòïðàâêè
const int send_period_list[7] = {0, 1, 2, 4, 8, 12, 24};
// ãëîáàëüíûé ñòàòóñ ìîäåìà
CPU_INT32U modem_status = 0;
// ïðîâåðêà, â îäíîì ëè ïåðèîäå íàõîäÿòñÿ äâà âðåìåíè
int SamePeriod(CPU_INT32U time1, CPU_INT32U time2, CPU_INT08U period)
{
TRTC_Data rtc1, rtc2;
CPU_INT08U hour1, hour2;
Sec2Date(&rtc1, time1);
Sec2Date(&rtc2, time2);
if ((rtc1.year != rtc2.year) || (rtc1.mon != rtc2.mon) || (rtc1.date != rtc2.date))
{
// äàòà íå ñîâïàäàåò - òî÷íî ðàçíûé ÷àñîâîé ïåðèîä
return 0;
}
// time1 - òåêóùåå âðåìÿ
// îïðåäåëèì âðåìÿ íà÷àëà òåêóùåãî ïåðèîäà
hour1 = rtc1.hour - (rtc1.hour % period);
// îïðåäåëèì âðåìÿ íà÷àëà ïåðèîäà â ïîñëåäíåì âðåìåíè îòïðàâêè
hour2 = rtc2.hour - (rtc2.hour % period);
if (hour1 != hour2)
{
return 0;
}
return 1;
}
#define MODEM_REPEAT_NUM 3
static CPU_INT32U last_stat_send_time;
// çàäà÷à ñåðâåðà ìîäåìà
void ModemTask(void *p_arg)
{
int task;
int send_res, send_ctr, repeat_ctr;
while (1)
{
CPU_INT32U en = 0;
OSTimeDly(100);
if (!IsModemValid())
{
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
if (en)
{
if (!IsModemConn())
{
modem_status = 2;
}
else if (!IsModemConf())
{
modem_status = 1;
}
// ïîïûòàåìñÿ ïåðåïîäêëþ÷èòü ìîäåì
if (InitModem() != 0)
{
SetErrorFlag(ERROR_MODEM_CONN);
}
else
{
ClrErrorFlag(ERROR_MODEM_CONN);
}
}
else
{
modem_status = 0;
}
continue;
}
modem_status = 0;
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
if (!en)
{
ResetModemValid();
continue;
}
if (GetModemTask(&task))
{
// ðàçáåðåì çàäàíèå
switch (task)
{
case MODEM_TASK_SEND_INCAS:
{
CPU_INT32U temp;
GetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
if (temp != INCAS_SEND_FLAG)
{
break;
}
GetData(&IncasMoneyDesc, &incas_money, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&IncasTimeDesc, &incas_time, 0, DATA_FLAG_SYSTEM_INDEX);
repeat_ctr = 0;
while (repeat_ctr < MODEM_REPEAT_NUM)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendIncas();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= MODEM_REPEAT_NUM)
{
// òî÷íî îøèáêà ìîäåìà
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
// åù¸ ðàç çàïîñòèì, ÷òîáû îòïðàâëÿòü, ïîêà íå îòïðàâèòñÿ
PostModemTask(MODEM_TASK_SEND_INCAS);
}
else
{
temp = 0;
SetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&IncasMoneyDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&IncasTimeDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
}
}
break;
case MODEM_TASK_SEND_STATISTICS:
repeat_ctr = 0;
while (repeat_ctr < MODEM_REPEAT_NUM)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendStatistics();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= MODEM_REPEAT_NUM)
{
// òî÷íî îøèáêà ìîäåìà
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
// åù¸ ðàç çàñïîñòèì, ÷òîáû îòïðàâëÿòü, ïîêà íå îòïðàâèòñÿ
// íå íàäî - ñàìî çàïîñòèòñÿ, ò.ê. âðåìÿ ìû åù¸ íå ñîõðàíèëè
//PostModemTask(MODEM_TASK_SEND_STATISTICS);
}
else
{
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
ClearCounters();
SetData(&LastEmailSendTime, &last_stat_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
}
break;
case MODEM_TASK_SEND_TEST_MSG:
repeat_ctr = 0;
while (repeat_ctr < 3)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendTest();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= 3)
{
// òî÷íî îøèáêà ìîäåìà, çàáèâàåì íà îòïðàâêó
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
}
else
{
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
}
break;
case MODEM_TASK_RECONNECT:
// ïîïûòàåìñÿ ïåðåïîäêëþ÷èòü ìîäåì
InitModem();
break;
}
}
else
{
CPU_INT32U send_time, send_hour, send_minute;
CPU_INT32U last_send_time, sec;
TRTC_Data rtc_1, rtc_2;
OSTimeDly(MODEM_TASK_DELAY);
// ïîñìîòðèì òåêóùåå âðåìÿ
GetData(&SystemTimeDesc, &sec, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&StatSendHourMinDesc, &send_time, 0, DATA_FLAG_SYSTEM_INDEX);
send_hour = send_time / 60;
send_minute = send_time % 60;
// ïðî÷èòàåì ïîñëåäíåå âðåìÿ îòïðàâêè
GetData(&LastEmailSendTime, &last_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
Sec2Date(&rtc_1, sec);
Sec2Date(&rtc_2, last_send_time);
// çàïîñòèì êîìàíäó, åñëè â òåêóùåì ïåðèîäå åù¸ íå îòïðàâëÿëîñü
// îòïðàâëÿåòñÿ âñåãäà ðàç â ñóòêè â 9.10
if ((rtc_1.hour >= send_hour) && (rtc_1.min >= send_minute) && ((rtc_2.date != rtc_1.date) || (rtc_2.year != rtc_1.year) || (rtc_2.mon != rtc_1.mon)))
{
PostModemTask(MODEM_TASK_SEND_STATISTICS);
last_stat_send_time = sec;
//SetData(&LastEmailSendTime, &last_stat_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
// ïîñëåäíåå âðåìÿ îòïðàâêè óñòàíîâèì ïîòîì, òîëüêî â ñëó÷àå óñïåøíîé îòïðàâêè
}
}
}
}
// ïîñòàíîâêà íîâîé çàäà÷è â î÷åðåäü çàäà÷ ìîäåìà
void PostModemTask(int new_task)
{
OSQPost(ModemQuery, (void *)new_task);
}

View File

@ -1,28 +0,0 @@
#ifndef _MODEM_TASK_H_
#define _MODEM_TASK_H_
#include "app_serv.h"
// äëèíà î÷åðåäè çàäàíèé ìîäåìà
#define MODEM_QUERY_LEN 8
// çàäåðæêà ìåæäó âûïîëíåíèåì çàäàíèé ìîäåìà
#define MODEM_TASK_DELAY 10000
enum{
MODEM_TASK_NONE = 0,
MODEM_TASK_SEND_STATISTICS,
MODEM_TASK_SEND_TEST_MSG,
MODEM_TASK_RECONNECT,
MODEM_TASK_SEND_INCAS,
};
extern OS_STK ModemTaskStk[MODEM_TASK_STK_SIZE];
extern OS_EVENT *ModemQuery;
extern void *ModemTbl[MODEM_QUERY_LEN];
extern void ModemTask(void *p_arg);
extern void PostModemTask(int new_task);
#endif //#ifndef _MODEM_TASK_H_

View File

@ -13,8 +13,6 @@
#include "fiscal.h"
#include "time.h"
#include "CRC16.h"
#include "modem_task.h"
#include "modem.h"
#include "coin.h"
extern CPU_INT32U modem_status;
@ -167,7 +165,7 @@ TDataDescStruct const CashPulseLenDesc = {
(void*)offsetof(TFramMap, cash_pulse_len), // указатель на переменную или адрес FRAM
(void*)&CashPulseLenRange, // указатель на границы параметра
OnChangeCashPulseLen, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
CashPulseLenName, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -191,7 +189,7 @@ TDataDescStruct const CashPauseLenDesc = {
(void*)offsetof(TFramMap, cash_pause_len), // указатель на переменную или адрес FRAM
(void*)&CashPauseLenRange, // указатель на границы параметра
OnChangeCashPulseLen, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
CashPauseLenName, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -417,21 +415,21 @@ CPU_INT08U const *EnableModemList[] = {OnOffList_str0, OnOffList_str1};
void OnchangeEnableModem(void)
{
CPU_INT32U en = 0;
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
if (en)
{
if (!IsModemConn())
{
modem_status = 2;
}
else if (!IsModemConf())
{
modem_status = 1;
}
PostModemTask(MODEM_TASK_RECONNECT);
}
// CPU_INT32U en = 0;
// GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
//
// if (en)
// {
// if (!IsModemConn())
// {
// modem_status = 2;
// }
// else if (!IsModemConf())
// {
// modem_status = 1;
// }
// //PostModemTask(MODEM_TASK_RECONNECT);
// }
}
TDataDescStruct const EnableModemDesc = {
@ -653,7 +651,7 @@ TDataDescStruct const CoinPerPulseDesc = {
(void*)offsetof(TFramMap, DeviceConfig.CoinPerPulse), // указатель на переменную или адрес FRAM
(void*)&CoinPerPulseRange, // указатель на границы параметра
NULL, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
CoinPerPulseName, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -741,7 +739,7 @@ TDataDescStruct const PrintModeDesc = {
DATA_IS_INDEX, // признак индексного параметра (список строк)
PrintModeList, // указатель на список строк для индексного параметра
DATA_INIT_DISABLE,
0
1
};
/*************************************
@ -808,7 +806,7 @@ TDataDescStruct const CashPerPulseDesc = {
(void*)offsetof(TFramMap, DeviceConfig.CashPerPulse), // указатель на переменную или адрес FRAM
(void*)&CashPerPulseRange, // указатель на границы параметра
NULL, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
CashPerPulseName, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -1518,37 +1516,17 @@ TDataDescStruct const PrintXReportDesc = {
Ошибка в журнале ошибок
*************************************/
TRangeValueULONG const ErrorNumberRange = {0, JOURNAL_EVENTS_COUNT - 1};
CPU_INT08U const *ErrorNumberList0[JOURNAL_EVENTS_COUNT] = {"нет", "", "", "",
CPU_INT08U const *ErrorNumberList0[JOURNAL_EVENTS_COUNT] =
{"íåò",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"ошибка связи с",
"ошибка работы",
"1Ch60h-выбр.купюры",
"1Ch61h-выбр.купюры",
"1Ch64h-выбр.купюры",
"1Ch65h-выбр.купюры",
"1Ch66h-выбр.купюры",
"1Ch67h-выбр.купюры",
"1Ch68h-выбр.купюры",
"1Ch69h-выбр.купюры",
"1Ch6Ch-выбр.купюры",
"к/п:41h-кассета",
"к/п:42h-кассета",
"к/п:43h-замин в ",
"к/п:44h-замин",
"к/п:45h-попытка",
"к/п:50h-ошибка",
"к/п:51h-ошибка скор.",
"к/п:52h-ошибка",
"к/п:53h-ошибка мех.",
"к/п:54h-кассета",
"к/п:65h-ошибка",
"к/п:66h-ошибка",
"к/п:67h-ошибка емк.",
"ошибка",
"ошибка",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"ФР:01h-Неизвестная",
"ФР:02h-Неверное",
"ФР:03h-Ошибка ФН",
@ -1679,36 +1657,17 @@ TDataDescStruct const JournalErrorNumberDesc0 = {
0
};
CPU_INT08U const *ErrorNumberList1[JOURNAL_EVENTS_COUNT] = {"", "", "", "",
CPU_INT08U const *ErrorNumberList1[JOURNAL_EVENTS_COUNT] =
{
"",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"купюроприемником",
"купюроприемника",
"при замине",
"по маг.датчику",
"при транспорт.",
"по идентификации",
"по верификации ",
"по оптич.датчику ",
"по запрету",
"по емкост.датчику",
"по длине",
"заполнена",
"отсутствует",
"купюроприемнике",
"в кассете",
"обмана",
"стекерного мотора",
"транспорт.мотора",
"транспорт.мотора",
"выравнивания",
"отсутствует",
"оптики",
"маг.датчика",
"датчика",
"модема",
"связи с ФР",
"команда", // ФР:01h
"состояние ФН",
@ -1849,31 +1808,7 @@ CPU_INT08U const *ErrorNumberListEng[JOURNAL_EVENTS_COUNT] =
"", "", "", "",
"", "", "", "",
"", "", "", "",
"Oshibka svyazi c kupuropriemnikom",
"Kriticheskaya oshibka kupuropriemnika",
"Vybros kupury po mag.datchiku",
"Vybros kupury pri transportirovke",
"Vybros kupury po identifikacii",
"Vybros kupury po verifikacii",
"Vybros kupury po opt.datchiku",
"Vybros kupury po zapretu",
"Vybros kupury po emk.datchiku",
"Vybros kupury po dline",
"Kasseta zapolnena",
"Kasseta otsutstvuet",
"Zamin v kupuropriemnike",
"Zamin v kassete",
"Popytka obmana",
"Oshibka stekernogo motora",
"Oshibka skorosti transp.motora",
"Oshibka transp.motora",
"Oshibka mehanizmavyravnivaniya",
"Kasseta otsutstvuet",
"Oshibka optiki",
"Oshibka magn.datchika",
"Oshibka emk.datchika",
"Nekriticheskaya oshibka kupuropriemnika",
"Oshibka svyazi s modemom",
"Oshibka svyazi s FR",
"Oshibka FR 0x01",
@ -2560,7 +2495,7 @@ TDataDescStruct const TaxFormatDesc = {
DATA_IS_INDEX, // признак индексного параметра (список строк)
TaxFormatList, // указатель на список строк для индексного параметра
DATA_INIT_DISABLE,
1
6
};
/*************************************
@ -2649,7 +2584,7 @@ TDataDescStruct const ServiceNameDesc = {
DATA_IS_INDEX, // признак индексного параметра (список строк)
ServiceNameList, // указатель на список строк для индексного параметра
DATA_INIT_DISABLE,
0 // значение по умолчанию
1 // çíà÷åíèå ïî óìîë÷àíèþ
};
/*************************************
@ -2659,13 +2594,13 @@ TDataDescStruct const AcceptedMoneyDesc = {
DATA_DESC_EDIT, // тип дескриптора
DATA_TYPE_ULONG, // тип параметра
DATA_LOC_FRAM, // расположение параметра
DATA_NO_ARRAY, // признак массива
0, // размер массива
DATA_IS_ARRAY, // ïðèçíàê ìàññèâà
COUNT_POST, // ðàçìåð ìàññèâà
NULL, // указатель на десриптор индекса массива
(void*)offsetof(TFramMap, FRAM_AcceptedMoney), // указатель на переменную или адрес FRAM
NULL, // указатель на границы параметра
NULL, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
NULL, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -2680,13 +2615,13 @@ TDataDescStruct const AcceptedMoneyCRC16Desc = {
DATA_DESC_EDIT, // тип дескриптора
DATA_TYPE_ULONG, // тип параметра
DATA_LOC_FRAM, // расположение параметра
DATA_NO_ARRAY, // признак массива
0, // размер массива
DATA_IS_ARRAY, // ïðèçíàê ìàññèâà
COUNT_POST, // ðàçìåð ìàññèâà
NULL, // указатель на десриптор индекса массива
(void*)offsetof(TFramMap, crc_AcceptedMoney), // указатель на переменную или адрес FRAM
NULL, // указатель на границы параметра
NULL, // функция по изменению
0, // смещение между элементами в массиве
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
NULL, // указатель на строку названия параметра
DATA_NO_INDEX, // признак индексного параметра (список строк)
NULL, // указатель на список строк для индексного параметра
@ -2906,7 +2841,7 @@ void OnChangeSendTestEmail(void)
{
if (send_test)
{
PostModemTask(MODEM_TASK_SEND_TEST_MSG);
//PostModemTask(MODEM_TASK_SEND_TEST_MSG);
send_test = 0;
}
}
@ -2960,7 +2895,7 @@ TDataDescStruct const BillnomIndexDesc = {
/*************************************
Значение номинала купюры для просмотра счетчиков
*************************************/
extern CPU_INT32U BillNominals[24];
CPU_INT08U const BillnomValName[] = "Значение,руб.";
TDataDescStruct const BillnomDesc = {
@ -2970,7 +2905,7 @@ TDataDescStruct const BillnomDesc = {
DATA_IS_ARRAY, // признак массива
24, // размер массива
(void*)&BillnomIndexDesc, // указатель на десриптор индекса массива
(void*)&BillNominals, // указатель на переменную или адрес FRAM
NULL, // óêàçàòåëü íà ïåðåìåííóþ èëè àäðåñ FRAM
NULL, // указатель на границы параметра
NULL, // функция по изменению
sizeof(CPU_INT32U), // смещение между элементами в массиве
@ -3275,9 +3210,17 @@ const TDataDescArrayStruct AllDataArray[] =
{&CashPulseLenDesc, "CashPulseLenDesc"},
{&CashPauseLenDesc, "CashPauseLenDesc"},
{&TaxSystemDesc, "TaxSystemDesc"},
{&TaxFormatDesc, "TaxFormatDesc"},
{&SubjSellDesc, "SubjSellDesc"},
{&CommandV2Desc, "CommandV2Desc"},
{&ServiceNameDesc, "ServiceNameDesc"},
{&PrintModeDesc, "PrintModeDesc"},
{&PrintTimeoutAfterDesc, "PrintTimeoutAfterDesc"},
{NULL, ""}
};

View File

@ -20,8 +20,8 @@ typedef struct
// äëèííûå ñ÷åò÷èêè ñ CRC16
TCountersLong CountersLong;
CPU_INT32U FRAM_AcceptedMoney;
CPU_INT32U crc_AcceptedMoney;
CPU_INT32U FRAM_AcceptedMoney[COUNT_POST];
CPU_INT32U crc_AcceptedMoney[COUNT_POST];
// æóðíàë ñîáûòèé+îøèáîê
TEventRecord EventRecords[EVENT_RECORDS_COUNT];

View File

@ -1,725 +0,0 @@
#include <includes.h>
#include "CCRSProtocol.h"
#include "VMCConst.h"
#include "validator.h"
#include "uart1.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
int iCmdDelay=20;
int iLastError=0;
// îáíîâëåíèå crc
unsigned short crc16_ccitt(unsigned char data, unsigned short crc)
{ register unsigned short a=0x8408, d = crc, i;
d^= data;
for (i=0; i<8; i++)
{if (d & 0x0001)
{d>>= 1;
d^=a;}
else d>>=1;
}
return d;
}
// ïîäñ÷åò crc
unsigned short CalculateCRC(unsigned char *pBuffer)
{
unsigned short wCRC=0;
int Len = (pBuffer[2]) ? pBuffer[2] : ((unsigned short)pBuffer[4]<<8)+pBuffer[5];
for (int i=0;i<Len-2;i++)wCRC=crc16_ccitt(pBuffer[i],wCRC);
return wCRC;
}
// ïîñûëêà ïîäãîòîâëåííûõ äàííûõ èç áóôåðà è ïðèåì îòâåòà
int SendCommand(unsigned char *BufOut, unsigned char *BufIn)
{
int iRecievingError, iBytesToRecieve;
iRecievingError=RE_TIMEOUT;
for(int iErrCount=0;iErrCount<1;iErrCount++)
{
iBytesToRecieve=6;
PurgeComm();
if(!BufOut[2]) COMPort_Send(BufOut, ((unsigned short)BufOut[4]<<8)+BufOut[5]);
else COMPort_Send(BufOut, BufOut[2]);
if((BufOut[3]==ACK)||(BufOut[3]==NAK))
return iRecievingError=RE_NONE;
if(COMPort_Recieve(BufIn, iBytesToRecieve))
{
if(BufIn[0]!=SYNC)
iRecievingError=RE_SYNC;
else
{
int iLen=((BufIn[2])?BufIn[2]:(BufIn[5]+((unsigned short)BufIn[4]<<8)))-iBytesToRecieve;
if(iLen>0)
{
if(COMPort_Recieve(BufIn+iBytesToRecieve, iLen))
{
iRecievingError=RE_NONE;
break;
}
else
{
iRecievingError=RE_DATA;
PurgeComm();
}
}
else
{
iRecievingError=RE_NONE;
break;
}
}
}
}
return iRecievingError;
}
/**
Ïîñûëêà êîìàíäû
äîïîëíÿåò êîìàíäó àäðåñîì óñòðîéñòâà è crc
âîçâðàùàåò íîìåð îøèáêè è äàííûå ïî óêàçàòåëþ
The function is a simple wrapper for the CCCRSProtocol::SendCommand(LPBYTE BufOut, LPBYTE BufIn) member function
and performs the following actions:
-# Complementing the output frame with the device address and CRC16
-# Sending the frame and receiving a response using CCCRSProtocol::SendCommand(LPBYTE BufOut, LPBYTE BufIn) member function
-# Checking received frame integrity (by CRC16 value)
-# Returning the response wrapped in the CCommand object
\param Cmd a parameter of type CCommand & containing output frame (should contain all required information except of device address and CRC)
\param Addr a parameter of type BYTE containing the device address used for communication.
Refer to \link Addr Device address list \endlink for the valid values
*/
unsigned char tmpBuffer[256];
int TransmitCMD(unsigned char *Cmd, unsigned char Addr, unsigned char **data)
{
int i=(Cmd[2]) ? Cmd[2]
: ((unsigned short)Cmd[4]<<8)+Cmd[5];
Cmd[1] = Addr;
unsigned short wCRC=CalculateCRC(Cmd);
Cmd[i-2] = (unsigned char)wCRC;
Cmd[i-1] = (unsigned char)(wCRC>>8);
int iErrCode=SendCommand(Cmd, tmpBuffer);
if((!iErrCode)&&(Cmd[3])&&(0xFF!=Cmd[3]))
{
if (tmpBuffer[2])
{
wCRC = (unsigned short)tmpBuffer[tmpBuffer[2]-2];
wCRC += (unsigned short)((unsigned short)tmpBuffer[tmpBuffer[2]-1])<<8;
}
else
{
wCRC = 0;
//wCRC=tmpBuffer[(tmpBuffer[2])?tmpBuffer[2]:
// (((unsigned short)(tmpBuffer[4]))<<8)+tmpBuffer[5]-2]+
// (tmpBuffer[(tmpBuffer[2])?tmpBuffer[2]:(((unsigned short)(tmpBuffer[4]))<<8)+tmpBuffer[5]-1]<<8);
}
if(CalculateCRC(tmpBuffer)!=wCRC) iErrCode=RE_CRC;
}
*data = tmpBuffer;
return iErrCode;
}
/** \brief The CCCRSProtocol::Transmit function carries complete protocol exchange
The function is a simple wrapper for the CCCRSProtocol::TransmitCMD(CCommand CMD, BYTE Addr) member function
and performs the following actions:
-# Sending the frame and receiving a response using CCCRSProtocol::TransmitCMD(CCommand CMD, BYTE Addr) member function
-# Checking the device response and determining whether ACK or NAK should be sent
-# Sending ACK or NAK message to the device or retransmitting the command up to 3 times untill communication is successfully completed
-# Returning the response wrapped in the CCommand object
\param CMD a parameter of type CCommand & containing output frame (should contain all required information except of device address and CRC)
\param Addr a parameter of type BYTE containing the device address used for communication.
Refer to \link Addr Device address list \endlink for the valid values
\return CCommand - an object containing response data and communication error code
*/
// ôóíêöèÿ ïîñûëàåò êîìàíäó, ïîñûëàåò ACK è ïîâòîðÿåò êîìàíäó, åñëè îøèáêà
int Transmit(unsigned char *CMD, unsigned char Addr)
{
unsigned char *cmdRes, cmdACK[16];
int error;
VPend();
for (int i=0; i<3; i++)
{
error=TransmitCMD(CMD, Addr, &cmdRes);
cmdACK[0] = SYNC;
cmdACK[2] = 6;
cmdACK[3] = ACK;
if (error == RE_NONE)
{
if((ACK==cmdRes[3]) && (cmdRes[2]==6))
{ // îøèáêè íåò
VPost();
return error;
}
if((NAK==cmdRes[3]) && (cmdRes[2]==6))
{
if (iCmdDelay) Sleep(iCmdDelay);//5
}
else
{
cmdACK[3] = ACK;
TransmitCMD(cmdACK, Addr, &cmdRes);
if (iCmdDelay) Sleep(iCmdDelay);//5
break;
}
}
else
{
if(error != RE_TIMEOUT)
{
cmdACK[3] = NAK;
TransmitCMD(cmdACK, Addr, &cmdRes);
if (iCmdDelay) Sleep(iCmdDelay);//5
}
}
}
VPost();
return error;
}
//////////////////////////////////////////////////////////////////////
// CCNET Commands implementation
/** \defgroup CCNETCommands CCNET protocol commands and requests
The group contains member functions providing interface to CCNET commands and requests.
All functions return a bool result showing whether operation was successfully completed.
In the case of error the error code (refer to \link ErrCode Possible error codes \endlink)
is stored in the CCCRSProtocol::iLastError member variable, which can be used in further analysis.
@{
*/
/** \brief The CCCRSProtocol::CmdReset function sends a RESET command to the device
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if command was acknowledged
*/
unsigned char cc_buf[256];
int CC_CmdReset(unsigned char Addr)
{
const unsigned char Data[]={SYNC,0,6,RESET,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response = Transmit(cc_buf, Addr);
unsigned char ack;
if (!Response)
{
ack = tmpBuffer[3];
if(ack != ACK)
{
iLastError = (ack != ST_INV_CMD) ? ER_NAK : ER_INVALID_CMD;
return 0;
}
else
{
return 1;
}
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdPoll function sends POLL command to the device
The function sends POLL command and fills bytes Z1 and Z2 of the response into the CCCRSProtocol::PollResults structure.
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if exchange was successfully completed
*/
int CC_CmdPoll(unsigned char Addr, TPollResults *PollResults)
{
const unsigned char Data[]={SYNC,0,6,POLL,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf, Addr);
if(!Response)
{
PollResults->Z1 = tmpBuffer[3];
PollResults->Z2 = tmpBuffer[4];
return 1;
}
else
{
PollResults->Z1=0;
PollResults->Z2=0;
return 0;
}
}
/** \brief The CCCRSProtocol::CmdStatus function sends STATUS REQUEST to the device
The response status data is stored in the CCCRSProtocol::BillStatus member structure.
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if exchange was successfully completed
*/
int CC_CmdStatus(unsigned char Addr, TBillStatus* BillStatus)
{
const unsigned char Data[]={SYNC,0,6,GET_STATUS,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
if(!Response)
{
if((tmpBuffer[3]==ST_INV_CMD)&&(tmpBuffer[2]==6))
{
iLastError=ER_INVALID_CMD;
BillStatus->Enabled=0;
BillStatus->Security=0;
BillStatus->Routing=0;
return 0;
}
BillStatus->Enabled=tmpBuffer[5]+((unsigned long)tmpBuffer[4]<<8)+((unsigned long)tmpBuffer[3]<<16);
BillStatus->Security=tmpBuffer[8]+((unsigned long)tmpBuffer[7]<<8)+((unsigned long)tmpBuffer[6]<<16);
BillStatus->Routing=tmpBuffer[11]+((unsigned long)tmpBuffer[10]<<8)+((unsigned long)tmpBuffer[9]<<16);
return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdIdentification function sends IDENTIFICATION request
The function sends IDENTIFICATION request and stores device identification in the member CCCRSProtocol::Ident structure.
The function supports both new and old identification formats of Bill-To-Bill units.
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the exchange was successfully completed and data received
*/
int CC_CmdIdentification(unsigned char Addr, TIdent* Ident)
{
const unsigned char Data[]={SYNC,0,6,IDENTIFICATION,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
if (!Response)
{
if((tmpBuffer[3]==ST_INV_CMD)&&(tmpBuffer[2]==6))
{
iLastError=ER_INVALID_CMD;
return 0;
}
strcpy(Ident->BCCPUBoot,"N/A");
strcpy(Ident->BCCPUVersion,"N/A");
strcpy(Ident->BCCS1Boot,"N/A");
strcpy(Ident->BCCS2Boot,"N/A");
strcpy(Ident->BCCS3Boot,"N/A");
strcpy(Ident->BCCSVersion,"N/A");
strcpy(Ident->BCDispenserBoot,"N/A");
strcpy(Ident->BCDispenserVersion,"N/A");
strcpy(Ident->BVBootVersion,"N/A");
strcpy(Ident->BVVersion,"N/A");
strcpy(Ident->PartNumber,"N/A");
char sTemp[64];
int iPos=3,iLen=15;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->PartNumber,sTemp);
iLen=12;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->SN,sTemp);
char *strTemp=(char*)tmpBuffer+iPos;
Ident->DS1=0;iPos+=8;
for(int i=0;i<7;i++)
{
Ident->DS1<<=8;
Ident->DS1+=strTemp[i];
}
if(tmpBuffer[2]<109) return 1;
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BVBootVersion,sTemp);
iLen=20;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BVVersion,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCPUBoot,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCPUVersion,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCDispenserBoot,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCDispenserVersion,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCS1Boot,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCS2Boot,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCS3Boot,sTemp);
iLen=6;
strncpy(sTemp,(char*)tmpBuffer+iPos,iLen);
sTemp[iLen]=0;iPos+=iLen;
strcpy(Ident->BCCSVersion,sTemp);
return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdHold function sends HOLD command to the device
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if exchange successfully completed
*/
int CC_CmdHold(unsigned char Addr)
{
const unsigned char Data[256]={SYNC,0,6,HOLD,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf, Addr);
unsigned char ack;
if(!Response)
{
ack = tmpBuffer[3];
if(ack != ACK)
{
iLastError = (ack!=ST_INV_CMD) ? ER_NAK : ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdSetSecurity function sends SET SECURITY LEVELS command
\param wS a parameter of type DWORD - a bitmap containing security levels to set
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if exchange successfully completed
*/
int CC_CmdSetSecurity(unsigned long wS, unsigned char Addr)
{
const unsigned char Data[]={SYNC,0,9,SET_SECURITY,0,0,0,0,0};
memcpy(cc_buf, Data, sizeof(Data));
cc_buf[4]=(unsigned char)(wS>>16);
cc_buf[5]=(unsigned char)(wS>>8);
cc_buf[6]=(unsigned char)(wS);
int Response=Transmit(cc_buf, Addr);
unsigned char ack;
if(!Response)
{
ack = tmpBuffer[3];
if(ack != ACK)
{
iLastError = (ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdBillType function sends ENABLE BILL TYPE command
\param enBill a parameter of type DWORD - a bitmap containing 1 in the positions corresponding to the enabled bill types
\param escBill a parameter of type DWORD - a bitmap containing 1 in the positions corresponding to bill type processed with escrow
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool- true if the command was acknowledged
*/
int CC_CmdBillType(unsigned long enBill, unsigned long escBill, unsigned char Addr)
{
unsigned char Data[]={SYNC,0,12,BILL_TYPE,
(unsigned char)(enBill>>16),(unsigned char)(enBill>>8),(unsigned char)enBill,
(unsigned char)(escBill>>16),(unsigned char)(escBill>>8),(unsigned char)escBill,
0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf, Addr);
unsigned char ack;
if (!Response)
{
ack = tmpBuffer[3];
if(ack!=ACK)
{
iLastError=(ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdPack function sends PACK command
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the command was acknowledged
*/
int CC_CmdPack(unsigned char Addr)
{
const unsigned char Data[]={SYNC,0,6,PACK,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
unsigned char ack;
if (!Response)
{
ack = tmpBuffer[3];
if(ack!=ACK)
{
iLastError=(ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdReturn function sends RETURN command
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the command was acknowledged
*/
int CC_CmdReturn(unsigned char Addr)
{
const unsigned char Data[256]={SYNC,0,6,RETURN,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
unsigned char ack;
if(!Response)
{
ack = tmpBuffer[3];
if(ack!=ACK)
{
iLastError=(ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdGetBillTable function sends BILL TABLE request
\param BillTable a parameter of type _BillRecord * containing pointer to the _BillRecord array receiving the bill table.
Position in the array corresponds to the bill type and the structure at the position describes that bill type.
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the response was successfully received
*/
int CC_CmdGetBillTable(unsigned char Addr, TBillRecord *BillTable)
{
const unsigned char Data[]={SYNC,0,6,GET_BILL_TABLE,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
if(!Response)
{
int i;
if((tmpBuffer[3]==ST_INV_CMD)&&(tmpBuffer[2]==6))
{
iLastError=ER_INVALID_CMD;
for(int i=0;i<24;i++)
{
BillTable[i].Denomination=0;
strcpy(BillTable[i].sCountryCode,"");
}
return 0;
}
for(i=0;i<tmpBuffer[2]-5;i+=5)
{
BillTable[i/5].Denomination=tmpBuffer[i+3];
char sTmp[5];
strncpy(sTmp,(const char *)(tmpBuffer+i+4),3);
sTmp[3]='\0';
strcpy(BillTable[i/5].sCountryCode,sTmp);
if(((tmpBuffer)[i+7])&0x80)
{
for(int j=0; j<((tmpBuffer[i+7])&0x7F);j++)
BillTable[i/5].Denomination/=10;
}
else
{
for(int j=0; j<((tmpBuffer[i+7])&0x7F);j++)
BillTable[i/5].Denomination*=10;
};
}
for(;i<24*5;i+=5)
{
BillTable[i/5].Denomination=0;
strcpy(BillTable[i/5].sCountryCode,"");
}
return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdSetOptions function
\param dwOpt a parameter of type DWORD containing bitmap with options to enable. refer to \link Options Options list \endlink
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the command was acknowledged
*/
int CC_CmdSetOptions(unsigned long dwOpt, unsigned char Addr)
{
unsigned char Data[]={SYNC,0,10,SET_OPTIONS,
(unsigned char)(dwOpt>>24),(unsigned char)(dwOpt>>16),(unsigned char)(dwOpt>>8),(unsigned char)dwOpt,
0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
if(!Response)
{
unsigned char ack = tmpBuffer[3];
if(ack!=ACK)
{
iLastError=(ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return 0;
}
else return 1;
}
else
{
return 0;
}
}
/** \brief The CCCRSProtocol::CmdGetCRC32 function sends CRC32 request
\param dwCRC a parameter of type DWORD & containing a reference to the variable receiving CRC32 of the firmware.
\param Addr a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
\return bool - true if the request was answered
*/
int CC_CmdGetCRC32(unsigned long *dwCRC, unsigned char Addr)
{
unsigned char Data[]={SYNC,0,6,CRC32,0,0};
memcpy(cc_buf, Data, sizeof(Data));
int Response=Transmit(cc_buf,Addr);
if(!Response)
{
if((tmpBuffer[3]==ST_INV_CMD)&&(tmpBuffer[2]==6))
{
iLastError=ER_INVALID_CMD;
dwCRC=0;
return 0;
}
*dwCRC=tmpBuffer[6]+((unsigned long)tmpBuffer[5]<<8)+((unsigned long)tmpBuffer[4]<<16)+((unsigned long)tmpBuffer[3]<<24);
return 1;
}
else
{
dwCRC=0;
return 0;
}
}
/** @} */

View File

@ -1,364 +0,0 @@
#ifndef _CCRSPROTOCOL_H_
#define _CCRSPROTOCOL_H_
#define CC_TIME_OUT 300
#define SYNC 0x02 //!< synchronization byte
#define ACK 0x00 //!< ACK code
#define NAK 0xFF //!< NAK code
#define ST_INV_CMD 0x30 //!< INVALID COMMAND response
/** \defgroup Addr Device Addresses
* @{
*/
#define ADDR_BB 0x01 //!< Address for Bill-To-Bill units
#define ADDR_CHANGER 0x02 //!< Address for Coin Changer
#define ADDR_FL 0x03 //!< Address for Bill Validators
#define ADDR_CR 0x04 //!< Address for Smart Card Reader
/**@} */
/** \defgroup Cmds Interface commands
* @{
*/
#define RESET 0x30 //!<REST command code
#define GET_STATUS 0x31 //!<STATUS REQUEST command code
#define SET_SECURITY 0x32 //!<SET SECURITY command code
#define POLL 0x33 //!<POLL command code
#define BILL_TYPE 0x34 //!<BILL TYPE command code
#define PACK 0x35 //!<PACK command code
#define RETURN 0x36 //!<RETURN command code
#define IDENTIFICATION 0x37 //!<IDENTIFICATION command code
#define IDENT_EXT 0x3E //!<EXTENDED IDENTIFICATION command code
#define HOLD 0x38 //!<HOLD command code
#define C_STATUS 0x3B //!<RECYCLING CASSETTE STATUS REQUEST command code
#define DISPENSE 0x3C //!<DISPENSE command code
#define UNLOAD 0x3D //!<UNLOAD command code
#define SET_CASSETES 0x40 //!<SET RECYCLING CASSETTE TYPE command code
#define GET_BILL_TABLE 0x41 //!<BILL TABLE REQUEST command code
#define DOWNLOAD 0x50 //!<DOWNLOAD command code
#define CRC32 0x51 //!<CRC32 REQUEST command code
#define SET_TIME 0x62 //!<SET BB TIME command code
#define SET_BAR_PARAMS 0x39 //!<SET BARCODE PARAMETERS command code
#define EXTRACT_BAR_DATA 0x3A //!<EXTRACT BARCODE DATA command code
#define POWER_RECOVERY 0x66 //!<POWER RECOVERY command code
#define EMPTY_DISPENSER 0x67 //!<EMPTY DISPENSER command code
#define SET_OPTIONS 0x68 //!<SET OPTIONS command code
#define GET_OPTIONS 0x69 //!<GET OPTIONS command code
/**@} */
/** \defgroup Options Options
* Describes options supported by CCNET (as a bitmap)
* @{
*/
//Options (bitmap)
#define OPT_LED_INHIBIT 0x80000000L //!< Turn OFF LEDs of the bezel in the DISABLED state
#define OPT_KEEP_BILL 0x40000000L //!< Hold bill after ejection on the input roller
#define OPT_LOOK_TAPE 0x20000000L //!< Use improved algorithm for tape detection
#define OPT_TURN_SWITCH 0x10000000L //!< Turn switch after packing a bill
/**@} */
// States
/** \defgroup States CCNET states and events
*
* @{
*/
#define ST_POWER_UP 0x10//!< POWER UP state
#define ST_POWER_BILL_ESCROW 0x11//!< POWER UP WITH BILL IN ESCROW state
#define ST_POWER_BILL_STACKER 0x12//!< POWER UP WITH BILL IN STACKER state
#define ST_INITIALIZE 0x13//!< INITIALIZING state
#define ST_IDLING 0x14//!< IDLING state
#define ST_ACCEPTING 0x15//!< ACCEPTING state
#define ST_PACKING 0x17//!< STACKING/PACKING state
#define ST_RETURNING 0x18//!< RETURNING state
#define ST_DISABLED 0x19//!< UNIT DISABLED state
#define ST_HOLDING 0x1A//!< HOLDING state
#define ST_BUSY 0x1B//!< Device is busy
#define ST_REJECTING 0x1C//!< REJECTING state. Followed by a rejection code
//Rejection codes
/** \defgroup RCodes Rejection codes
*
* @{
*/
#define RJ_INSERTION 0x60 //!< Rejection because of insertion problem
#define RJ_MAGNETIC 0x61 //!< Rejection because of invalid magnetic pattern
#define RJ_REMAINING 0x62 //!< Rejection because of other bill remaining in the device
#define RJ_MULTIPLYING 0x63 //!< Rejection because of multiple check failures
#define RJ_CONVEYING 0x64 //!< Rejection because of conveying
#define RJ_IDENT 0x65 //!< Rejection because of identification failure
#define RJ_VRFY 0x66 //!< Rejection because of verification failure
#define RJ_OPT 0x67 //!< Rejection because of optical pattern mismatch
#define RJ_INHIBIT 0x68 //!< Rejection because the denomination is inhibited
#define RJ_CAP 0x69 //!< Rejection because of capacity sensor pattern mismatch
#define RJ_OPERATION 0x6A //!< Rejection because of operation error
#define RJ_LNG 0x6C //!< Rejection because of invalid bill length
#define RJ_UV 0x6D //!< Rejection because of invalid UV pattern
#define RJ_BAR 0x92 //!< Rejection because of unrecognized barcode
#define RJ_BAR_LNG 0x93 //!< Rejection because of invalid barcode length
#define RJ_BAR_START 0x94 //!< Rejection because of invalid barcode start sequence
#define RJ_BAR_STOP 0x95 //!< Rejection because of invalid barcode stop sequence
/**@} */
#define ST_DISPENSING 0x1D//!< DISPENSING state
#define ST_UNLOADING 0x1E//!< UNLOADING state
#define ST_SETTING_CS_TYPE 0x21//!< SETTING RECYCLING CASSETTE TYPE state
#define ST_DISPENSED 0x25//!< DISPENSED event
#define ST_UNLOADED 0x26//!< UNLOADED event
#define ST_BILL_NUMBER_ERR 0x28//!< INVALID BILL NUMBER event
#define ST_CS_TYPE_SET 0x29//!< RECYCLING CASSETTE TYPE SET event
#define ST_ST_FULL 0x41//!< DROP CASSETTE IS FULL state
#define ST_BOX 0x42//!< DROP CASSETTE REMOVED state
#define ST_BV_JAMMED 0x43//!< JAM IN VALIDATOR state
#define ST_ST_JAMMED 0x44//!< JAM IN STACKER state
#define ST_CHEATED 0x45//!< CHEATED event
#define ST_PAUSED 0x46//!< PAUSED state
#define ST_FAILURE 0x47//!< FAILURE state
//Failure codes
/** \defgroup FCodes Failure codes
*
* @{
*/
#define FLR_STACKER 0x50 //!< Stacking mechanism failure
#define FLR_TR_SPEED 0x51 //!< Invalid speed of transport mechanism
#define FLR_TRANSPORT 0x52 //!< Transport mechanism failure
#define FLR_ALIGNING 0x53 //!< Aligning mechanism failure
#define FLR_INIT_CAS 0x54 //!< Initial cassette status failure
#define FLR_OPT 0x65 //!< Optical channel failure
#define FLR_MAG 0x66 //!< Inductive channel failure
#define FLR_CAP 0x67 //!< Capacity sensor failure
/**@} */
// Credit events
#define ST_PACKED 0x81 /**< A bill has been packed. 2nd byte - 0xXY:
\n X-bill type
\n Y-Packed into:
\n 0-BOX, else - Cassette Y;
*/
#define ESCROW 0x80 //!< A bill is held in the escrow position
#define RETURNED 0x82 //!< A bill was returned
/**@} */
// Cassetes status
/** \defgroup CSStatus Possible cassette status codes
*
* @{
*/
#define CS_OK 0 //!< Cassette is present and operational
#define CS_FULL 1 //!< Cassette is full
#define CS_NU 0xFE //!< Cassette is not present
#define CS_MALFUNCTION 0xFF //!< Cassette is malfunctioning
#define CS_NA 0xFD //!< Cassette is not assigned to any denomination
#define CS_ESCROW 0xFC //!< Cassette is assigned to multi-escrow
/**@} */
/** \defgroup BTs Predefined bill type values
*
* @{
*/
#define BT_ESCROW 24 //!< Bill type associated with the escrow cassette
#define BT_NO_TYPE 0x1f //!< Invalid bill type
#define BT_BAR 23 //!< Bill type associated with barcode coupon
/**@} */
// Error codes
/** \defgroup ErrCode CCNET Interface error codes
*
* @{
*/
/** \defgroup CErrs Communication error codes
The codes related to phisical data transmission and frame integrity
@{
*/
#define RE_NONE 0//!< No error happened
#define RE_TIMEOUT -1//!< Communication timeout
#define RE_SYNC -2//!< Synchronization error (invalid synchro byte)
#define RE_DATA -3//!< Data reception error
/**@} */
#define RE_CRC -4//!< CRC error
/** \defgroup LErrs Logical error codes
The codes related to the interface logic
@{
*/
#define ER_NAK -5//!< NAK received
#define ER_INVALID_CMD -6//!< Invalid command response received
#define ER_EXECUTION -7//!< Execution error response received
#define ERR_INVALID_STATE -8//!< Invalid state received
/**@} */
/**@} */
// Class Declaration
/** \class CCCRSProtocol
\brief The CCCRSProtocol class providing low-level communication functions for the CCNET protocol
*/
/*
class CCCRSProtocol
{
CCommand cmdIn; //!< A variable to store current device responses
CCommand cmdOut;//!< A variable to store controller commands
CCOMPort COMPort; //!< A COM port to work with
private:
WORD CalculateCRC(unsigned char*);
CCommand Transmit(CCommand CMD, BYTE Addr=ADDR_BB);
unsigned short crc16_ccitt(unsigned char, unsigned short);
CCommand TransmitCMD(CCommand&, BYTE);
int SendCommand(LPBYTE BufOut, LPBYTE BufIn);
public:
int iCmdDelay; //!< Delay between two consequtive commands
int iTimeout; //!< Communication timeout value
int iLastError; //!< A variable storing error code generated during last serial I/O operation
public:
CCCRSProtocol();
virtual ~CCCRSProtocol();
// Protocol commands
bool CmdEmptyDispenser();
bool CmdPowerRecovery(BYTE&,LPBYTE,int&);
bool CmdGetCRC32(DWORD&,BYTE);
bool CmdGetOptions(DWORD&, BYTE);
bool CmdSetOptions(DWORD, BYTE);
bool CmdIdentExt(BYTE);
bool CmdExtractBarData(LPSTR sBar, BYTE Addr);
bool CmdSetBarParams(BYTE Format, BYTE Length, BYTE Addr);
bool CmdBBTime(time_t&, bool bSet=false);
bool CmdDispenseNew(LPBYTE, bool bTypes=true);
bool CmdGetBillTable(_BillRecord*,BYTE Addr=ADDR_BB);
bool CmdSetCasseteType(BYTE, BYTE,BYTE);
bool CmdReset(BYTE Addr=ADDR_BB);
bool CmdPoll(BYTE Addr=ADDR_BB);
bool CmdStatus(BYTE Addr=ADDR_BB);
bool CmdUnload(BYTE,BYTE);//Unload bills
bool CmdDispense(LPBYTE);//
bool CmdCsStatus();
bool CmdReturn(BYTE Addr=ADDR_BB);
bool CmdPack(BYTE Addr=ADDR_BB);
bool CmdBillType(DWORD,DWORD,BYTE Addr=ADDR_BB);
bool CmdSetSecurity(DWORD,BYTE Addr=ADDR_BB);
bool CmdHold(BYTE Addr=ADDR_BB);
bool CmdIdentification(BYTE Addr=ADDR_BB);
//////////////////////////
// COM port related functions
BOOL InitCOM(int, int);
DWORD PortState(int);
CCOMPort* GetCOMPort();
*/
//Protocol structures
/** \struct _BillStatus
\brief The _BillStatus struct describing response to the STATUS REQUEST command
*/
/*
struct _BillStatus
{
DWORD Enabled; //!< A bitmap describing which bill types are enabled
DWORD Security; //!< A bitmap describing which bill types are processed in High Security mode
DWORD Routing; //!< A bitmap describing which denominations are routed to a recycling cassette. Is a valid value only for BB units
}BillStatus;//!< Variable containing the most recent response to the STATUS REQUEST
*/
/** \struct _Identification
\brief The _Identification struct contains identification of the device
*/
/*
*/
/** \struct _PollResults
\brief The _PollResults struct containing 2 first bytes of the response to the POLL command
*/
/*
_Cassete Cassetes[16], //!< List of the cassettes
EscrCassete; //!< Escrow cassette
};
*/
// The _PollResults struct containing 2 first bytes of the response to the POLL command
typedef struct{
unsigned char Z1; //!< State
unsigned char Z2; //!< State extension or substate
}TPollResults; //!< A variable keeping last POLL result
typedef struct{
unsigned long Enabled; //!< A bitmap describing which bill types are enabled
unsigned long Security; //!< A bitmap describing which bill types are processed in High Security mode
unsigned long Routing; //!< A bitmap describing which denominations are routed to a recycling cassette. Is a valid value only for BB units
}TBillStatus;//!< Variable containing the most recent response to the STATUS REQUEST
typedef struct{
// Identification command fields
char PartNumber[16];//!< Firmware part number
char SN[13];//!< Device's serial number
unsigned long long DS1;//!< Device's asset number
// Extended identification command fiels
char BVBootVersion[7];//!< Boot version of the validating head (is reported in response to EXTENDED IDENTIFICATION command)
char BVVersion[21];//!< Firmware version of the validating head (is reported in response to EXTENDED IDENTIFICATION command)
char BCCPUBoot[7];//!< Boot version of the central controller (is reported in response to EXTENDED IDENTIFICATION command)
char BCCPUVersion[7];//!<Firmware version of the central controller (is reported in response to EXTENDED IDENTIFICATION command)
char BCDispenserBoot[7];//!< Boot version of the dispenser (is reported in response to EXTENDED IDENTIFICATION command)
char BCDispenserVersion[7];//!< Firmware version of the dispenser (is reported in response to EXTENDED IDENTIFICATION command)
char BCCS1Boot[7];//!< Boot version of the cassette 1 (is reported in response to EXTENDED IDENTIFICATION command)
char BCCS2Boot[7];//!< Boot version of the cassette 2 (is reported in response to EXTENDED IDENTIFICATION command)
char BCCS3Boot[7];//!< Boot version of the cassette 3 (is reported in response to EXTENDED IDENTIFICATION command)
char BCCSVersion[7];//!< Firmware version of the cassettes (is reported in response to EXTENDED IDENTIFICATION command)
}TIdent;//!< A variable containing current device identification
/** \struct _BillRecord
\brief The _BillRecord struct represents a record in the bill table.
The structure describes denomination of the bill, country or currency code and whether
the bill is forwarded to the cassette. The bill table usually is an array of _BillRecord
structures, where the position is representing a billtype.
*/
typedef struct{
float Denomination; //!< Denomination of the bill
char sCountryCode[4]; //!< Country or currency code
unsigned char bRouted; //!< A bool variable specifiying whether the bill is forwarded to a cassette
}TBillRecord;
extern int CC_CmdReset(unsigned char Addr);
extern int CC_CmdPoll(unsigned char Addr, TPollResults *PollResults);
extern int CC_CmdStatus(unsigned char Addr, TBillStatus* BillStatus);
extern int CC_CmdIdentification(unsigned char Addr, TIdent* Ident);
extern int CC_CmdHold(unsigned char Addr);
extern int CC_CmdSetSecurity(unsigned long wS, unsigned char Addr);
extern int CC_CmdBillType(unsigned long enBill, unsigned long escBill, unsigned char Addr);
extern int CC_CmdPack(unsigned char Addr);
extern int CC_CmdReturn(unsigned char Addr);
extern int CC_CmdGetBillTable(unsigned char Addr, TBillRecord *BillTable);
extern int CC_CmdSetOptions(unsigned long dwOpt, unsigned char Addr);
extern int CC_CmdGetCRC32(unsigned long *dwCRC, unsigned char Addr);
#define PurgeComm Uart1_Purge
#define COMPort_Send Uart1_Send
#define COMPort_Recieve(x,y) Uart1_Receive(x,y,CC_TIME_OUT)
#define Sleep(x) OSTimeDly(x)
#endif //#ifndef _CCRSPROTOCOL_H_

View File

@ -1,5 +0,0 @@
#ifndef _VMCCONSTS_H_
#define _VMCCONSTS_H_
#endif // _VMCCONSTS_H_

View File

@ -1,106 +0,0 @@
#include <includes.h>
#include "uart1.h"
void Uart1_Send(unsigned char *buf, int len)
{
while (len--) Uart1_WrByte(*buf++);
}
int Uart1_Receive(unsigned char *buf, int len, int timeout)
{
while (len--)
{
if (!Uart1_RdByteWithTimeOut(buf++, timeout)) return 0;
}
return 1;
}
void Uart1_Init(CPU_INT32U baud_rate)
{
float div_fp; /* Baud rate divisor floating point precision */
CPU_INT16U div_int; /* Baud rate divisor floating point precision */
CPU_INT08U divlo;
CPU_INT08U divhi;
CPU_INT32U pclk_freq;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
pclk_freq = BSP_CPU_PclkFreq(PCLK_UART1); /* Get peripheral clock frequency */
div_fp = (pclk_freq / 16.0 / baud_rate); /* Compute divisor for desired baud rate */
div_int = (CPU_INT16U)(div_fp + 0.5); /* Round the number up */
divlo = div_int & 0x00FF; /* Split divisor into LOW and HIGH bytes */
divhi = (div_int >> 8) & 0x00FF;
PCONP_bit.PCUART1 = 1; /* Enable the power bit for UART0 */
U1LCR = 0x80; /* Enable acces to Divisor latches */
U1DLL = divlo; /* Load divisor */
U1DLM = divhi;
U1FDR = 0x10;
U1LCR = 0;
U1MCR = 0;
U1ACR = 0;
U1FCR_bit.FCRFE = 1; // enable fifo
U1LCR_bit.WLS = 0x03; // 8 bit
U1LCR_bit.SBS = 0; // 1 stop bit
U1IER = 0;
PINSEL4_bit.P2_0 = 0x2;
PINSEL4_bit.P2_1 = 0x2;
PINMODE4_bit.P2_0 = 0;
PINMODE4_bit.P2_1 = 0;
FIO2DIR_bit.P2_0 = 1;
FIO2DIR_bit.P2_1 = 0;
FIO2MASK_bit.P2_0 = 1;
FIO2MASK_bit.P2_1 = 1;
OS_EXIT_CRITICAL();
}
void Uart1_WrByte(CPU_INT08U tx_byte)
{
while (!U1LSR_bit.THRE) {
OSTimeDly(1);
}
U1THR = tx_byte;
}
void Uart1_Purge(void)
{
//î÷èñòèòü ïðèåì
U1FCR_bit.RFR = 1;
}
int Uart1_RdByteWithTimeOut(CPU_INT08U *byte, CPU_INT32U timeout)
{
CPU_INT32U ctr = 0;
while (!U1LSR_bit.DR) {
OSTimeDly(1);
if (++ctr > timeout) return 0;
}
//error = U1LSR;
*byte = (CPU_INT08U)(U1RBR & 0x00FF); /* Remove the data from the holding register */
return 1;
}

View File

@ -1,11 +0,0 @@
#ifndef _UART1_H_
#define _UART1_H_
extern void Uart1_Purge(void);
extern void Uart1_Send(unsigned char *buf, int len);
extern int Uart1_Receive(unsigned char *buf, int len, int timeout);
extern void Uart1_WrByte(CPU_INT08U tx_byte);
extern int Uart1_RdByteWithTimeOut(CPU_INT08U *byte, CPU_INT32U timeout);
extern void Uart1_Init(CPU_INT32U baud_rate);
#endif //#ifndef _UART0_H_

View File

@ -1,935 +0,0 @@
#include <includes.h>
#include "modem.h"
#include "modem_task.h"
#include "app_serv.h"
#include "data.h"
#include "datadesc.h"
#include "uart2.h"
static char additional_buf[256];
#define ModemUart_Ready Uart2_Ready
#define ModemComPortFlush Uart2_Flush
#define ModemUart_Getc Uart2_Getc
#define ModemUart_Gotc Uart2_Gotc
#define ModemUart_Putc Uart2_Putc
#define ModemUart_Init Uart2_Init
static OS_EVENT *ModemLock = NULL;
static char modem_buf[512];
static int modem_connected;
// ïîëó÷èòü äîñòóï ê ìîäåìó
static void GetModem(void)
{
CPU_INT08U err;
while (1)
{
OSSemPend(ModemLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}
}
// îñâîáîäèòü ìîäåì
static void FreeModem(void)
{
OSSemPost(ModemLock);
}
// çàïèñü ñòðîêè â ìîäåì
static void ModemWriteStr(char const *str)
{
while (*str != 0)
{
while (!ModemUart_Ready()) OSTimeDly(1);
ModemUart_Putc(*str++);
}
}
// ÷òåíèå ñòðîêè èç ìîäåìà ïî òàéìàóòó
static int ModemReadStr(char *str, unsigned long timeout)
{
int byte_ctr = 0;
while (byte_ctr < 256)
{
CPU_INT08U byte;
unsigned long to = timeout;
while (!ModemUart_Gotc())
{
if (to == 0)
{
*str = 0x00;
return 0;
}
OSTimeDly(1);
to--;
}
int ch = ModemUart_Getc();
if (ch < 0)
{
*str = 0x00;
return 0;
}
byte = (char)ch;
*str++ = byte;
byte_ctr++;
if (byte == 0x0a) break;
}
*str = 0x00;
return 1;
}
static int ModemReadByte(CPU_INT08U *byte, unsigned long timeout)
{
unsigned long ctr = 0;
while (!ModemUart_Gotc())
{
OSTimeDly(1);
ctr++;
if (ctr > timeout) return 0;
}
*byte = (CPU_INT08U)ModemUart_Getc();
return 1;
}
// ÷òåíèå ñòðîêè èç ìîäåìà èç ñðàâíåíèå ñî ñòðîêîé
static int ModemReadStrAndComp(char *str, char const *format, unsigned long timeout)
{
int result;
if (ModemReadStr(str, timeout))
{
result = strcmp ((char *)str, (char const *)format);
}
else
{
return -1;
}
return result;
}
// èíèöèàëèçàöèÿ/ïðîâåðêà ñîñòîÿíèÿ ìîäåìà
int InitModem(void)
{
int result;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
CPU_INT32U val;
OS_ENTER_CRITICAL();
email_options.valid = 0;
modem_connected = 0;
OS_EXIT_CRITICAL();
GetData(&EnableModemDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
if (val)
{
PINSEL1_bit.P0_24 = 0x0;
PINMODE1_bit.P0_24 = 0;
FIO0DIR_bit.P0_24 = 1;
FIO0MASK_bit.P0_24 = 0;
FIO0CLR_bit.P0_24 = 1;
OSTimeDly(1000);
FIO0SET_bit.P0_24 = 1;
OSTimeDly(60000);
ModemUart_Init(115200);
if (!ModemLock) ModemLock = OSSemCreate(1);
GetModem();
// ïðîâåðèì ñâÿçü
sprintf(modem_buf, "AT\r\n");
result = ModemSendOKCommand(modem_buf, 1000);
if (result != 0)
{
FreeModem();
goto EXIT_INIT;
}
// ïðîâåðèì, ââåäåí ëè ïèí
sprintf(modem_buf, "AT+CPIN?\r\n");
result = ModemSendOKCommand(modem_buf, 1000);
if (result != 0)
{
FreeModem();
goto EXIT_INIT;
}
FreeModem();
OS_ENTER_CRITICAL();
modem_connected = 1;
OS_EXIT_CRITICAL();
OSTimeDly(1000);
result = InitModemEmailParams();
}
else
{
result = 0;
}
EXIT_INIT:
// ñîçäàäèì çàäà÷ó è î÷åðåäü ìîäåìà
if (ModemQuery == NULL)
{
ModemQuery = OSQCreate(&ModemTbl[0], MODEM_QUERY_LEN);
OSTaskCreate(ModemTask, (void *)0, (OS_STK *)&ModemTaskStk[MODEM_TASK_STK_SIZE-1], MODEM_TASK_PRIO);
}
return result;
}
// ïîñûëêà ñîîáùåíèÿ ïî òàêîìó-òî íîìåðó òàêîé-òî òåêñò
int ModemSendSMSMessage(char const* number, char const* text)
{
char i;
GetModem();
if (ModemWriteSMS(text, (unsigned char*)&i)) {FreeModem(); return -1;}
ModemComPortFlush();
OSTimeDly(200);
if (ModemSendSMS(number, i)) {FreeModem(); return -1;}
ModemComPortFlush();
OSTimeDly(200);
if (ModemDeleteSMS(i)) {FreeModem(); return -1;}
OSTimeDly(200);
ModemComPortFlush();
FreeModem();
return 0;
}
// ÷òåíèå èç ïàìÿòè ñìñ ñ óêàçàííûì íîìåðîì
int ModemReadSMS(char *text, int index)
{
unsigned char count;
char *ptr;
GetModem();
ModemComPortFlush();
sprintf((char*)modem_buf, "AT+CMGR=%d\r\n", index);
ModemWriteStr(modem_buf);
if (!ModemReadStr(modem_buf, MODEM_RX_TIMEOUT)) {FreeModem(); return -1;}
if (!ModemReadStr(modem_buf, MODEM_RX_TIMEOUT)) {FreeModem(); return -1;}
// äàëüøå òåêñò ñîîáùåíèÿ
count = 0;
while (count < 160)
{
modem_buf[0] = 0;
if (!ModemReadStr(modem_buf, MODEM_RX_TIMEOUT)) {FreeModem(); return -1;}
if (strcmp(modem_buf, "OK\r\n") == 0)
{
break;
}
else if (strlen(modem_buf) != 0)
{
// åñòü íåïóñòàÿ ñòðîêà
ptr = (char*)modem_buf;
if (strlen((char const*)modem_buf) < 1) {FreeModem(); return -1;}
while (*ptr) {*text++ = *ptr++; count++;}
}
else
{
break;
}
}
FreeModem();
return 0;
}
// ïîñûëêà ñìñ ñ íîìåðîì index èç ïàìÿòè ìîäåìà ïî óêàçàííîìó íîìåðó
int ModemSendSMS(char const* number, unsigned char index)
{
GetModem();
sprintf((char*)modem_buf, "AT+CMSS=%d,%s\r\n", index, number);
ModemWriteStr(modem_buf);
if (ModemReadStrAndComp(modem_buf, "\r\n", 10000)) {FreeModem(); return -1;}
if (!ModemReadStr(modem_buf, 10000)) {FreeModem(); return -1;}
modem_buf[6] = 0;
if (strcmp((char const*)modem_buf, "+CMSS:")) {FreeModem(); return -1;}
if (ModemReadStrAndComp(modem_buf, "\r\n", 10000)) {FreeModem(); return -1;}
if (ModemReadStrAndComp(modem_buf, "OK\r\n", 10000)) {FreeModem(); return -1;}
FreeModem();
return 0;
}
// óäàëåíèå ñìñêè ñ íîìåðîì index èç ïàìÿòè
int ModemDeleteSMS(unsigned char index)
{
int result;
GetModem();
sprintf((char*)modem_buf, "AT+CMGD=%d\r\n",index);
result = ModemSendOKCommand(modem_buf, 1000);
FreeModem();
return result;
}
// çàïèñü ñìñêè ñ óêàçàííûì òåêñòîì â ïàìÿòü, â index çàïèñûâàåò ïîçèöèþ â ïàìÿòè, êóäà ñìñ çàïèñàëîñü
int ModemWriteSMS(char const* text, unsigned char *index)
{
CPU_INT08U byte;
unsigned long word;
int result;
GetModem();
// ïîñûëàåì êîìàíäó
ModemWriteStr("AT+CMGW\r\n");
if (ModemReadStrAndComp(modem_buf, "\r\n", 1000)) {FreeModem(); return -1;}
if (!ModemReadByte(&byte, 1000)) {FreeModem(); return -1;}
if (byte != '>') {FreeModem(); return -1;}
if (!ModemReadByte(&byte, 1000)) {FreeModem(); return -1;}
if (byte != ' ') {FreeModem(); return -1;}
// ââîäèì òåêñò ñîîáùåíèÿ
ModemWriteStr(text);
// êîíåö ñîîáùåíèÿ
ModemUart_Putc(0x1a);
// ïðèíèìàåì îòâåò î çàïèñè
if (ModemReadStrAndComp(modem_buf, "\r\n", 1000)) {FreeModem(); return -1;}
// ïðî÷èòàåì íîìåð ñìñêè â ïàìÿòè, êóäà îíà çàïèñàëàñü
if (!ModemReadStr(modem_buf, 5000)) {FreeModem(); return -1;}
modem_buf[6] = 0;
if (strcmp((char const*)modem_buf, "+CMGW:")) {FreeModem(); return -1;}
{
int len = strlen((char const*)&modem_buf[7]);
if (len == 3) word = modem_buf[7]-0x30;
else if (len == 4) {word = (modem_buf[7]-0x30)*10 + (modem_buf[8]-0x30);}
}
*index = (unsigned char)word;
result = ModemReadStrAndComp(modem_buf, "\r\n", 1000) + ModemReadStrAndComp(modem_buf, "OK\r\n", 1000);
FreeModem();
// ÎÊ
return result;
}
// ïîñûëêà ñòðîêè, íà êîòîðóþ äîëæåí ïðèéòè îòâåò "OK"
// âîçâðàùàåò 0 åñëè îê
int ModemSendOKCommand(char *str, unsigned long timeout)
{
int i;
ModemComPortFlush();
ModemWriteStr(str);
i = MODEM_REPEAT_RX;
while (i--)
{
if (ModemReadStr(str, timeout))
{
if (strcmp(str, "OK\r\n") == 0)
{
return 0;
}
else if (strcmp(str, "ERROR\r\n") == 0)
{
return -2;
}
continue;
}
else
{
return -1;
}
}
return -3;
}
int ModemSendOKData(char *str, int len, unsigned long timeout)
{
int i;
ModemComPortFlush();
for (i = 0; i < len; i++)
{
while (!ModemUart_Ready()) OSTimeDly(1);
ModemUart_Putc(str[i]);
}
i = MODEM_REPEAT_RX;
while (i--)
{
if (ModemReadStr(str, timeout))
{
if (strcmp(str, "OK\r\n") == 0)
{
return 0;
}
else if (strcmp(str, "ERROR\r\n") == 0)
{
return -2;
}
continue;
}
else
{
return -1;
}
}
return -3;
}
// ïîñûëêà ñòðîêè, ñ âîçâðàòîì îòâåòà íà íå¸, îòëè÷íîãî îò "\r\n"
// âîçâðàùàåò 0 åñëè îê
int ModemSendCommand(char *str, unsigned long timeout)
{
CPU_INT08U i;
ModemComPortFlush();
ModemWriteStr(str);
i = MODEM_REPEAT_RX;
while (i--)
{
if (ModemReadStr(str, timeout))
{
if (strcmp(str, "\r\n") == 0)
{
continue;
}
else
{
return 0;
}
}
else
{
return -1;
}
}
return -3;
}
// ïðèåì ñèãíàëà î íîâîé ñìñêå, â num çàïèñûâàåò íîìåð ïðèíÿòîãî ñîîáùåíèÿ, åñëè îíî ïðèíÿòî
int ModemRxNewSMS(unsigned long *num)
{
int len;
GetModem();
if (!ModemReadStr(modem_buf, 10)) {FreeModem(); return 0;}
if (!strcmp((char const*)modem_buf, "\r\n"))
{
// ïðèíèìàåì åù¸ îäíó ñòðîêó
if (!ModemReadStr(modem_buf, 100)) {FreeModem(); return 0;}
}
if (strlen((char const*)modem_buf) < 13) {FreeModem(); return 0;}
modem_buf[6] = 0;
if (strcmp((char const*)modem_buf, "+CMTI:")) {FreeModem(); return 0;}
len = strlen((char*)&modem_buf[12]);
if (len == 3) *num = modem_buf[12]-0x30;
else if (len == 4) {*num = (modem_buf[12]-0x30)*10 + (modem_buf[13]-0x30);}
OSTimeDly(200);
FreeModem();
return 1;
}
typedef struct
{
char const *name; // ñòðîêà íàçâàíèÿ ýëåìåíòà
char *dest; // êóäà ñîæðàíèòü çíà÷åíèå
} CfgElem;
static const CfgElem email_cfg_list[EMAIL_CFG_ELEM_COUNT] =
{
{"[receiver]=", email_options.receiver},
{"[ap_dns]=", email_options.ap_dns},
{"[ap_password]=", email_options.ap_password},
{"[ap_ip]=", email_options.ap_ip},
{"[ap_user]=", email_options.ap_user},
{"[ap_apn]=", email_options.ap_apn},
{"[smtp_user]=", email_options.smtp_user},
{"[smtp_password]=", email_options.smtp_password},
{"[smtp_mail]=", email_options.smtp_mail},
{"[smtp_server]=", email_options.smtp_server},
{"[smtp_port]=", email_options.smtp_port}
};
// èíèöèàëèçàöèÿ ïàðàìåòðîâ äëÿ íàñòðîéêè ïî÷òû
int InitModemEmailParams(void)
{
CPU_INT08U i, j;
char *text;
CPU_INT32U status = 0;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
text = additional_buf;
OS_ENTER_CRITICAL();
email_options.valid = 0;
OS_EXIT_CRITICAL();
for (i = 1; i < 24; i++)
{
if (ModemReadSMS(text, i))
{
// íå ïðî÷èòàëîñü
continue;
}
for (j = 0; j < EMAIL_CFG_ELEM_COUNT; j++)
{
int str_len = strlen(email_cfg_list[j].name);
char flag = 0;
while (str_len--)
{
if (email_cfg_list[j].name[str_len] != text[str_len])
{
flag = 1;
break;
}
}
if (!flag)
{
strcpy(email_cfg_list[j].dest, &text[strlen(email_cfg_list[j].name)]);
for (str_len = 0; str_len < 64; str_len++)
{
if (email_cfg_list[j].dest[str_len] == 0) break;
if (email_cfg_list[j].dest[str_len] == '\r') {email_cfg_list[j].dest[str_len] = 0; break;}
if (email_cfg_list[j].dest[str_len] == '\n') {email_cfg_list[j].dest[str_len] = 0; break;}
}
// íàøëè îïöèþ â ñìñêå
status |= 1L << j;
break;
}
}
OSTimeDly(200);
}
i = 1;
for (j = 0; j < EMAIL_CFG_ELEM_COUNT; j++)
{
if ((status & (1 << j)) == 0)
{
i = 0;
break;
}
}
OS_ENTER_CRITICAL();
email_options.valid = i;
OS_EXIT_CRITICAL();
return 0;
}
void ResetModemValid(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
email_options.valid = 0;
modem_connected = 0;
OS_EXIT_CRITICAL();
}
// ïðîâåðêà, ìîæíî ëè èñïîëüçîâàòü ìîäåì (êîððåêòíîñòü íàñòðîåê è ïîäêëþ÷åíèÿ)
CPU_INT08U IsModemValid(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
CPU_INT08U result = 0;
OS_ENTER_CRITICAL();
if (email_options.valid && modem_connected)
{
result = 1;
}
OS_EXIT_CRITICAL();
return result;
}
CPU_INT08U IsModemConn(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
CPU_INT08U result = 0;
OS_ENTER_CRITICAL();
if (modem_connected)
{
result = 1;
}
OS_EXIT_CRITICAL();
return result;
}
CPU_INT08U IsModemConf(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
CPU_INT08U result = 0;
OS_ENTER_CRITICAL();
if (email_options.valid)
{
result = 1;
}
OS_EXIT_CRITICAL();
return result;
}
// ì.á. çàïóñêàòü ïðè ñòàðòå, ÷òîáû ïðîâåðÿòü, íàñòðàèâàåòñÿ ëè ìîæåì ýòèìè íàñòðîéêàìè
int ModemConfigGprs()
{
int repeat = 0;
if (!email_options.valid) return -1;
GetModem();
REP_1:
sprintf(modem_buf, "AT^SICS=0,conType,GPRS0\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
sprintf(modem_buf, "AT^SISC=0\r\n");
ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT);
OSTimeDly(500);
if (repeat++ == 0) goto REP_1;
FreeModem();
return -5;
}
sprintf(modem_buf, "AT^SICS=0,inactTO,\"20\"\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -6;
}
sprintf(modem_buf, "AT^SICS=0,dns1,\"%s\"\r\n", email_options.ap_dns);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -7;
}
sprintf(modem_buf, "AT^SICS=0,passwd,\"%s\"\r\n", email_options.ap_password);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -8;
}
sprintf(modem_buf, "AT^SICS=0,apn,\"%s\"\r\n", email_options.ap_apn);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -9;
}
sprintf(modem_buf, "AT^SICS=0,user,\"%s\"\r\n", email_options.ap_user);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -10;
}
FreeModem();
return 0;
}
int ModemConfigSmtp()
{
int repeat = 0;
if (!email_options.valid) return -1;
GetModem();
REP_2:
// Select service type SMTP.
sprintf(modem_buf, "AT^SISS=0,srvType,\"Smtp\"\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
sprintf(modem_buf, "AT^SISC=0\r\n");
ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT);
OSTimeDly(10000);
if (repeat++ == 0) goto REP_2;
FreeModem();
return -25;
}
// Choose ASCII alphabet.
sprintf(modem_buf, "AT^SISS=0,alphabet,\"1\"\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -26;
}
// Select connection profile 0.
sprintf(modem_buf, "AT^SISS=0,conId,\"0\"\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -27;
}
// Specify SMTP server address.
sprintf(modem_buf, "AT^SISS=0,address,\"%s\"\r\n", email_options.smtp_server);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -28;
}
// Specify sender's user name required for SMTP authentication.
sprintf(modem_buf, "AT^SISS=0,user,\"%s\"\r\n", email_options.smtp_user);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -29;
}
// Specify password used by the sender for SMTP authentication.
sprintf(modem_buf, "AT^SISS=0,passwd,\"%s\"\r\n", email_options.smtp_password);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -30;
}
// Sender name and password can be used for SMTP authentication.
sprintf(modem_buf, "AT^SISS=0,smAuth,\"1\"\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -31;
}
// Port for SMTP connection.
sprintf(modem_buf, "AT^SISS=0,tcpPort,\"%s\"\r\n", email_options.smtp_port);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -32;
}
FreeModem();
return 0;
}
// Îòïðàâêà ïî÷òû: ïîëó÷àòåëü è îòïðàâèòåëü óæå åñòü â íàñòðîêàõ ìîäåìà,
// çàäàåì òåìó è ïåðåäàåì óêàçàòåëü íà callback ôóíêöèþ, ñ ïîìîùüþ êîòîðîé ïîëó÷àåì òåêñò ïèñüìà
int ModemSendEmail(char *subj, TextCallbackFunc text_callback)
{
char *text;
int result = -1;
if (!email_options.valid) return -50;
result = ModemConfigGprs();
if (result)
{
return result;
}
result = ModemConfigSmtp();
if (result)
{
return result;
}
GetModem();
// Sender's email address.
sprintf(modem_buf, "AT^SISS=0,smFrom,\"%s\"\r\n", email_options.smtp_mail);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -51;
}
// Recipient's email address.
sprintf(modem_buf, "AT^SISS=0,smRcpt,\"%s\"\r\n", email_options.receiver);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -52;
}
// Enter text for subject field.
sprintf(modem_buf, "AT^SISS=0,smSubj,\"%s\"\r\n", subj);
if (ModemSendOKCommand(modem_buf, MODEM_RX_TIMEOUT) != 0)
{
FreeModem();
return -53;
}
sprintf(modem_buf, "AT^SISC=0\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT) != 0)
{
FreeModem();
return -54;
}
OSTimeDly(5000);
// Open the service, i.e. start to send the email.
sprintf(modem_buf, "AT^SISO=0\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT) != 0)
{
FreeModem();
return -55;
}
if (!ModemReadStr(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT))
{
FreeModem();
return -56;
}
if (!ModemReadStr(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT))
{
FreeModem();
return -57;
}
if (strcmp(modem_buf, "^SISW: 0, 1\r\n") != 0)
{
return -58;
}
text = additional_buf;
OSTimeDly(1000);
// çàïèñü ñîîáùåíèÿ
while (text_callback(text) == 0)
{
int lenght = strlen(text);
int wr_len, reg, eof;
int wr_ctr = 0;
while (wr_ctr < lenght)
{
sprintf(modem_buf, "AT^SISW=0,%d\r\n", lenght-wr_ctr);
if (ModemSendCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT))
{
result = -59;
goto EMAIL_EXIT_FAIL;
}
sscanf(modem_buf, "^SISW: %d, %d, %d", &reg, &wr_len, &eof);
if ((reg != 0) || (eof != 0) || (wr_len > lenght-wr_ctr) || (wr_len == 0))
{
result = -60;
goto EMAIL_EXIT_FAIL;
}
if (ModemSendOKData(text, wr_len, MODEM_OPEN_SERVICE_TIMEOUT) != 0)
{
result = -61;
goto EMAIL_EXIT_FAIL;
}
if (!ModemReadStr(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT))
{
result = -62;
goto EMAIL_EXIT_FAIL;
}
wr_ctr += wr_len;
OSTimeDly(50);
}
}
// Set the <eodFlag> to mark the end of the email body.
// The <eodFlag> is accepted by the service.
sprintf(modem_buf, "AT^SISW=0,0,1\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT) != 0)
{
result = -63;
goto EMAIL_EXIT_FAIL;
}
// The "^SISW" URC confirms that all data is sent suc-cessfully.
if (!ModemReadStr(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT)) // odoa
{
result = -64;
goto EMAIL_EXIT_FAIL;
}
if (!ModemReadStr(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT)) // ^sisw
{
result = -65;
goto EMAIL_EXIT_FAIL;
}
if (strcmp(modem_buf, "^SISW: 0, 2\r\n") != 0)
{
result = -66;
goto EMAIL_EXIT_FAIL;
}
// Close the service.
sprintf(modem_buf, "AT^SISC=0\r\n");
if (ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT) != 0)
{
result = -67;
goto EMAIL_EXIT_FAIL;
}
FreeModem();
return 0;
EMAIL_EXIT_FAIL:
sprintf(modem_buf, "AT^SISC=0\r\n");
OSTimeDly(10000);
ModemSendOKCommand(modem_buf, MODEM_OPEN_SERVICE_TIMEOUT);
FreeModem();
return result;
}

View File

@ -1,63 +0,0 @@
#ifndef __MODEM_H__
#define __MODEM_H__
#define MODEM_REPEAT_RX 5
#define MODEM_RX_TIMEOUT 5000
#define MODEM_OPEN_SERVICE_TIMEOUT 30000
/*
strings.append("[receiver]=" + config.get('Receiver', 'email'))
strings.append("[ap_dns]=" + config.get('AccessPoint', 'dns', ''))
strings.append("[ap_password]=" + config.get('AccessPoint', 'password', ''))
strings.append("[ap_ip]=" + config.get('AccessPoint', 'ip', ''))
strings.append("[ap_user]=" + config.get('AccessPoint', 'user', ''))
strings.append("[ap_apn]=" + config.get('AccessPoint', 'apn', ''))
strings.append("[smtp_user]=" + config.get('Smtp', 'user', ''))
strings.append("[smtp_password]=" + config.get('Smtp', 'password', ''))
strings.append("[smtp_mail]=" + config.get('Smtp', 'mail', ''))
strings.append("[smtp_server]=" + config.get('Smtp', 'smtp_server', ''))
strings.append("[smtp_port]=" + config.get('Smtp', 'port', '25'))
*/
typedef struct
{
char receiver[64];
char ap_dns[64];
char ap_password[64];
char ap_ip[64];
char ap_user[64];
char ap_apn[64];
char smtp_user[64];
char smtp_password[64];
char smtp_mail[64];
char smtp_server[64];
char smtp_port[64];
CPU_INT08U valid;
} EmailOptions;
static EmailOptions email_options;
#define EMAIL_CFG_ELEM_COUNT 11
typedef int (*TextCallbackFunc)(char *str);
extern int InitModem(void);
extern void ModemWriteStr(char const *str);
extern int ModemSendOKCommand(char *str, unsigned long timeout);
extern int ModemDeleteSMS(unsigned char index);
extern int ModemWriteSMS(char const* text, unsigned char *index);
extern int ModemSendSMS(char const* number, unsigned char index);
extern int ModemReadSMS(char *text, int index);
extern int ModemSendSMSMessage(char const* number, char const* text);
extern int ModemRxNewSMS(unsigned long *num);
extern int ModemSendCommand(char *str, unsigned long timeout);
extern CPU_INT08U IsModemConn(void);
extern CPU_INT08U IsModemConf(void);
extern int InitModemEmailParams(void);
extern int ModemSendEmail(char *subj, TextCallbackFunc text_callback);
extern CPU_INT08U IsModemValid(void);
extern void ResetModemValid(void);
#endif //#ifndef __MODEM_H__

View File

@ -1,228 +0,0 @@
#include <includes.h>
#include "uart2.h"
static unsigned char UART2TXBuffer[UART2_TX_BUFSIZE];
static unsigned short UART2TXhead = 0;
static unsigned short UART2TXtail = 0;
static unsigned short UART2TXcount = 0;
static unsigned char UART2RXBuffer[UART2_RX_BUFSIZE];
static unsigned short UART2RXhead = 0;
static unsigned short UART2RXtail = 0;
static unsigned short UART2RXcount = 0;
void Uart2_Flush(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
UART2TXcount = UART2TXhead = UART2TXtail = 0;
UART2RXcount = UART2RXhead = UART2RXtail = 0;
U2IER_bit.THREIE = 0;
U2FCR = 0x06;
OS_EXIT_CRITICAL();
}
int Uart2_Getc(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int res = -1;
if (UART2RXcount > 0)
{
UART2RXcount--;
res = UART2RXBuffer[UART2RXhead++];
UART2RXhead %= UART2_RX_BUFSIZE;
}
OS_EXIT_CRITICAL();
return res;
}
int Uart2_Gotc(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int res = 0;
if (UART2RXcount > 0) res = 1;
OS_EXIT_CRITICAL();
return res;
}
int Uart2_Ready(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int res = 0;
if (UART2TXcount < UART2_TX_BUFSIZE) res = 1;
OS_EXIT_CRITICAL();
return res;
}
int Uart2_Putc(unsigned char ch)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int res = 0;
if (UART2TXcount < UART2_TX_BUFSIZE)
{
if (UART2TXcount == 0)
{
if (U2LSR_bit.THRE)
{
U2THR = ch;
}
else
{
UART2TXcount++;
UART2TXBuffer[UART2TXtail++] = ch;
UART2TXtail %= UART2_TX_BUFSIZE;
U2IER = 3;
}
}
else
{
UART2TXcount++;
UART2TXBuffer[UART2TXtail++] = ch;
UART2TXtail %= UART2_TX_BUFSIZE;
U2IER = 3;
}
}
else
{
res = -1;
}
OS_EXIT_CRITICAL();
return res;
}
static void Uart2_Isr(void)
{
CPU_INT08U IIRValue;
CPU_INT08U u1lsr;
volatile CPU_INT08U Dummy;
IIRValue = U2IIR;
IIRValue >>= 1; /* skip pending bit in IIR */
IIRValue &= 0x07; /* check bit 1~3, interrupt identification */
if (IIRValue == 2) /* Receive Data Available */
{
/* Receive Data Available */
if (U2LSR_bit.DR)
{
if (UART2RXcount < UART2_RX_BUFSIZE)
{
UART2RXBuffer[UART2RXtail++] = U2RBR;
UART2RXtail %= UART2_RX_BUFSIZE;
UART2RXcount++;
}
else
{
Dummy = U2RBR;
}
}
}
else if (IIRValue == 1) /* THRE, transmit holding register empty */
{
/* THRE interrupt */
if (UART2TXcount > 0)
{
U2THR = UART2TXBuffer[UART2TXhead++];
UART2TXhead %= UART2_TX_BUFSIZE;
UART2TXcount--;
}
else
{
U2IER = 1;
}
}
else
{
Dummy = U2RBR;
u1lsr = U2LSR;
u1lsr = u1lsr;
}
}
void Uart2_Init(CPU_INT32U baud_rate)
{
float div_fp; /* Baud rate divisor floating point precision */
CPU_INT16U div_int; /* Baud rate divisor floating point precision */
CPU_INT08U divlo;
CPU_INT08U divhi;
CPU_INT32U pclk_freq;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
pclk_freq = BSP_CPU_PclkFreq(PCLK_UART2); /* Get peripheral clock frequency */
div_fp = (pclk_freq / 16.0 / baud_rate); /* Compute divisor for desired baud rate */
div_int = (CPU_INT16U)(div_fp + 0.5); /* Round the number up */
divlo = div_int & 0x00FF; /* Split divisor into LOW and HIGH bytes */
divhi = (div_int >> 8) & 0x00FF;
PCONP_bit.PCUART2 = 1; /* Enable the power bit for UART0 */
U2IER = 0;
U2FCR = 0x06; // enable and reset fifo
U2ACR = 0;
//U1FCR = 0x01; // enable and reset fifo
U2LCR = 0x80; /* Enable acces to Divisor latches */
U2DLL = divlo; /* Load divisor */
U2DLM = divhi;
U2FDR = 0x10;
U2LCR = 0;
U2LCR_bit.WLS = 0x03; // 8 bit
U2LCR_bit.SBS = 0; // 1 stop bit
U2IER = 1;
PINSEL0_bit.P0_10 = 0x1;
PINSEL0_bit.P0_11 = 0x1;
PINMODE0_bit.P0_10 = 0;
PINMODE0_bit.P0_11 = 0;
FIO0DIR_bit.P0_10 = 1;
FIO0DIR_bit.P0_11 = 0;
FIO0MASK_bit.P0_10 = 1;
FIO0MASK_bit.P0_11 = 1;
VICINTSELECT &= ~(1 << VIC_UART2);
VICVECTADDR28 = (CPU_INT32U)Uart2_Isr;
VICINTENABLE = (1 << VIC_UART2);
Uart2_Flush();
OS_EXIT_CRITICAL();
}

View File

@ -1,18 +0,0 @@
#ifndef _UART_H_
#define _UART_H_
#define UART2_RX_BUFSIZE 128
#define UART2_TX_BUFSIZE 64
extern void Uart2_Init(CPU_INT32U uart_speed);
extern void Uart2_Flush(void);
extern int Uart2_Gotc(void);
extern int Uart2_Getc(void);
extern int Uart2_Ready(void);
extern int Uart2_Putc(CPU_INT08U ch);
#endif //#ifndef _UART_H_

View File

@ -219,8 +219,8 @@ const TMenuLine line_StatisticsMenu_4 = {
(void*)ClearStatMenu // ïàíåëü äëÿ ïåðåõîäà
};
const TMenuLineArray arr_StatisticsMenuArray[] = {&line_StatisticsMenu_0, &line_StatisticsMenu_2, &line_StatisticsMenu_3, &line_StatisticsMenu_4, NULL};
const TMenuPanel StatisticsMenuPanel[] = {arr_StatisticsMenuArray, NULL, 4, MENU_PANEL_STANDARD};
const TMenuLineArray arr_StatisticsMenuArray[] = {&line_StatisticsMenu_0, &line_StatisticsMenu_2, /*&line_StatisticsMenu_3,*/ &line_StatisticsMenu_4, NULL};
const TMenuPanel StatisticsMenuPanel[] = {arr_StatisticsMenuArray, NULL, 3, MENU_PANEL_STANDARD};
/***********************************
@ -512,8 +512,8 @@ const TMenuLine line_SettingsMenu_7 = {
NULL // ïàíåëü äëÿ ïåðåõîäà
};
*/
const TMenuLineArray arr_SettingsMenuArray[] = {&line_SettingsMenu_0, &line_SettingsMenu_2, &line_SettingsMenu_5, &line_SettingsMenu_3, &line_SettingsMenu_6, &line_SettingsMenu_8, NULL};
const TMenuPanel SettingsMenuPanel[] = {arr_SettingsMenuArray, NULL, 6, MENU_PANEL_STANDARD};
const TMenuLineArray arr_SettingsMenuArray[] = {&line_SettingsMenu_0, &line_SettingsMenu_2, &line_SettingsMenu_5, &line_SettingsMenu_3, &line_SettingsMenu_6, /*&line_SettingsMenu_8,*/ NULL};
const TMenuPanel SettingsMenuPanel[] = {arr_SettingsMenuArray, NULL, 5, MENU_PANEL_STANDARD};
@ -1065,8 +1065,8 @@ const TMenuLine line_CashMenu_5 = {
NULL // ïàíåëü äëÿ ïåðåõîäà
};
const TMenuLineArray arr_ValidatorMenuArray[] = {&line_CashMenu_0, &line_CashMenu_1, &line_CashMenu_2, &line_CashMenu_3, &line_CashMenu_4, &line_CashMenu_5, NULL};
const TMenuPanel ValidatorSetupPanel[] = {arr_ValidatorMenuArray, OnEnterCoinMenu, 6, MENU_PANEL_STANDARD};
const TMenuLineArray arr_ValidatorMenuArray[] = {&line_CashMenu_0, &line_CashMenu_1, /*&line_CashMenu_2,*/ &line_CashMenu_3, &line_CashMenu_4, &line_CashMenu_5, NULL};
const TMenuPanel ValidatorSetupPanel[] = {arr_ValidatorMenuArray, OnEnterCoinMenu, 5, MENU_PANEL_STANDARD};
/***********************************
ÌÅÍÞ ÍÀÑÒÐÎÉÊÀ ÌÎÄÅÌÀ
@ -1653,9 +1653,9 @@ void PrintEventJournalRecord(TEventRecord *record)
if (record->event)
{ // åñòü ñîáûòèå
GetEventStr(str_EventNumber, record->event);
if ((record->event == JOURNAL_EVENT_MONEY_NOTE) || (record->event == JOURNAL_EVENT_MONEY_COIN))
if ((record->event >= JOURNAL_EVENT_MONEY_NOTE_POST1) && (record->event <= JOURNAL_EVENT_MONEY_COIN_POST6))
{
sprintf(str_EventData, "%d ðóá.", record->data);
sprintf(str_EventData, "%d ðóá.ïîñò %d", record->data, record->event%6);
}
else if (record->event == JOURNAL_EVENT_START_SESSION)
{

View File

@ -5,7 +5,6 @@
#include "coin.h"
#include "data.h"
#include "datadesc.h"
#include "modem.h"
#include <stdlib.h>
OS_STK CoinTaskStk[COIN_TASK_STK_SIZE];
@ -17,7 +16,8 @@ CPU_INT32U CashImpCounter[COUNT_POST];
static CPU_INT32U cash_pulse = 5000;
static CPU_INT32U cash_pause = 2000;
static char pend_cash_counter[COUNT_POST] = 0;
static char pend_cash_counter[COUNT_POST];
static CPU_INT32U pend_cash_timestamp[COUNT_POST];
void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause)
@ -51,14 +51,14 @@ void CoinTask(void *p_arg)
GetData(&CashModeDesc, &cash_mode, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableValidatorDesc, &cash_enable, i, DATA_FLAG_DIRECT_INDEX);
}
OSTimeDly(1);
if (enable_coin)
{
if (GetCoinCount(i))
{
PostUserEvent(EVENT_COIN_INSERTED);
PostUserEvent(EVENT_COIN_INSERTED_POST1 + i);
}
}
else
@ -93,7 +93,7 @@ void CoinTask(void *p_arg)
{
if (labs(OSTimeGet() - last_cash_time[i]) > 500)
{
PostUserEvent(EVENT_CASH_INSERTED);
PostUserEvent(EVENT_CASH_INSERTED_POST1 + i);
}
}
else
@ -178,8 +178,14 @@ CPU_INT32U GetResetCashCount(int index)
// èíèöèàëèçàöèÿ ìîíåòîïðèåìíèêà
void InitCoin(void)
{
//CoinImpCounter = 0;
//CashImpCounter = 0;
for(int i = 0; i < COUNT_POST; i++)
{
CoinImpCounter[i] = 0;
CashImpCounter[i] = 0;
pend_cash_counter[i] = 0;
}
InitImpInput();
OSTaskCreate(CoinTask, (void *)0, (OS_STK *)&CoinTaskStk[COIN_TASK_STK_SIZE-1], COIN_TASK_PRIO);
}

View File

@ -1,373 +0,0 @@
#include <includes.h>
#include "validator.h"
#include "CCRSProtocol.h"
#include "uart1.h"
#include "app_serv.h"
#include "journal.h"
#include "data.h"
#include "datadesc.h"
OS_STK ValidatorTaskStk[VALIDATOR_TASK_STK_SIZE];
OS_EVENT *VLock = NULL;
void CC_BusReset(void);
int ValidatorConnect(void);
// ñòàòóñ ïîäêëþ÷åíèÿ êóïþðíèêà
unsigned char VConnStat = VCONN_STATUS_NOCONN;
TBillRecord VBillTable[24];
/// òàáëèöà ñ öåëî÷èñëåííûìè çíà÷åíèÿìè íîìèíàëîâ - äëÿ GUI
CPU_INT32U BillNominals[24];
TBillStatus VBillStatus;
/// ñ÷åò÷èê äåíåã
CPU_INT32U VBillCount = 0;
/// èíäåêñ íîìèíàëà ïîñëåäíåé ïðèÿíòîé êóïþðû
CPU_INT32U VLastBillIndex = V_BILLS_NUMBER;
void ValidatorTask(void *p_arg)
{
char incas = 0;
// 1. åñëè íåò ñâÿçè, ïðîáóåì êîííåêòèòüñÿ êîìàíäîé RESET
// 2. BUS RESET - min 100 ms
// 3. POLL íàäî äåëàòü êàæäûå 100-200 ìñ, ðåêîìåíäóåòñÿ áîëüøå 200
VBillCount = 0;
VConnStat = VCONN_STATUS_NOCONN;
ClrErrorFlag(ERROR_VALIDATOR_CONN);
ClrErrorFlag(ERROR_VALIDATOR_FAILURE);
while(1)
{
TPollResults polldata;
OSTimeDly(CC_POLL_TIME_OUT);
CPU_INT32U enable, cash_mode;
GetData(&EnableValidatorDesc, &enable, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&CashModeDesc, &cash_mode, 0, DATA_FLAG_SYSTEM_INDEX);
// îáðàáîòêà ñòàòóñà ñâÿçè
if (VConnStat == VCONN_STATUS_NOCONN)
{ // íåò ïîäêëþ÷åíèÿ
if ((!enable) || (cash_mode != 0))
{ // íå âêëþ÷åí
VConnStat = VCONN_STATUS_NOCONN;
ClrErrorFlag(ERROR_VALIDATOR_CONN);
ClrErrorFlag(ERROR_VALIDATOR_FAILURE);
continue;
}
// íàäî ïðîèíèöèàëèçèðîâàòüñÿ
if (ValidatorConnect() != 0) {SetErrorFlag(ERROR_VALIDATOR_CONN); continue;}
// óñïåøíî
ClrErrorFlag(ERROR_VALIDATOR_CONN);
ClrErrorFlag(ERROR_VALIDATOR_FAILURE);
VConnStat = VCONN_STATUS_CONN;
}
else
{ // ïîäêëþ÷åíèå åñòü
if (!enable)
{ // íå âêëþ÷åí
VConnStat = VCONN_STATUS_NOCONN;
ClrErrorFlag(ERROR_VALIDATOR_CONN);
ClrErrorFlag(ERROR_VALIDATOR_FAILURE);
continue;
}
}
// çàïðîñ ñòàòóñà óâàëèäàòîðà
if (CC_CmdPoll(ADDR_FL, &polldata))
{// ðàçáèðàåì îòâåò íà poll
if ((incas) && (polldata.Z1 != ST_BOX))
{
incas = 0;
PostUserEvent(EVENT_INCASSATION_FINISH);
}
switch (polldata.Z1){
// States CCNET states and events
case ST_POWER_UP:
case ST_POWER_BILL_ESCROW:
case ST_POWER_BILL_STACKER:
case ST_INITIALIZE:
case ST_IDLING:
case ST_ACCEPTING:
case ST_PACKING:
case ST_RETURNING:
case ST_DISABLED:
case ST_HOLDING:
case ST_BUSY:
ClrValidatorErrors();
break;
case ST_REJECTING:
ClrErrorFlag(ERROR_VALIDATOR_FAILURE);
switch (polldata.Z2){
case RJ_INSERTION: //!< Rejection because of insertion problem
case RJ_REMAINING: //!< Rejection because of other bill remaining in the device
SetErrorFlag(ERROR_VALIDATOR_INSERTION);
break;
case RJ_MAGNETIC: //!< Rejection because of invalid magnetic pattern
SetErrorFlag(ERROR_VALIDATOR_MAGNETIC);
break;
case RJ_CONVEYING: //!< Rejection because of conveying
SetErrorFlag(ERROR_VALIDATOR_CONVEYING);
break;
case RJ_IDENT: //!< Rejection because of identification failure
SetErrorFlag(ERROR_VALIDATOR_IDENT);
break;
case RJ_VRFY: //!< Rejection because of verification failure
SetErrorFlag(ERROR_VALIDATOR_VRFY);
break;
case RJ_OPT: //!< Rejection because of optical pattern mismatch
SetErrorFlag(ERROR_VALIDATOR_OPT);
break;
case RJ_INHIBIT: //!< Rejection because the denomination is inhibited
SetErrorFlag(ERROR_VALIDATOR_INHIBIT);
break;
case RJ_CAP: //!< Rejection because of capacity sensor pattern mismatch
SetErrorFlag(ERROR_VALIDATOR_CAP);
break;
case RJ_LNG: //!< Rejection because of invalid bill length
SetErrorFlag(ERROR_VALIDATOR_LNG);
break;
default:
break;
}
break;
case ST_ST_FULL: //!< DROP CASSETTE IS FULL state
SetErrorFlag(ERROR_STACKER_FULL);
break;
case ST_BOX: //!< DROP CASSETTE REMOVED state
//SetErrorFlag(ERROR_STACKER_REMOVED);
if (incas == 0)
{
PostUserEvent(EVENT_INCASSATION);
ClrValidatorErrors();
incas = 1;
}
break;
case ST_BV_JAMMED: //!< JAM IN VALIDATOR state
SetErrorFlag(ERROR_BV_JAMMED);
break;
case ST_ST_JAMMED: //!< JAM IN STACKER state
SetErrorFlag(ERROR_ST_JAMMED);
break;
case ST_CHEATED: //!< CHEATED event
SetErrorFlag(ERROR_CHEATED);
break;
case ST_FAILURE:
switch (polldata.Z2){
case FLR_STACKER: //!< Stacking mechanism failure
SetErrorFlag(ERROR_FLR_STACKER);
break;
case FLR_TR_SPEED: //!< Invalid speed of transport mechanism
SetErrorFlag(ERROR_TR_SPEED);
break;
case FLR_TRANSPORT: //!< Transport mechanism failure
SetErrorFlag(ERROR_FLR_TRANSPORT);
break;
case FLR_ALIGNING: //!< Aligning mechanism failure
SetErrorFlag(ERROR_FLR_ALIGNIN);
break;
case FLR_INIT_CAS: //!< Initial cassette status failure
SetErrorFlag(ERROR_FLR_INIT_CAS);
break;
case FLR_OPT: //!< Optical channel failure
SetErrorFlag(ERROR_FLR_OPT);
break;
case FLR_MAG: //!< Inductive channel failure
SetErrorFlag(ERROR_FLR_MAG);
break;
case FLR_CAP: //!< Capacity sensor failure
SetErrorFlag(ERROR_FLR_CAP);
break;
}
// íàäî ïåðåïîäêëþ÷èòüñÿ ê ìîäåìó, à òî òàê è áóäåò âèñåòü
SetErrorFlag(ERROR_VALIDATOR_CONN);
VConnStat = VCONN_STATUS_NOCONN;
break;
// Failure codes
case FLR_STACKER:
case FLR_TR_SPEED:
case FLR_TRANSPORT:
case FLR_ALIGNING:
case FLR_INIT_CAS:
case FLR_OPT:
case FLR_MAG:
case FLR_CAP:
SetErrorFlag(ERROR_VALIDATOR_FAILURE);
break;
// Credit events
case ST_PACKED:
// áàíêíîòà óïàêîâàíà
// çàïðåòèì ïðèåì
if (!CC_CmdBillType(0x000000, 0x000000, ADDR_FL)){SetErrorFlag(ERROR_VALIDATOR_CONN);}
// çàïîñòèì ñîáûòèå ïîëüçîâàòåëüñêîìó ñåðâåðó
if (polldata.Z2 < V_BILLS_NUMBER)
{
VBillCount += VBillTable[polldata.Z2].Denomination;
// ñîõðàíÿåì èíäåêñ êóïþðû
VLastBillIndex = polldata.Z2;
}
else
{
VBillCount = 0;
// íåïðàâèëüíûé èíäåêñ
VLastBillIndex = V_BILLS_NUMBER;
}
PostUserEvent(EVENT_BILL_STACKED);
ClrValidatorErrors();
break;
case ESCROW:
if (polldata.Z2 < V_BILLS_NUMBER)
{
//VBillCount += VBillTable[polldata.Z2].Denomination;
// ñîõðàíÿåì èíäåêñ êóïþðû
//VLastBillIndex = polldata.Z2;
}
else
{
VBillCount = 0;
// íåïðàâèëüíûé èíäåêñ
VLastBillIndex = V_BILLS_NUMBER;
}
PostUserEvent(EVENT_BILL_ESCROW);
ClrValidatorErrors();
break;
case RETURNED:
ClrValidatorErrors();
break;
default:
ClrValidatorErrors();
break;
}// switch (polldata.Z1)
ClrErrorFlag(ERROR_VALIDATOR_CONN);
VConnStat = VCONN_STATUS_CONN;
}
else
{ // îøèáêà
SetErrorFlag(ERROR_VALIDATOR_CONN);
VConnStat = VCONN_STATUS_NOCONN;
}
}
}
int ValidatorConnect(void)
{
int i;
OSTimeDly(200);
for (i = 0; i < 24; i++)
{
BillNominals[i] = 0;
}
CC_BusReset();
// ñáðîñèì âàëèäàòîð
if (!CC_CmdReset(ADDR_FL)) return -1;
// ïðî÷èòàåì òàáëèöó íîìèíàëîâ âàëþò
if (!CC_CmdGetBillTable(ADDR_FL, VBillTable)) return -2;
for (i = 0; i < 24; i++)
{
BillNominals[i] = (CPU_INT32U)VBillTable[i].Denomination;
}
// ðàçðåøèì ïðèåì
if (!CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL)) return -3;
VConnStat = VCONN_STATUS_CONN;
return 0;
}
int IsValidatorConnected(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
int retval;
if (VConnStat == VCONN_STATUS_CONN) retval=1;
else retval=0;
OS_EXIT_CRITICAL();
return retval;
}
// çàïóñê çàëà÷è âàëèäàòîðà
void StartUpValidator(void)
{
Uart1_Init(CC_VALIDATOR_SPEED);
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
// BUS RESET init
PINSEL4_bit.P2_4 = 0;
PINMODE4_bit.P2_4 = 0;
FIO2DIR_bit.P2_4 = 1;
FIO2MASK_bit.P2_4 = 0;
FIO2CLR_bit.P2_4 = 1;
OS_EXIT_CRITICAL();
if (!VLock)
{
VLock = OSSemCreate(1);
OSTaskCreate(ValidatorTask, (void *)0, (OS_STK *)&ValidatorTaskStk[VALIDATOR_TASK_STK_SIZE-1], VALIDATOR_TASK_PRIO);
}
}
void CC_BusReset(void)
{
VPend();
FIO2CLR_bit.P2_4 = 1;
OSTimeDly(CC_BUS_RESET_TIME_OUT);
FIO2SET_bit.P2_4 = 1;
VPost();
}
// çàíÿòü âàëèäàòîð
void VPend(void)
{
CPU_INT08U err;
do{
OSSemPend(VLock, 1, &err);
if (!err) break;
OSTimeDly(1);
}while (err);
}
// îñâîáîäèòü âàëèäàòîð
void VPost(void)
{
OSSemPost(VLock);
}
// ïðî÷èòàòü ñ÷åò÷èê äåíåã îò êóïþðíèêà è ñáðîñèòü
CPU_INT32U GetResetBillCount(CPU_INT32U *bill_index)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
CPU_INT32U count = VBillCount;
VBillCount = 0;
*bill_index = VLastBillIndex;
OS_EXIT_CRITICAL();
return count;
}

View File

@ -1,20 +0,0 @@
#ifndef _VALIDATOR_H_
#define _VALIDATOR_H_
#define CC_VALIDATOR_SPEED 9600
#define CC_POLL_TIME_OUT 150
#define CC_BUS_RESET_TIME_OUT 100
#define VCONN_STATUS_CONN 0
#define VCONN_STATUS_NOCONN 1
// ìàêñèìàëüíîå ÷èñëî ïîääåðæèâàåìûõ áàíêíîò
#define V_BILLS_NUMBER 24
extern void StartUpValidator(void);
extern int IsValidatorConnected(void);
extern void VPend(void);
extern void VPost(void);
extern CPU_INT32U GetResetBillCount(CPU_INT32U *bill_index);
#endif //#define _VALIDATOR_H_

View File

@ -14,7 +14,7 @@ Count=0
Enabled=0
ShowSource=1
[DebugChecksum]
Checksum=-1481857352
Checksum=-390368809
[Exceptions]
StopOnUncaught=_ 0
StopOnThrow=_ 0

View File

@ -42,7 +42,7 @@
<Factory>Workspace</Factory>
<Session>
<NodeDict><ExpandedNode>sk-mlpc2368</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/data</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/drivers</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/drivers/keyboard</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/libs</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/menu</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/services</ExpandedNode></NodeDict></Session>
<NodeDict><ExpandedNode>sk-mlpc2368</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/app</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/data</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/drivers</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/libs</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/menu</ExpandedNode><ExpandedNode>sk-mlpc2368/PROJECT/services</ExpandedNode></NodeDict></Session>
</Tab>
</Tabs>
@ -52,14 +52,14 @@
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\services\fr.c</Filename><XPos>0</XPos><YPos>66</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\services\coin.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>277</SelStart><SelEnd>287</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\datadesc.c</Filename><XPos>0</XPos><YPos>665</YPos><SelStart>31056</SelStart><SelEnd>31056</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\data.h</Filename><XPos>0</XPos><YPos>73</YPos><SelStart>1887</SelStart><SelEnd>1887</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\app_serv.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>107</SelStart><SelEnd>107</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\8\positive_6_24\OS\app\app.c</Filename><XPos>0</XPos><YPos>29</YPos><SelStart>1131</SelStart><SelEnd>1131</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\app_serv.c</Filename><XPos>0</XPos><YPos>88</YPos><SelStart>2420</SelStart><SelEnd>2420</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\menu\menudesc.c</Filename><XPos>0</XPos><YPos>1002</YPos><SelStart>40365</SelStart><SelEnd>40365</SelEnd></Tab><ActiveTab>7</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\app\app.c</Filename><XPos>0</XPos><YPos>29</YPos><SelStart>1131</SelStart><SelEnd>1131</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\uc\cpu\cpu.h</Filename><XPos>0</XPos><YPos>87</YPos><SelStart>4701</SelStart><SelEnd>4701</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\menu\menu.h</Filename><XPos>0</XPos><YPos>48</YPos><SelStart>1424</SelStart><SelEnd>1424</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\datadesc.h</Filename><XPos>0</XPos><YPos>210</YPos><SelStart>7918</SelStart><SelEnd>7918</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\fram_map.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>212</SelStart><SelEnd>212</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\control.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>49</SelStart><SelEnd>49</SelEnd></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\menu\menu.h</Filename><XPos>0</XPos><YPos>48</YPos><SelStart>1424</SelStart><SelEnd>1424</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\fram_map.h</Filename><XPos>0</XPos><YPos>36</YPos><SelStart>923</SelStart><SelEnd>923</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\control.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>49</SelStart><SelEnd>49</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\journal.h</Filename><XPos>0</XPos><YPos>54</YPos><SelStart>3357</SelStart><SelEnd>3357</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\journal.c</Filename><XPos>0</XPos><YPos>378</YPos><SelStart>10205</SelStart><SelEnd>10205</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\services\coin.c</Filename><XPos>0</XPos><YPos>29</YPos><SelStart>839</SelStart><SelEnd>849</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\datadesc.c</Filename><XPos>0</XPos><YPos>781</YPos><SelStart>34927</SelStart><SelEnd>34927</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\drivers\keyboard\keyboard.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>470</SelStart><SelEnd>470</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\menu\menu.c</Filename><XPos>0</XPos><YPos>206</YPos><SelStart>6049</SelStart><SelEnd>6049</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\app\app.c</Filename><XPos>0</XPos><YPos>29</YPos><SelStart>1131</SelStart><SelEnd>1131</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\data.h</Filename><XPos>0</XPos><YPos>92</YPos><SelStart>2345</SelStart><SelEnd>2345</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\app\app_cfg.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>58</SelStart><SelEnd>58</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\data.c</Filename><XPos>0</XPos><YPos>328</YPos><SelStart>9146</SelStart><SelEnd>9146</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\data\datadesc.h</Filename><XPos>0</XPos><YPos>196</YPos><SelStart>7215</SelStart><SelEnd>7215</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\menu\menudesc.c</Filename><XPos>0</XPos><YPos>993</YPos><SelStart>39828</SelStart><SelEnd>39828</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\8\positive_6_24\OS\app\app.c</Filename><XPos>0</XPos><YPos>26</YPos><SelStart>1431</SelStart><SelEnd>1431</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\app\app_serv.c</Filename><XPos>0</XPos><YPos>292</YPos><SelStart>9943</SelStart><SelEnd>9943</SelEnd></Tab><ActiveTab>16</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\services\fr.c</Filename><XPos>0</XPos><YPos>259</YPos><SelStart>8192</SelStart><SelEnd>8192</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\PROJECT\services\console.c</Filename><XPos>0</XPos><YPos>109</YPos><SelStart>3332</SelStart><SelEnd>3332</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\uc\cpu\cpu.h</Filename><XPos>0</XPos><YPos>85</YPos><SelStart>4578</SelStart><SelEnd>4589</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\OS\uc\lib\lib_def.h</Filename><XPos>0</XPos><YPos>111</YPos><SelStart>5973</SelStart><SelEnd>5981</SelEnd></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions>
<Top><Row0><Sizes><Toolbar-04462d18><key>iaridepm.enu1</key></Toolbar-04462d18></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>719</Bottom><Right>266</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>210305</sizeHorzCY><sizeVertCX>209375</sizeVertCX><sizeVertCY>758149</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>187</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>189</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>198738</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>210305</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
<Top><Row0><Sizes><Toolbar-04462d18><key>iaridepm.enu1</key></Toolbar-04462d18></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>566</Bottom><Right>266</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>210305</sizeHorzCY><sizeVertCX>209375</sizeVertCX><sizeVertCY>597266</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>340</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>342</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>359621</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>210305</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop>
</Workspace>

File diff suppressed because it is too large Load Diff

View File

@ -1006,7 +1006,7 @@
</option>
<option>
<name>OGLastSavedByProductVersion</name>
<state>6.21.4.52945</state>
<state>6.21.1.52845</state>
</option>
<option>
<name>GeneralEnableMisra</name>
@ -3149,12 +3149,6 @@
<file>
<name>$PROJ_DIR$\PROJECT\app\journal.h</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\app\modem_task.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\app\modem_task.h</name>
</file>
</group>
<group>
<name>data</name>
@ -3182,24 +3176,6 @@
</group>
<group>
<name>drivers</name>
<group>
<name>ccnet</name>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\ccnet\CCRSProtocol.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\ccnet\CCRSProtocol.h</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\ccnet\uart1.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\ccnet\uart1.h</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\ccnet\VMCConst.h</name>
</file>
</group>
<group>
<name>fiscal</name>
<file>
@ -3248,21 +3224,6 @@
<name>$PROJ_DIR$\PROJECT\drivers\lcd\lcd.h</name>
</file>
</group>
<group>
<name>modem</name>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\modem\modem.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\modem\modem.h</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\modem\uart2.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\modem\uart2.h</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\PROJECT\drivers\uart.c</name>
<excluded>
@ -3342,12 +3303,6 @@
<file>
<name>$PROJ_DIR$\PROJECT\services\time.h</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\services\validator.c</name>
</file>
<file>
<name>$PROJ_DIR$\PROJECT\services\validator.h</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\PROJECT\version.h</name>