mirror of
https://github.com/dimoniche/Moyka.git
synced 2026-01-29 17:33:33 +03:00
второй день разработки
This commit is contained in:
parent
c43a2b6898
commit
437ebc4bad
@ -54,8 +54,6 @@ void main (void)
|
|||||||
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
|
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*********************************************************************************************************
|
*********************************************************************************************************
|
||||||
* AppTaskStart()
|
* AppTaskStart()
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
#include <includes.h>
|
#include <includes.h>
|
||||||
#include "app_serv.h"
|
#include "app_serv.h"
|
||||||
#include "modem.h"
|
|
||||||
#include "validator.h"
|
|
||||||
#include "coin.h"
|
#include "coin.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "fiscal.h"
|
#include "fiscal.h"
|
||||||
@ -11,13 +9,10 @@
|
|||||||
#include "menudesc.h"
|
#include "menudesc.h"
|
||||||
#include "datadesc.h"
|
#include "datadesc.h"
|
||||||
#include "control.h"
|
#include "control.h"
|
||||||
#include "validator.h"
|
|
||||||
#include "CCRSProtocol.h"
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "journal.h"
|
#include "journal.h"
|
||||||
#include "fr.h"
|
#include "fr.h"
|
||||||
#include "CRC16.h"
|
#include "CRC16.h"
|
||||||
#include "modem_task.h"
|
|
||||||
#include "host_app.h"
|
#include "host_app.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
@ -26,7 +21,7 @@
|
|||||||
//#define _DEBUG_MONEY
|
//#define _DEBUG_MONEY
|
||||||
|
|
||||||
CPU_INT32U SystemTime;
|
CPU_INT32U SystemTime;
|
||||||
CPU_INT32U money_timestamp;
|
CPU_INT32U money_timestamp[COUNT_POST];
|
||||||
CPU_INT08U EnabledChannelsNum;
|
CPU_INT08U EnabledChannelsNum;
|
||||||
CPU_INT08U RecentChannel;
|
CPU_INT08U RecentChannel;
|
||||||
CPU_INT08U UserMenuState;
|
CPU_INT08U UserMenuState;
|
||||||
@ -42,7 +37,6 @@ CPU_INT08U ChannelsState[CHANNELS_NUM];
|
|||||||
CPU_INT32U ChannelsCounters[CHANNELS_NUM];
|
CPU_INT32U ChannelsCounters[CHANNELS_NUM];
|
||||||
CPU_INT32U ChannelsPayedTime[CHANNELS_NUM];
|
CPU_INT32U ChannelsPayedTime[CHANNELS_NUM];
|
||||||
|
|
||||||
extern CPU_INT32U BillNominals[24];
|
|
||||||
CPU_INT32U incas_bill_nom_counter[24];
|
CPU_INT32U incas_bill_nom_counter[24];
|
||||||
CPU_INT32U incas_common_bill_counter;
|
CPU_INT32U incas_common_bill_counter;
|
||||||
|
|
||||||
@ -53,21 +47,21 @@ OS_EVENT *UserQuery = NULL;
|
|||||||
void *UserTbl[USER_QUERY_LEN];
|
void *UserTbl[USER_QUERY_LEN];
|
||||||
|
|
||||||
int GetUserEvent(int* event);
|
int GetUserEvent(int* event);
|
||||||
void UserPrintMoneyMenu(void);
|
void UserPrintMoneyMenu(int post);
|
||||||
void WorkServer(void);
|
void WorkServer(void);
|
||||||
void UserPrintThanksMenu(void);
|
void UserPrintThanksMenu(int post);
|
||||||
void UserPrintFirstMenu(void);
|
void UserPrintFirstMenu(void);
|
||||||
void UserPrintErrorMenu(void);
|
void UserPrintErrorMenu(void);
|
||||||
CPU_INT32U GetChannelsTimeForFree(CPU_INT08U ch);
|
CPU_INT32U GetChannelsTimeForFree(CPU_INT08U ch);
|
||||||
void LoadAcceptedMoney(void);
|
void LoadAcceptedMoney(void);
|
||||||
void SetAcceptedMoney(CPU_INT32U money);
|
void SetAcceptedMoney(CPU_INT32U money,int post);
|
||||||
void ClearAcceptedMoney(void);
|
void ClearAcceptedMoney(int post);
|
||||||
CPU_INT32U GetAcceptedMoney(void);
|
CPU_INT32U GetAcceptedMoney(int post);
|
||||||
void InitPass(void);
|
void InitPass(void);
|
||||||
int CheckChannelEnabled(CPU_INT08U channel);
|
int CheckChannelEnabled(CPU_INT08U channel);
|
||||||
int ChannelBusy(CPU_INT08U ch);
|
int ChannelBusy(CPU_INT08U ch);
|
||||||
void UserPrintIpDeviceErrMenu(CPU_INT08U post);
|
void UserPrintIpDeviceErrMenu(CPU_INT08U post);
|
||||||
void UserPrintPrintBillMenu(void);
|
void UserPrintPrintBillMenu(int post);
|
||||||
|
|
||||||
#ifdef BOARD_CENTRAL_CFG
|
#ifdef BOARD_CENTRAL_CFG
|
||||||
static char incassation;
|
static char incassation;
|
||||||
@ -94,29 +88,6 @@ void AddOutPulses(int count, int len_ms)
|
|||||||
|
|
||||||
#endif
|
#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 print_mode;
|
||||||
CPU_INT32U accmoney;
|
CPU_INT32U accmoney;
|
||||||
int event;
|
int event;
|
||||||
#ifdef BOARD_CENTRAL_CFG
|
CPU_BOOLEAN dontRedraw = DEF_FALSE;
|
||||||
CPU_INT32U temp;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BOARD_CENTRAL_CFG
|
#ifdef BOARD_CENTRAL_CFG
|
||||||
|
|
||||||
static CPU_INT08U fr_conn_ctr = 0;
|
static CPU_INT08U fr_conn_ctr = 0;
|
||||||
|
|
||||||
{
|
// {
|
||||||
CPU_INT32U m=0;
|
// CPU_INT32U m=0;
|
||||||
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
|
// GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_DIRECT_INDEX);
|
||||||
if (m)
|
// if (m)
|
||||||
{
|
// {
|
||||||
EnabledChannelsNum = 0;
|
// EnabledChannelsNum = 0;
|
||||||
for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
|
// for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
|
||||||
{
|
// {
|
||||||
CPU_INT32U en = 0;
|
// CPU_INT32U en = 0;
|
||||||
GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
|
// GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
|
||||||
if (en) {EnabledChannelsNum++;}
|
// if (en) {EnabledChannelsNum++;}
|
||||||
}
|
// }
|
||||||
UserMenuState = USER_STATE_ACCEPT_MONEY;
|
// UserMenuState = USER_STATE_ACCEPT_MONEY;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
incassation = 0;
|
incassation = 0;
|
||||||
was_critical_error = 0;
|
was_critical_error = 0;
|
||||||
|
|
||||||
GetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
|
|
||||||
if (temp == INCAS_SEND_FLAG)
|
|
||||||
{
|
|
||||||
PostModemTask(MODEM_TASK_SEND_INCAS);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
@ -205,7 +168,6 @@ void UserAppTask(void *p_arg)
|
|||||||
// âûêëþ÷èì ïðèåì äåíåã
|
// âûêëþ÷èì ïðèåì äåíåã
|
||||||
if (was_critical_error == 0)
|
if (was_critical_error == 0)
|
||||||
{
|
{
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
|
|
||||||
CoinDisable();
|
CoinDisable();
|
||||||
was_critical_error = 1;
|
was_critical_error = 1;
|
||||||
}
|
}
|
||||||
@ -215,197 +177,153 @@ void UserAppTask(void *p_arg)
|
|||||||
// âêëþ÷èì çàíîâî ïðèåì äåíåã, åñëè áûëà îøèáêà
|
// âêëþ÷èì çàíîâî ïðèåì äåíåã, åñëè áûëà îøèáêà
|
||||||
if (was_critical_error)
|
if (was_critical_error)
|
||||||
{
|
{
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
|
|
||||||
was_critical_error = 0;
|
was_critical_error = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
accmoney = GetAcceptedMoney();
|
dontRedraw = DEF_FALSE;
|
||||||
if (accmoney > 0)
|
|
||||||
|
for(int post = 0; post < COUNT_POST; post++)
|
||||||
{
|
{
|
||||||
LED_OK_ON();
|
accmoney = GetAcceptedMoney(post);
|
||||||
CheckFiscalStatus();
|
|
||||||
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
|
if (accmoney > 0)
|
||||||
if (print_mode == 0)
|
{
|
||||||
{
|
UserPrintMoneyMenu(post);
|
||||||
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÒÀÉÌÀÓÒÓ
|
RefreshMenu();
|
||||||
GetData(&PrintTimeoutDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
|
|
||||||
if (labs(OSTimeGet() - money_timestamp) > 1000UL * print_timeout)
|
dontRedraw = DEF_TRUE;
|
||||||
{
|
|
||||||
UserPrintPrintBillMenu();
|
LED_OK_ON();
|
||||||
RefreshMenu();
|
CheckFiscalStatus();
|
||||||
|
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
|
||||||
// íàïå÷àòàåì ÷åê
|
if (print_mode == 0)
|
||||||
if (IsFiscalConnected())
|
{
|
||||||
{
|
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÒÀÉÌÀÓÒÓ
|
||||||
if (PrintFiscalBill(accmoney) == 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);
|
||||||
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
|
SetAcceptedMoney(0, post);
|
||||||
SetAcceptedMoney(0);
|
OSTimeDly(1000);
|
||||||
OSTimeDly(1000);
|
|
||||||
|
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
|
||||||
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
|
if (IsFiscalConnected())
|
||||||
if (IsFiscalConnected())
|
{
|
||||||
{
|
UserPrintThanksMenu(post);
|
||||||
UserPrintThanksMenu();
|
RefreshMenu();
|
||||||
RefreshMenu();
|
}
|
||||||
}
|
|
||||||
|
OSTimeDly(1000);
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
|
LED_OK_OFF();
|
||||||
|
}
|
||||||
OSTimeDly(1000);
|
}
|
||||||
LED_OK_OFF();
|
else if (print_mode == 1)
|
||||||
}
|
{
|
||||||
}
|
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÊÍÎÏÊÅ, æäåì òàéìàóò îòìåíû
|
||||||
else if (print_mode == 1)
|
GetData(&PrintTimeoutAfterDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
|
||||||
{
|
if (labs(OSTimeGet() - money_timestamp[post]) > 1000UL * print_timeout)
|
||||||
// åñëè íàñòðîåíà ïå÷àòü ÏÎ ÊÍÎÏÊÅ, æäåì òàéìàóò îòìåíû
|
{
|
||||||
GetData(&PrintTimeoutAfterDesc, &print_timeout, 0, DATA_FLAG_SYSTEM_INDEX);
|
SetAcceptedMoney(0, post);
|
||||||
if (labs(OSTimeGet() - money_timestamp) > 1000UL * print_timeout)
|
UserPrintThanksMenu(post);
|
||||||
{
|
RefreshMenu();
|
||||||
SetAcceptedMoney(0);
|
OSTimeDly(1000);
|
||||||
UserPrintThanksMenu();
|
LED_OK_OFF();
|
||||||
RefreshMenu();
|
}
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
|
}
|
||||||
OSTimeDly(1000);
|
}
|
||||||
LED_OK_OFF();
|
else
|
||||||
}
|
{
|
||||||
}
|
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:
|
case EVENT_MODE_CHANGE:
|
||||||
ReInitMenu();
|
ReInitMenu();
|
||||||
SaveEventRecord(0, JOURNAL_EVENT_CHANGE_MODE, GetMode());
|
SaveEventRecord(0, JOURNAL_EVENT_CHANGE_MODE, GetMode());
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
|
|
||||||
break;
|
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:
|
case EVENT_COIN_INSERTED_POST1:
|
||||||
#if 0
|
case EVENT_COIN_INSERTED_POST2:
|
||||||
if ((GetMode() != MODE_WORK) || (incassation)) break;
|
case EVENT_COIN_INSERTED_POST3:
|
||||||
if (TstCriticalErrors())
|
case EVENT_COIN_INSERTED_POST4:
|
||||||
|
case EVENT_COIN_INSERTED_POST5:
|
||||||
|
case EVENT_COIN_INSERTED_POST6:
|
||||||
{
|
{
|
||||||
UserPrintErrorMenu();
|
CPU_INT32U cpp = 1;
|
||||||
RefreshMenu();
|
CPU_INT32U money, accmoney;
|
||||||
break;
|
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;
|
break;
|
||||||
UserPrintFirstMenu();
|
case EVENT_CASH_INSERTED_POST1:
|
||||||
RefreshMenu();
|
case EVENT_CASH_INSERTED_POST2:
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
|
case EVENT_CASH_INSERTED_POST3:
|
||||||
#endif
|
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;
|
break;
|
||||||
|
|
||||||
case EVENT_KEY_START:
|
case EVENT_KEY_START:
|
||||||
@ -468,46 +386,51 @@ void UserAppTask(void *p_arg)
|
|||||||
// íàõîäèìñÿ â ðàáî÷åì ðåæèìå
|
// íàõîäèìñÿ â ðàáî÷åì ðåæèìå
|
||||||
// --------------------------
|
// --------------------------
|
||||||
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
|
GetData(&PrintModeDesc, &print_mode, 0, DATA_FLAG_SYSTEM_INDEX);
|
||||||
if (print_mode == 1)
|
for(int post = 0; post < COUNT_POST; post++)
|
||||||
{
|
{
|
||||||
// ïîëüçîâàòåëü âíåñ äåíüãè è íàæàë ÑÒÀÐÒ + ðåæèì ïå÷àòè ÏÎ ÊÍÎÏÊÅ
|
if (print_mode == 1)
|
||||||
CPU_INT32U accmoney = GetAcceptedMoney();
|
{
|
||||||
|
// ïîëüçîâàòåëü âíåñ äåíüãè è íàæàë ÑÒÀÐÒ + ðåæèì ïå÷àòè ÏÎ ÊÍÎÏÊÅ
|
||||||
if (accmoney > 0)
|
CPU_INT32U accmoney = GetAcceptedMoney(post);
|
||||||
{
|
|
||||||
UserPrintPrintBillMenu();
|
if (accmoney > 0)
|
||||||
RefreshMenu();
|
{
|
||||||
|
UserPrintPrintBillMenu(post);
|
||||||
// íàïå÷àòàåì ÷åê
|
RefreshMenu();
|
||||||
if (IsFiscalConnected())
|
|
||||||
{
|
// íàïå÷àòàåì ÷åê
|
||||||
if (PrintFiscalBill(accmoney) == 0)
|
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);
|
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney);
|
||||||
SetAcceptedMoney(0);
|
SetAcceptedMoney(0, post);
|
||||||
OSTimeDly(1000);
|
OSTimeDly(1000);
|
||||||
|
|
||||||
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
|
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
|
||||||
if (IsFiscalConnected())
|
if (IsFiscalConnected())
|
||||||
{
|
{
|
||||||
UserPrintThanksMenu();
|
UserPrintThanksMenu(post);
|
||||||
RefreshMenu();
|
RefreshMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
|
OSTimeDly(1000);
|
||||||
|
LED_OK_OFF();
|
||||||
OSTimeDly(1000);
|
}
|
||||||
LED_OK_OFF();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#else
|
case EVENT_KEY_F1:
|
||||||
|
PostUserEvent(EVENT_CASH_INSERTED_POST1);
|
||||||
|
break;
|
||||||
|
case EVENT_KEY_F2:
|
||||||
|
PostUserEvent(EVENT_CASH_INSERTED_POST2);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -542,19 +465,12 @@ void UserStartupFunc(void)
|
|||||||
|
|
||||||
// ïðîâåðèì ïàðîëü
|
// ïðîâåðèì ïàðîëü
|
||||||
InitPass();
|
InitPass();
|
||||||
|
|
||||||
//íèöèàëèçàöèÿ êàíàëîâ
|
|
||||||
InitChannels();
|
|
||||||
|
|
||||||
// èíèöèàëèçàöèÿ ìåíþ
|
// èíèöèàëèçàöèÿ ìåíþ
|
||||||
InitMenu();
|
InitMenu();
|
||||||
|
|
||||||
OSTimeDly(1000);
|
OSTimeDly(1000);
|
||||||
|
|
||||||
// çàïóñòèì âàëèäàòîð
|
|
||||||
StartUpValidator();
|
|
||||||
|
|
||||||
OSTimeDly(10000);
|
|
||||||
InitFiscal();
|
InitFiscal();
|
||||||
|
|
||||||
// ïðîèíèöèàëèçèðóåì ÷àñû
|
// ïðîèíèöèàëèçèðóåì ÷àñû
|
||||||
@ -563,22 +479,6 @@ void UserStartupFunc(void)
|
|||||||
// ñäåëàåì çàïèñü î âêëþ÷åíèè
|
// ñäåëàåì çàïèñü î âêëþ÷åíèè
|
||||||
SaveEventRecord(0, JOURNAL_EVENT_DEVICE_ON, GetTimeSec());
|
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();
|
InitCoin();
|
||||||
|
|
||||||
@ -640,7 +540,7 @@ void InitUserMenu(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserPrintMoneyMenu(void)
|
void UserPrintMoneyMenu(int post)
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
CPU_INT32U accmoney;
|
CPU_INT32U accmoney;
|
||||||
@ -649,10 +549,15 @@ void UserPrintMoneyMenu(void)
|
|||||||
PrintUserMenuStr(buf, 0);
|
PrintUserMenuStr(buf, 0);
|
||||||
sprintf(buf, " Âíåñèòå äåíüãè");
|
sprintf(buf, " Âíåñèòå äåíüãè");
|
||||||
PrintUserMenuStr(buf, 1);
|
PrintUserMenuStr(buf, 1);
|
||||||
accmoney = GetAcceptedMoney();
|
accmoney = GetAcceptedMoney(post);
|
||||||
sprintf(buf, "Ïðèíÿòî %d ðóá.", accmoney);
|
sprintf(buf, "Ïðèíÿòî %d ðóá.", accmoney);
|
||||||
PrintUserMenuStr(buf, 2);
|
PrintUserMenuStr(buf, 2);
|
||||||
sprintf(buf, " ");
|
|
||||||
|
if(post <= COUNT_POST)
|
||||||
|
sprintf(buf, " Ïîñò %d", post + 1);
|
||||||
|
else
|
||||||
|
sprintf(buf, " ");
|
||||||
|
|
||||||
PrintUserMenuStr(buf, 3);
|
PrintUserMenuStr(buf, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,21 +566,7 @@ void UserPrintErrorMenu(void)
|
|||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
if (TstErrorFlag(ERROR_VALIDATOR_CONN) || TstCriticalValidatorErrors())
|
if (TstErrorFlag(ERROR_FR_CONN))
|
||||||
{
|
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
sprintf(buf, "ÎØÈÁÊÀ");
|
sprintf(buf, "ÎØÈÁÊÀ");
|
||||||
PrintUserMenuStr(buf, 0);
|
PrintUserMenuStr(buf, 0);
|
||||||
@ -698,19 +589,6 @@ void UserPrintErrorMenu(void)
|
|||||||
GetDataItem(&JournalErrorNumberDesc1, (CPU_INT08U*)buf, errcode);
|
GetDataItem(&JournalErrorNumberDesc1, (CPU_INT08U*)buf, errcode);
|
||||||
PrintUserMenuStr(buf, 3);
|
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)
|
int CheckChannelEnabled(CPU_INT08U channel)
|
||||||
@ -730,7 +608,7 @@ void WorkServer(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserPrintPrintBillMenu(void)
|
void UserPrintPrintBillMenu(int post)
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
sprintf(buf, " ");
|
sprintf(buf, " ");
|
||||||
@ -739,11 +617,11 @@ void UserPrintPrintBillMenu(void)
|
|||||||
PrintUserMenuStr(buf, 1);
|
PrintUserMenuStr(buf, 1);
|
||||||
sprintf(buf, " ÷åêà");
|
sprintf(buf, " ÷åêà");
|
||||||
PrintUserMenuStr(buf, 2);
|
PrintUserMenuStr(buf, 2);
|
||||||
sprintf(buf, " ");
|
sprintf(buf, " Ïîñò %d", post + 1);
|
||||||
PrintUserMenuStr(buf, 3);
|
PrintUserMenuStr(buf, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserPrintThanksMenu(void)
|
void UserPrintThanksMenu(int post)
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
sprintf(buf, " ");
|
sprintf(buf, " ");
|
||||||
@ -752,7 +630,7 @@ void UserPrintThanksMenu(void)
|
|||||||
PrintUserMenuStr(buf, 1);
|
PrintUserMenuStr(buf, 1);
|
||||||
sprintf(buf, " ");
|
sprintf(buf, " ");
|
||||||
PrintUserMenuStr(buf, 2);
|
PrintUserMenuStr(buf, 2);
|
||||||
sprintf(buf, " ");
|
sprintf(buf, " Ïîñò %d", post + 1);
|
||||||
PrintUserMenuStr(buf, 3);
|
PrintUserMenuStr(buf, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -781,48 +659,50 @@ void LoadAcceptedMoney(void)
|
|||||||
{
|
{
|
||||||
CPU_INT32U m,crc,crct;
|
CPU_INT32U m,crc,crct;
|
||||||
|
|
||||||
// ñ÷èòàåì cîõðàíåííûå äåíüãè èç FRAM
|
for(int i = 0; i < COUNT_POST; i++)
|
||||||
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
|
{
|
||||||
// ñ÷èòàåì crc16 ýòèõ äåíåã èç FRAM
|
// ñ÷èòàåì cîõðàíåííûå äåíüãè èç FRAM
|
||||||
GetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
|
GetData(&AcceptedMoneyDesc, &m, i, DATA_FLAG_DIRECT_INDEX);
|
||||||
|
// ñ÷èòàåì crc16 ýòèõ äåíåã èç FRAM
|
||||||
crct = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
|
GetData(&AcceptedMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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;
|
CPU_INT32U m,crc;
|
||||||
m=money;
|
m=money;
|
||||||
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
|
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
|
||||||
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
|
SetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
|
||||||
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
|
SetData(&AcceptedMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// î÷èñòèòü ñ÷åò÷èê äåíåã
|
// î÷èñòèòü ñ÷åò÷èê äåíåã
|
||||||
void ClearAcceptedMoney(void)
|
void ClearAcceptedMoney(int post)
|
||||||
{
|
{
|
||||||
CPU_INT32U m,crc;
|
CPU_INT32U m,crc;
|
||||||
m=0;
|
m=0;
|
||||||
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
|
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
|
||||||
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
|
SetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
|
||||||
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
|
SetData(&AcceptedMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// î÷èñòèòü ñ÷åò÷èê äåíåã
|
// î÷èñòèòü ñ÷åò÷èê äåíåã
|
||||||
CPU_INT32U GetAcceptedMoney(void)
|
CPU_INT32U GetAcceptedMoney(int post)
|
||||||
{
|
{
|
||||||
CPU_INT32U m;
|
CPU_INT32U m;
|
||||||
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
|
GetData(&AcceptedMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -37,8 +37,20 @@ enum{
|
|||||||
EVENT_SEC = 1,
|
EVENT_SEC = 1,
|
||||||
EVENT_STARTUP,
|
EVENT_STARTUP,
|
||||||
|
|
||||||
EVENT_COIN_INSERTED,
|
EVENT_COIN_INSERTED_POST1,
|
||||||
EVENT_CASH_INSERTED,
|
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_ESCROW,
|
||||||
EVENT_BILL_STACKED,
|
EVENT_BILL_STACKED,
|
||||||
|
|
||||||
@ -56,8 +68,6 @@ enum{
|
|||||||
EVENT_KEY_START,
|
EVENT_KEY_START,
|
||||||
EVENT_KEY_USER_START,
|
EVENT_KEY_USER_START,
|
||||||
|
|
||||||
EVENT_INCASSATION,
|
|
||||||
EVENT_INCASSATION_FINISH,
|
|
||||||
#ifdef BOARD_POST_CFG
|
#ifdef BOARD_POST_CFG
|
||||||
EVENT_PULSEOUT
|
EVENT_PULSEOUT
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -67,8 +67,6 @@ int TstCriticalErrors(void)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
errors |= TstErrorFlag(ERROR_VALIDATOR_CONN);
|
|
||||||
|
|
||||||
OS_EXIT_CRITICAL();
|
OS_EXIT_CRITICAL();
|
||||||
if (errors) return 1;
|
if (errors) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -82,10 +80,6 @@ int TstCriticalValidatorErrors(void)
|
|||||||
|
|
||||||
void ClrValidatorErrors(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)
|
void GetEventStr(char* str, char event)
|
||||||
{
|
{
|
||||||
switch (event){
|
switch (event){
|
||||||
case JOURNAL_EVENT_MONEY_NOTE:
|
case JOURNAL_EVENT_MONEY_NOTE_POST1:
|
||||||
sprintf(str, "Âí.êóïþðà ");
|
sprintf(str, "Âí.êóïþðà ïîñò 1");
|
||||||
break;
|
break;
|
||||||
case JOURNAL_EVENT_MONEY_COIN:
|
case JOURNAL_EVENT_MONEY_NOTE_POST2:
|
||||||
sprintf(str, "Âí.ìîíåòû ");
|
sprintf(str, "Âí.êóïþðà ïîñò 2");
|
||||||
break;
|
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:
|
case JOURNAL_EVENT_START_SESSION:
|
||||||
sprintf(str, "Ïå÷àòü ÷åêà ");
|
sprintf(str, "Ïå÷àòü ÷åêà ");
|
||||||
break;
|
break;
|
||||||
@ -183,12 +209,44 @@ void GetEventStr(char* str, char event)
|
|||||||
void GetEventStrEng(char* str, char event)
|
void GetEventStrEng(char* str, char event)
|
||||||
{
|
{
|
||||||
switch (event){
|
switch (event){
|
||||||
case JOURNAL_EVENT_MONEY_NOTE:
|
case JOURNAL_EVENT_MONEY_NOTE_POST1:
|
||||||
sprintf(str, " | Vnesena kupura ");
|
sprintf(str, " | Vnesena kupura post 1");
|
||||||
break;
|
break;
|
||||||
case JOURNAL_EVENT_MONEY_COIN:
|
case JOURNAL_EVENT_MONEY_NOTE_POST2:
|
||||||
sprintf(str, " | Vneseny monety ");
|
sprintf(str, " | Vnesena kupura post 2");
|
||||||
break;
|
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:
|
case JOURNAL_EVENT_START_SESSION:
|
||||||
sprintf(str, " | Print bill ");
|
sprintf(str, " | Print bill ");
|
||||||
break;
|
break;
|
||||||
@ -245,9 +303,8 @@ void PrintEventJournalRecordEng(char* str, TEventRecord *record)
|
|||||||
GetEventStrEng(&str[strlen(str)], record->event);
|
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);
|
sprintf(&str[strlen(str)], "%d rub.", record->data);
|
||||||
}
|
}
|
||||||
else if (record->event == JOURNAL_EVENT_START_SESSION)
|
else if (record->event == JOURNAL_EVENT_START_SESSION)
|
||||||
@ -404,7 +461,7 @@ void ClearBillnomCounter(void)
|
|||||||
// ñåðâåð îøèáîê (çàíåñåíèå îøèáîê â æóðíàë)
|
// ñåðâåð îøèáîê (çàíåñåíèå îøèáîê â æóðíàë)
|
||||||
void ErrorServer(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)))
|
if (!(PrevFlags[i/32] & (1L<<(i%32)))
|
||||||
&& (TstErrorFlag(i)))
|
&& (TstErrorFlag(i)))
|
||||||
|
|||||||
@ -15,80 +15,39 @@ typedef struct{
|
|||||||
// òèï ñîáûòèÿ
|
// òèï ñîáûòèÿ
|
||||||
CPU_INT08U event;
|
CPU_INT08U event;
|
||||||
#define JOURNAL_EVENT_NO_EVENT 0 // íåò ñîáûòèÿ
|
#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) // ÷èñëî ñîáûòèé
|
#define JOURNAL_EVENTS_COUNT (ERROR_FR+FR_ERROR_NUMBER) // ÷èñëî ñîáûòèé
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
@ -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_
|
|
||||||
@ -13,8 +13,6 @@
|
|||||||
#include "fiscal.h"
|
#include "fiscal.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "CRC16.h"
|
#include "CRC16.h"
|
||||||
#include "modem_task.h"
|
|
||||||
#include "modem.h"
|
|
||||||
#include "coin.h"
|
#include "coin.h"
|
||||||
|
|
||||||
extern CPU_INT32U modem_status;
|
extern CPU_INT32U modem_status;
|
||||||
@ -167,7 +165,7 @@ TDataDescStruct const CashPulseLenDesc = {
|
|||||||
(void*)offsetof(TFramMap, cash_pulse_len), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, cash_pulse_len), // указатель на переменную или адрес FRAM
|
||||||
(void*)&CashPulseLenRange, // указатель на границы параметра
|
(void*)&CashPulseLenRange, // указатель на границы параметра
|
||||||
OnChangeCashPulseLen, // функция по изменению
|
OnChangeCashPulseLen, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
CashPulseLenName, // указатель на строку названия параметра
|
CashPulseLenName, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -191,7 +189,7 @@ TDataDescStruct const CashPauseLenDesc = {
|
|||||||
(void*)offsetof(TFramMap, cash_pause_len), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, cash_pause_len), // указатель на переменную или адрес FRAM
|
||||||
(void*)&CashPauseLenRange, // указатель на границы параметра
|
(void*)&CashPauseLenRange, // указатель на границы параметра
|
||||||
OnChangeCashPulseLen, // функция по изменению
|
OnChangeCashPulseLen, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
CashPauseLenName, // указатель на строку названия параметра
|
CashPauseLenName, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -417,21 +415,21 @@ CPU_INT08U const *EnableModemList[] = {OnOffList_str0, OnOffList_str1};
|
|||||||
|
|
||||||
void OnchangeEnableModem(void)
|
void OnchangeEnableModem(void)
|
||||||
{
|
{
|
||||||
CPU_INT32U en = 0;
|
// CPU_INT32U en = 0;
|
||||||
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
|
// GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
|
||||||
|
//
|
||||||
if (en)
|
// if (en)
|
||||||
{
|
// {
|
||||||
if (!IsModemConn())
|
// if (!IsModemConn())
|
||||||
{
|
// {
|
||||||
modem_status = 2;
|
// modem_status = 2;
|
||||||
}
|
// }
|
||||||
else if (!IsModemConf())
|
// else if (!IsModemConf())
|
||||||
{
|
// {
|
||||||
modem_status = 1;
|
// modem_status = 1;
|
||||||
}
|
// }
|
||||||
PostModemTask(MODEM_TASK_RECONNECT);
|
// //PostModemTask(MODEM_TASK_RECONNECT);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
TDataDescStruct const EnableModemDesc = {
|
TDataDescStruct const EnableModemDesc = {
|
||||||
@ -653,7 +651,7 @@ TDataDescStruct const CoinPerPulseDesc = {
|
|||||||
(void*)offsetof(TFramMap, DeviceConfig.CoinPerPulse), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, DeviceConfig.CoinPerPulse), // указатель на переменную или адрес FRAM
|
||||||
(void*)&CoinPerPulseRange, // указатель на границы параметра
|
(void*)&CoinPerPulseRange, // указатель на границы параметра
|
||||||
NULL, // функция по изменению
|
NULL, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
CoinPerPulseName, // указатель на строку названия параметра
|
CoinPerPulseName, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -741,7 +739,7 @@ TDataDescStruct const PrintModeDesc = {
|
|||||||
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
||||||
PrintModeList, // указатель на список строк для индексного параметра
|
PrintModeList, // указатель на список строк для индексного параметра
|
||||||
DATA_INIT_DISABLE,
|
DATA_INIT_DISABLE,
|
||||||
0
|
1
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -808,7 +806,7 @@ TDataDescStruct const CashPerPulseDesc = {
|
|||||||
(void*)offsetof(TFramMap, DeviceConfig.CashPerPulse), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, DeviceConfig.CashPerPulse), // указатель на переменную или адрес FRAM
|
||||||
(void*)&CashPerPulseRange, // указатель на границы параметра
|
(void*)&CashPerPulseRange, // указатель на границы параметра
|
||||||
NULL, // функция по изменению
|
NULL, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
CashPerPulseName, // указатель на строку названия параметра
|
CashPerPulseName, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -1518,37 +1516,17 @@ TDataDescStruct const PrintXReportDesc = {
|
|||||||
Ошибка в журнале ошибок
|
Ошибка в журнале ошибок
|
||||||
*************************************/
|
*************************************/
|
||||||
TRangeValueULONG const ErrorNumberRange = {0, JOURNAL_EVENTS_COUNT - 1};
|
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-Неизвестная",
|
"ФР:01h-Неизвестная",
|
||||||
"ФР:02h-Неверное",
|
"ФР:02h-Неверное",
|
||||||
"ФР:03h-Ошибка ФН",
|
"ФР:03h-Ошибка ФН",
|
||||||
@ -1679,36 +1657,17 @@ TDataDescStruct const JournalErrorNumberDesc0 = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
CPU_INT08U const *ErrorNumberList1[JOURNAL_EVENTS_COUNT] = {"", "", "", "",
|
CPU_INT08U const *ErrorNumberList1[JOURNAL_EVENTS_COUNT] =
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
|
||||||
|
"", "", "", "",
|
||||||
|
"", "", "", "",
|
||||||
|
"", "", "", "",
|
||||||
|
|
||||||
"", "", "", "",
|
"", "", "", "",
|
||||||
"", "", "", "",
|
"", "", "", "",
|
||||||
"", "", "", "",
|
"", "", "", "",
|
||||||
"купюроприемником",
|
|
||||||
"купюроприемника",
|
|
||||||
"при замине",
|
|
||||||
"по маг.датчику",
|
|
||||||
"при транспорт.",
|
|
||||||
"по идентификации",
|
|
||||||
"по верификации ",
|
|
||||||
"по оптич.датчику ",
|
|
||||||
"по запрету",
|
|
||||||
"по емкост.датчику",
|
|
||||||
"по длине",
|
|
||||||
"заполнена",
|
|
||||||
"отсутствует",
|
|
||||||
"купюроприемнике",
|
|
||||||
"в кассете",
|
|
||||||
"обмана",
|
|
||||||
"стекерного мотора",
|
|
||||||
"транспорт.мотора",
|
|
||||||
"транспорт.мотора",
|
|
||||||
"выравнивания",
|
|
||||||
"отсутствует",
|
|
||||||
"оптики",
|
|
||||||
"маг.датчика",
|
|
||||||
"датчика",
|
|
||||||
"модема",
|
|
||||||
"связи с ФР",
|
|
||||||
|
|
||||||
"команда", // ФР:01h
|
"команда", // ФР: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 modemom",
|
||||||
"Oshibka svyazi s FR",
|
"Oshibka svyazi s FR",
|
||||||
"Oshibka FR 0x01",
|
"Oshibka FR 0x01",
|
||||||
@ -2560,7 +2495,7 @@ TDataDescStruct const TaxFormatDesc = {
|
|||||||
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
||||||
TaxFormatList, // указатель на список строк для индексного параметра
|
TaxFormatList, // указатель на список строк для индексного параметра
|
||||||
DATA_INIT_DISABLE,
|
DATA_INIT_DISABLE,
|
||||||
1
|
6
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -2649,7 +2584,7 @@ TDataDescStruct const ServiceNameDesc = {
|
|||||||
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
DATA_IS_INDEX, // признак индексного параметра (список строк)
|
||||||
ServiceNameList, // указатель на список строк для индексного параметра
|
ServiceNameList, // указатель на список строк для индексного параметра
|
||||||
DATA_INIT_DISABLE,
|
DATA_INIT_DISABLE,
|
||||||
0 // значение по умолчанию
|
1 // çíà÷åíèå ïî óìîë÷àíèþ
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -2659,13 +2594,13 @@ TDataDescStruct const AcceptedMoneyDesc = {
|
|||||||
DATA_DESC_EDIT, // тип дескриптора
|
DATA_DESC_EDIT, // тип дескриптора
|
||||||
DATA_TYPE_ULONG, // тип параметра
|
DATA_TYPE_ULONG, // тип параметра
|
||||||
DATA_LOC_FRAM, // расположение параметра
|
DATA_LOC_FRAM, // расположение параметра
|
||||||
DATA_NO_ARRAY, // признак массива
|
DATA_IS_ARRAY, // ïðèçíàê ìàññèâà
|
||||||
0, // размер массива
|
COUNT_POST, // ðàçìåð ìàññèâà
|
||||||
NULL, // указатель на десриптор индекса массива
|
NULL, // указатель на десриптор индекса массива
|
||||||
(void*)offsetof(TFramMap, FRAM_AcceptedMoney), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, FRAM_AcceptedMoney), // указатель на переменную или адрес FRAM
|
||||||
NULL, // указатель на границы параметра
|
NULL, // указатель на границы параметра
|
||||||
NULL, // функция по изменению
|
NULL, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
NULL, // указатель на строку названия параметра
|
NULL, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -2680,13 +2615,13 @@ TDataDescStruct const AcceptedMoneyCRC16Desc = {
|
|||||||
DATA_DESC_EDIT, // тип дескриптора
|
DATA_DESC_EDIT, // тип дескриптора
|
||||||
DATA_TYPE_ULONG, // тип параметра
|
DATA_TYPE_ULONG, // тип параметра
|
||||||
DATA_LOC_FRAM, // расположение параметра
|
DATA_LOC_FRAM, // расположение параметра
|
||||||
DATA_NO_ARRAY, // признак массива
|
DATA_IS_ARRAY, // ïðèçíàê ìàññèâà
|
||||||
0, // размер массива
|
COUNT_POST, // ðàçìåð ìàññèâà
|
||||||
NULL, // указатель на десриптор индекса массива
|
NULL, // указатель на десриптор индекса массива
|
||||||
(void*)offsetof(TFramMap, crc_AcceptedMoney), // указатель на переменную или адрес FRAM
|
(void*)offsetof(TFramMap, crc_AcceptedMoney), // указатель на переменную или адрес FRAM
|
||||||
NULL, // указатель на границы параметра
|
NULL, // указатель на границы параметра
|
||||||
NULL, // функция по изменению
|
NULL, // функция по изменению
|
||||||
0, // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // ñìåùåíèå ìåæäó ýëåìåíòàìè â ìàññèâå
|
||||||
NULL, // указатель на строку названия параметра
|
NULL, // указатель на строку названия параметра
|
||||||
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
DATA_NO_INDEX, // признак индексного параметра (список строк)
|
||||||
NULL, // указатель на список строк для индексного параметра
|
NULL, // указатель на список строк для индексного параметра
|
||||||
@ -2906,7 +2841,7 @@ void OnChangeSendTestEmail(void)
|
|||||||
{
|
{
|
||||||
if (send_test)
|
if (send_test)
|
||||||
{
|
{
|
||||||
PostModemTask(MODEM_TASK_SEND_TEST_MSG);
|
//PostModemTask(MODEM_TASK_SEND_TEST_MSG);
|
||||||
send_test = 0;
|
send_test = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2960,7 +2895,7 @@ TDataDescStruct const BillnomIndexDesc = {
|
|||||||
/*************************************
|
/*************************************
|
||||||
Значение номинала купюры для просмотра счетчиков
|
Значение номинала купюры для просмотра счетчиков
|
||||||
*************************************/
|
*************************************/
|
||||||
extern CPU_INT32U BillNominals[24];
|
|
||||||
CPU_INT08U const BillnomValName[] = "Значение,руб.";
|
CPU_INT08U const BillnomValName[] = "Значение,руб.";
|
||||||
|
|
||||||
TDataDescStruct const BillnomDesc = {
|
TDataDescStruct const BillnomDesc = {
|
||||||
@ -2970,7 +2905,7 @@ TDataDescStruct const BillnomDesc = {
|
|||||||
DATA_IS_ARRAY, // признак массива
|
DATA_IS_ARRAY, // признак массива
|
||||||
24, // размер массива
|
24, // размер массива
|
||||||
(void*)&BillnomIndexDesc, // указатель на десриптор индекса массива
|
(void*)&BillnomIndexDesc, // указатель на десриптор индекса массива
|
||||||
(void*)&BillNominals, // указатель на переменную или адрес FRAM
|
NULL, // óêàçàòåëü íà ïåðåìåííóþ èëè àäðåñ FRAM
|
||||||
NULL, // указатель на границы параметра
|
NULL, // указатель на границы параметра
|
||||||
NULL, // функция по изменению
|
NULL, // функция по изменению
|
||||||
sizeof(CPU_INT32U), // смещение между элементами в массиве
|
sizeof(CPU_INT32U), // смещение между элементами в массиве
|
||||||
@ -3275,9 +3210,17 @@ const TDataDescArrayStruct AllDataArray[] =
|
|||||||
|
|
||||||
{&CashPulseLenDesc, "CashPulseLenDesc"},
|
{&CashPulseLenDesc, "CashPulseLenDesc"},
|
||||||
{&CashPauseLenDesc, "CashPauseLenDesc"},
|
{&CashPauseLenDesc, "CashPauseLenDesc"},
|
||||||
|
|
||||||
|
{&TaxSystemDesc, "TaxSystemDesc"},
|
||||||
|
{&TaxFormatDesc, "TaxFormatDesc"},
|
||||||
|
{&SubjSellDesc, "SubjSellDesc"},
|
||||||
|
{&CommandV2Desc, "CommandV2Desc"},
|
||||||
|
{&ServiceNameDesc, "ServiceNameDesc"},
|
||||||
|
|
||||||
|
{&PrintModeDesc, "PrintModeDesc"},
|
||||||
|
{&PrintTimeoutAfterDesc, "PrintTimeoutAfterDesc"},
|
||||||
|
|
||||||
|
|
||||||
{NULL, ""}
|
{NULL, ""}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -20,8 +20,8 @@ typedef struct
|
|||||||
// äëèííûå ñ÷åò÷èêè ñ CRC16
|
// äëèííûå ñ÷åò÷èêè ñ CRC16
|
||||||
TCountersLong CountersLong;
|
TCountersLong CountersLong;
|
||||||
|
|
||||||
CPU_INT32U FRAM_AcceptedMoney;
|
CPU_INT32U FRAM_AcceptedMoney[COUNT_POST];
|
||||||
CPU_INT32U crc_AcceptedMoney;
|
CPU_INT32U crc_AcceptedMoney[COUNT_POST];
|
||||||
|
|
||||||
// æóðíàë ñîáûòèé+îøèáîê
|
// æóðíàë ñîáûòèé+îøèáîê
|
||||||
TEventRecord EventRecords[EVENT_RECORDS_COUNT];
|
TEventRecord EventRecords[EVENT_RECORDS_COUNT];
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
@ -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_
|
|
||||||
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
#ifndef _VMCCONSTS_H_
|
|
||||||
#define _VMCCONSTS_H_
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _VMCCONSTS_H_
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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_
|
|
||||||
@ -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", ®, &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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -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__
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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_
|
|
||||||
|
|
||||||
@ -219,8 +219,8 @@ const TMenuLine line_StatisticsMenu_4 = {
|
|||||||
(void*)ClearStatMenu // ïàíåëü äëÿ ïåðåõîäà
|
(void*)ClearStatMenu // ïàíåëü äëÿ ïåðåõîäà
|
||||||
};
|
};
|
||||||
|
|
||||||
const TMenuLineArray arr_StatisticsMenuArray[] = {&line_StatisticsMenu_0, &line_StatisticsMenu_2, &line_StatisticsMenu_3, &line_StatisticsMenu_4, NULL};
|
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 TMenuPanel StatisticsMenuPanel[] = {arr_StatisticsMenuArray, NULL, 3, MENU_PANEL_STANDARD};
|
||||||
|
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
@ -512,8 +512,8 @@ const TMenuLine line_SettingsMenu_7 = {
|
|||||||
NULL // ïàíåëü äëÿ ïåðåõîäà
|
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 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 TMenuPanel SettingsMenuPanel[] = {arr_SettingsMenuArray, NULL, 5, MENU_PANEL_STANDARD};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1065,8 +1065,8 @@ const TMenuLine line_CashMenu_5 = {
|
|||||||
NULL // ïàíåëü äëÿ ïåðåõîäà
|
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 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 TMenuPanel ValidatorSetupPanel[] = {arr_ValidatorMenuArray, OnEnterCoinMenu, 5, MENU_PANEL_STANDARD};
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
ÌÅÍÞ ÍÀÑÒÐÎÉÊÀ ÌÎÄÅÌÀ
|
ÌÅÍÞ ÍÀÑÒÐÎÉÊÀ ÌÎÄÅÌÀ
|
||||||
@ -1653,9 +1653,9 @@ void PrintEventJournalRecord(TEventRecord *record)
|
|||||||
if (record->event)
|
if (record->event)
|
||||||
{ // åñòü ñîáûòèå
|
{ // åñòü ñîáûòèå
|
||||||
GetEventStr(str_EventNumber, 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)
|
else if (record->event == JOURNAL_EVENT_START_SESSION)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
#include "coin.h"
|
#include "coin.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "datadesc.h"
|
#include "datadesc.h"
|
||||||
#include "modem.h"
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
OS_STK CoinTaskStk[COIN_TASK_STK_SIZE];
|
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_pulse = 5000;
|
||||||
static CPU_INT32U cash_pause = 2000;
|
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];
|
static CPU_INT32U pend_cash_timestamp[COUNT_POST];
|
||||||
|
|
||||||
void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause)
|
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(&CashModeDesc, &cash_mode, i, DATA_FLAG_DIRECT_INDEX);
|
||||||
GetData(&EnableValidatorDesc, &cash_enable, i, DATA_FLAG_DIRECT_INDEX);
|
GetData(&EnableValidatorDesc, &cash_enable, i, DATA_FLAG_DIRECT_INDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
OSTimeDly(1);
|
OSTimeDly(1);
|
||||||
|
|
||||||
if (enable_coin)
|
if (enable_coin)
|
||||||
{
|
{
|
||||||
if (GetCoinCount(i))
|
if (GetCoinCount(i))
|
||||||
{
|
{
|
||||||
PostUserEvent(EVENT_COIN_INSERTED);
|
PostUserEvent(EVENT_COIN_INSERTED_POST1 + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -93,7 +93,7 @@ void CoinTask(void *p_arg)
|
|||||||
{
|
{
|
||||||
if (labs(OSTimeGet() - last_cash_time[i]) > 500)
|
if (labs(OSTimeGet() - last_cash_time[i]) > 500)
|
||||||
{
|
{
|
||||||
PostUserEvent(EVENT_CASH_INSERTED);
|
PostUserEvent(EVENT_CASH_INSERTED_POST1 + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -178,8 +178,14 @@ CPU_INT32U GetResetCashCount(int index)
|
|||||||
// èíèöèàëèçàöèÿ ìîíåòîïðèåìíèêà
|
// èíèöèàëèçàöèÿ ìîíåòîïðèåìíèêà
|
||||||
void InitCoin(void)
|
void InitCoin(void)
|
||||||
{
|
{
|
||||||
//CoinImpCounter = 0;
|
for(int i = 0; i < COUNT_POST; i++)
|
||||||
//CashImpCounter = 0;
|
{
|
||||||
|
CoinImpCounter[i] = 0;
|
||||||
|
CashImpCounter[i] = 0;
|
||||||
|
|
||||||
|
pend_cash_counter[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
InitImpInput();
|
InitImpInput();
|
||||||
OSTaskCreate(CoinTask, (void *)0, (OS_STK *)&CoinTaskStk[COIN_TASK_STK_SIZE-1], COIN_TASK_PRIO);
|
OSTaskCreate(CoinTask, (void *)0, (OS_STK *)&CoinTaskStk[COIN_TASK_STK_SIZE-1], COIN_TASK_PRIO);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -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_
|
|
||||||
@ -14,7 +14,7 @@ Count=0
|
|||||||
Enabled=0
|
Enabled=0
|
||||||
ShowSource=1
|
ShowSource=1
|
||||||
[DebugChecksum]
|
[DebugChecksum]
|
||||||
Checksum=-1481857352
|
Checksum=-390368809
|
||||||
[Exceptions]
|
[Exceptions]
|
||||||
StopOnUncaught=_ 0
|
StopOnUncaught=_ 0
|
||||||
StopOnThrow=_ 0
|
StopOnThrow=_ 0
|
||||||
|
|||||||
@ -42,7 +42,7 @@
|
|||||||
<Factory>Workspace</Factory>
|
<Factory>Workspace</Factory>
|
||||||
<Session>
|
<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>
|
</Tab>
|
||||||
</Tabs>
|
</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>
|
<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>
|
</Desktop>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|
||||||
|
|||||||
2764
sk-mlpc2368.dep
2764
sk-mlpc2368.dep
File diff suppressed because it is too large
Load Diff
@ -1006,7 +1006,7 @@
|
|||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>OGLastSavedByProductVersion</name>
|
<name>OGLastSavedByProductVersion</name>
|
||||||
<state>6.21.4.52945</state>
|
<state>6.21.1.52845</state>
|
||||||
</option>
|
</option>
|
||||||
<option>
|
<option>
|
||||||
<name>GeneralEnableMisra</name>
|
<name>GeneralEnableMisra</name>
|
||||||
@ -3149,12 +3149,6 @@
|
|||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\PROJECT\app\journal.h</name>
|
<name>$PROJ_DIR$\PROJECT\app\journal.h</name>
|
||||||
</file>
|
</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>
|
||||||
<group>
|
<group>
|
||||||
<name>data</name>
|
<name>data</name>
|
||||||
@ -3182,24 +3176,6 @@
|
|||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<name>drivers</name>
|
<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>
|
<group>
|
||||||
<name>fiscal</name>
|
<name>fiscal</name>
|
||||||
<file>
|
<file>
|
||||||
@ -3248,21 +3224,6 @@
|
|||||||
<name>$PROJ_DIR$\PROJECT\drivers\lcd\lcd.h</name>
|
<name>$PROJ_DIR$\PROJECT\drivers\lcd\lcd.h</name>
|
||||||
</file>
|
</file>
|
||||||
</group>
|
</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>
|
<file>
|
||||||
<name>$PROJ_DIR$\PROJECT\drivers\uart.c</name>
|
<name>$PROJ_DIR$\PROJECT\drivers\uart.c</name>
|
||||||
<excluded>
|
<excluded>
|
||||||
@ -3342,12 +3303,6 @@
|
|||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\PROJECT\services\time.h</name>
|
<name>$PROJ_DIR$\PROJECT\services\time.h</name>
|
||||||
</file>
|
</file>
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\PROJECT\services\validator.c</name>
|
|
||||||
</file>
|
|
||||||
<file>
|
|
||||||
<name>$PROJ_DIR$\PROJECT\services\validator.h</name>
|
|
||||||
</file>
|
|
||||||
</group>
|
</group>
|
||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\PROJECT\version.h</name>
|
<name>$PROJ_DIR$\PROJECT\version.h</name>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user