3124 lines
95 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

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

#include <includes.h>
#include "app_serv.h"
#include "modem.h"
#include "validator.h"
#include "coin.h"
#include "time.h"
#include "fiscal.h"
#include "menu.h"
#include "data.h"
#include "mode.h"
#include "menudesc.h"
#include "datadesc.h"
#include "control.h"
#include "validator.h"
#include "CCRSProtocol.h"
#include "menu.h"
#include "journal.h"
#include "fr.h"
#include "CRC16.h"
#include "modem_task.h"
#include "host_app.h"
#include "console.h"
#include "keyboard.h"
#include "term_tsk.h"
#include "fram_map.h"
#include "fram.h"
#include "sdcard.h"
#include "score_tsk.h"
#ifdef CONFIG_MUSIC_ENABLE
#include "player.h"
#endif
#ifdef CONFIG_WEB_INTERFACE
#include "httpd.h"
#endif
#ifdef CONFIG_MUSIC_ENABLE
#include "music_tsk.h"
extern int player_conn;
#endif
#include <string.h>
#include <stdio.h>
#include <stddef.h>
#if defined(BOARD_SOLARIUM_VLAD)
#include "app_vlad.h"
#endif
#include "rfid-spi.h"
#if defined(BOARD_SOLARIUM_WEB)
ApplicationState app_state;
#endif
void PrintReports(void)
{
if (!FlagForPrintReport) return;
if (GetCurrentMenu() == CanselCheckMenuPanel)
{
int res = CanselFiscalBill();
SaveEventRecord(0, JOURNAL_EVENT_PRINT_X, res);
CheckFiscalStatus();
GoToPreviousMenu();
UserPrintResultMenu();
GoToMenu(WORK_MENU);
}
else if (GetCurrentMenu() == xReportMenuPanel)
{ // ïå÷àòàåì X-îò÷åò
CPU_INT08U err;
if (IsFiscalConnected())
{
FPend();
FiscPrintDayReportNoClear(30, &err);
FPost();
if (err) {SetFiscalErrorByCode(err);}
SaveEventRecord(0, JOURNAL_EVENT_PRINT_X, GetTimeSec());
GoToPreviousMenu();
}
}
else if (GetCurrentMenu() == zReportMenuPanel)
{ // ïå÷àòàåì Z-îò÷åò
CPU_INT08U err;
if (IsFiscalConnected())
{
FPend();
FiscPrintDayReportClear(30, &err);
FPost();
if (err) {SetFiscalErrorByCode(err);}
SaveEventRecord(0, JOURNAL_EVENT_PRINT_Z, GetTimeSec());
GoToPreviousMenu();
ClrFiscalErrorByCode(FR_ERROR_CODE_4E);
}
}
else if (GetCurrentMenu() == bufReportMenuPanel)
{ // ïå÷àòàåì Z-îò÷åòû èç áóôåðà
CPU_INT08U err;
if (IsFiscalConnected())
{
FPend();
FiscPrintDayReportsFromBuf(30, &err);
FPost();
if (err) {SetFiscalErrorByCode(err);}
SaveEventRecord(0, JOURNAL_EVENT_PRINT_BUF, GetTimeSec());
GoToPreviousMenu();
}
}
}
extern CPU_INT08U start_pass_ok;
// åñëè îïðåäåëèòü ýòîò ìàêðîñ, áóäóò âíîñèòüñÿ äåíüãè ïî êíîïêå F1
//#define _DEBUG_MONEY
uint32_t last_money, last_post;
extern TFramMap *config_ram;
CPU_INT32U SystemTime;
CPU_INT08U EnabledChannelsNum;
CPU_INT08U RecentChannel;
CPU_INT08U UserMenuState;
#define USER_STATE_SELECT_POST 0
#define USER_STATE_SELECT_PAY_TYPE 1
#define USER_STATE_SELECT_MONEY 2
#define USER_STATE_TERMINAL_REQUEST 3
#define USER_STATE_ACCEPT_MONEY 4
#define USER_STATE_SHOW_THANKS 5
#define USER_STATE_FINISH_PAYMENT 6
CPU_INT08U ThanksCtr;
CPU_INT32U TerminalMoney;
CPU_INT08U ChannelsState[CHANNELS_NUM];
#define CHANNEL_STATE_FREE 0
#define CHANNEL_STATE_BUSY 1
#define CHANNEL_STATE_DISABLED 2
CPU_INT32U ChannelsCounters[CHANNELS_NUM];
CPU_INT32U ChannelsPayedTime[CHANNELS_NUM];
extern CPU_INT32U BillNominals[24];
CPU_INT32U incas_bill_nom_counter[24];
CPU_INT32U incas_common_bill_counter;
#define USER_QUERY_LEN 64
static OS_STK UserTaskStk[USER_TASK_STK_SIZE];
OS_EVENT *UserQuery = NULL;
void *UserTbl[USER_QUERY_LEN];
#if defined(BOARD_SOLARIUM_WEB)
CPU_INT32U http_last_status_time;
char pass_edit = 0;
char pass_phrase[10];
#define USER_INPUT_STR_MAX_LEN 3
#define MODE_PASSWORD "*102#"
CPU_INT08U zummer_enabled = 0;
char message_lines[2][128];
CPU_INT08U show_blocking_msg = 0;
#define SHOW_BLOCKING_MSG_TIME 5
void PrintSolariumBlockingMessage();
void PrintServerDisconnectedMenu();
#endif
int GetUserEvent(int* event);
void UserPrintMoneyMenu(void);
void UserPrintPaymentErrorMenu(void);
void WorkServer(void);
void UserPrintThanksMenu(void);
void UserPrintSelectPostMenu(void);
void UserPrintErrorMenu(void);
CPU_INT32U GetChannelsTimeForFree(CPU_INT08U ch);
void LoadAcceptedMoney(void);
void SetAcceptedMoney(CPU_INT32U money);
void ClearAcceptedMoney(void);
CPU_INT32U GetAcceptedMoney(void);
void InitPass(void);
int CheckChannelEnabled(CPU_INT08U channel);
int ChannelBusy(CPU_INT08U ch);
void UserPrintIpDeviceErrMenu(CPU_INT08U post);
void UserPrintSelectMoneyMenu();
void UserPrintTerminalRequestMenu();
void UserPrintErrPayMenu();
void UserPrintSelectPayTypeMenu(void);
void PrintCardBill(void);
#if defined(BOARD_SOLARIUM_WEB)
void PrintSolariumFreeMenu();
void PrintSolariumPassMenu();
void PrintSolariumUserInputMenu();
void PrintWaitingAckUserMenu();
void PrintSolariumSunburnMenu();
void PrintSolariumPrePauseMenu();
void PrintSolariumVentilationMenu();
void SolariumStartUserInput();
CPU_INT32U SolariumGetUserInputTime();
CPU_INT32U SolariumFinishUserInput();
#endif
#if defined(BOARD_CENTRAL_CARWASH)
static char incassation;
static char was_critical_error;
static char terminal_pay_flag = 0;
#endif
static CPU_INT08U blink_counter;
#ifdef BOARD_POST_CARWASH
static int out_pulse_count = 0;
static int out_pulse_len = 0;
static int out_pulse_pause_len = 0;
int out_timer_counter = 0;
CPU_INT32U app_timer_value = 0;
void AddOutPulses(int count, int len_ms, int len_pause_ms)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
out_pulse_count += count;
out_pulse_len = len_ms;
out_pulse_pause_len = len_pause_ms;
OS_EXIT_CRITICAL();
}
#endif
int test_counter = 0;
int pre_pause_counter = 0;
///
CPU_INT32U TerminalEnabled()
{
CPU_INT32U enabled = 0;
GetData(&EnableTerminalDesc, &enabled, 0, DATA_FLAG_SYSTEM_INDEX);
return enabled;
}
void SelectFirstMenu()
{
CPU_INT32U term_en = 0, validator_en = 0, coin_en = 0;
GetData(&EnableTerminalDesc, &term_en, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&EnableValidatorDesc, &validator_en, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&EnableCoinDesc, &coin_en, 0, DATA_FLAG_SYSTEM_INDEX);
if (term_en)
{
if (validator_en || coin_en)
{
UserMenuState = USER_STATE_SELECT_PAY_TYPE;
UserPrintSelectPayTypeMenu();
RefreshMenu();
}
else
{
UserMenuState = USER_STATE_SELECT_MONEY;
UserPrintSelectMoneyMenu();
RefreshMenu();
}
}
else
{
UserMenuState = USER_STATE_ACCEPT_MONEY;
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL);
CoinEnable();
UserPrintMoneyMenu();
RefreshMenu();
}
}
#if defined(BOARD_SOLARIUM_WEB)
const char* AppStatusStr(CPU_INT08U state)
{
static const char state_idle[] = "idle";
static const char state_waiting_input[] = "waiting_input";
static const char state_waiting_ack[] = "waiting_ack";
static const char state_pre_pause[] = "pre_pause";
static const char state_sunburn[] = "sunburn";
static const char state_ventilation[] = "ventilation";
static const char state_unknown[] = "unknown";
if (state == APP_STATE_IDLE) return state_idle;
else if (state == APP_STATE_USER_INPUT) return state_waiting_input;
else if (state == APP_STATE_WAITING_ACK) return state_waiting_ack;
else if (state == APP_STATE_PRE_PAUSE) return state_pre_pause;
else if (state == APP_STATE_SUNBURN) return state_sunburn;
else if (state == APP_STATE_VENTILATION) return state_ventilation;
return state_unknown;
}
/// ðàñ÷åò âðåìåíè çàãàðà â ñåêóíäàõ ïî ñóììå äåíåã
CPU_INT32U CalcTimeSecPerMoney(CPU_INT32U money)
{
CPU_INT32U price;
GetData(&SolariumPricePerMinDesc, &price, 0, DATA_FLAG_SYSTEM_INDEX);
if (price == 0) return 0;
return (CPU_INT32U)((float)money / (float)price * 60.0);
}
uint32_t zummer_timer = 0;
void ZummerBeep(void)
{
zummer_timer = 100;
}
void ZummerLongBeep(void)
{
zummer_timer = 400;
}
char user_input_str[8];
CPU_INT08U user_input_ctr;
static const CPU_INT08U user_input_pos[4] = {0, 1, 3, 4};
#endif
void App_TaskCreateHook (OS_TCB *ptcb) {}
void App_TaskDelHook (OS_TCB *ptcb) {}
void App_TaskIdleHook (void) {}
void App_TaskStatHook (void) {}
#if OS_TASK_SW_HOOK_EN > 0
void App_TaskSwHook (void) {}
#endif
void App_TCBInitHook (OS_TCB *ptcb) {}
extern void app_1ms_callback(void);
void App_TimeTickHook()
{
#if defined(BOARD_SOLARIUM_WEB)
if (zummer_enabled)
{
if (zummer_timer) {zummer_timer--; SOLARIUM_ZUMMER_ON();}
else {SOLARIUM_ZUMMER_OFF();}
}
else
{
SOLARIUM_ZUMMER_OFF();
zummer_timer = 0;
}
#endif
#if defined(BOARD_SOLARIUM_VLAD)
app_1ms_callback();
#endif
}
/*!
Ñåðâåð îáðàáîòêè ñîáûòèé ïîëüçîâàòåëÿ
*/
void UserAppTask(void *p_arg)
{
int event;
UserStartupFunc();
#if defined(BOARD_CENTRAL_CARWASH)
CPU_INT32U temp;
static CPU_INT08U fr_conn_ctr = 0;
SelectFirstMenu();
{
CPU_INT32U m=0;
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
if (m)
{
EnabledChannelsNum = 0;
for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
{
CPU_INT32U en = 0;
GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
if (en) {EnabledChannelsNum++;}
}
UserMenuState = USER_STATE_ACCEPT_MONEY;
}
}
incassation = 0;
was_critical_error = 0;
GetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
if (temp == INCAS_SEND_FLAG)
{
PostModemTask(MODEM_TASK_SEND_INCAS);
}
#elif defined(BOARD_SOLARIUM_WEB)
app_state.state = APP_STATE_IDLE;
app_state.userinputtime = -1;
app_state.userinputmoney = -1;
SetMenu(WORK_MENU);
#elif defined(BOARD_SOLARIUM_VLAD)
AppInitVlad();
#endif
while (1)
{
if (GetUserEvent(&event))
{
#if defined(BOARD_SOLARIUM_VLAD)
if ((event == EVENT_KEY_START) &&
((GetCurrentMenu() == xReportMenuPanel) || (GetCurrentMenu() == zReportMenuPanel)
|| (GetCurrentMenu() == bufReportMenuPanel)
|| (GetCurrentMenu() == CanselCheckMenuPanel)
)
)
{
PrintReports();
}
else
{
AppVladEventProcess(event);
}
#else
switch (event){
#endif
#if defined(BOARD_SOLARIUM_WEB)
case EVENT_SYSTEM_REBOOT:
OSTimeDly(5000);
Reset();
break;
case EVENT_REQUEST_USER_INPUT:
if ((GetMode() == MODE_WORK) && (app_state.state == APP_STATE_IDLE))
{
app_state.userinputtime = -1;
app_state.userinputmoney = -1;
app_state.state = APP_STATE_USER_INPUT;
GetData(&SolariumTimeoutDesc, &app_state.timetoend, 0, DATA_FLAG_SYSTEM_INDEX);
SolariumStartUserInput();
PrintSolariumUserInputMenu();
}
break;
case EVENT_USER_INPUT_FINISHED:
app_state.userinputtime = SolariumFinishUserInput();
if ((app_state.state == APP_STATE_USER_INPUT) && (app_state.userinputtime > 0) &&
((app_state.timefromserver > 0)
|| ((app_state.moneyfromserver > 0) && (CalcTimeSecPerMoney(app_state.moneyfromserver) >= app_state.userinputtime))
)
)
{
if (app_state.moneyfromserver > 0)
{
CPU_INT32U price;
GetData(&SolariumPricePerMinDesc, &price, 0, DATA_FLAG_SYSTEM_INDEX);
app_state.userinputmoney = (CPU_INT32U)((float)(app_state.userinputtime * price) / 60.0);
}
app_state.state = APP_STATE_WAITING_ACK;
GetData(&SolariumTimeoutDesc, &app_state.timetoend, 0, DATA_FLAG_SYSTEM_INDEX);
PrintWaitingAckUserMenu();
}
else
{
app_state.state = APP_STATE_IDLE;
PrintSolariumFreeMenu();
}
break;
case EVENT_ACK_USER_INPUT:
if (app_state.state == APP_STATE_WAITING_ACK)
{
if ((app_state.userinputtime > 0) && (app_state.timefromserver > 0) || (app_state.moneyfromserver > 0))
{
CPU_INT32U pre_pause = 0;
GetData(&SolariumPauseDesc, &pre_pause, 0, DATA_FLAG_SYSTEM_INDEX);
if (pre_pause > 0)
{
app_state.state = APP_STATE_PRE_PAUSE;
app_state.timetoend = pre_pause;
}
else
{
if (app_state.timefromserver > 0)
{
app_state.timetoend = app_state.userinputtime;
}
else
{
app_state.timetoend = CalcTimeSecPerMoney(app_state.moneyfromserver);
}
app_state.state = APP_STATE_SUNBURN;
}
}
else
{
app_state.state = APP_STATE_IDLE;
}
}
break;
case EVENT_NACK_USER_INPUT:
if (app_state.state != APP_STATE_IDLE)
{
MenuCursorOff();
app_state.state = APP_STATE_IDLE;
app_state.timetoend = 0;
app_state.userinputtime = -1;
app_state.userinputmoney = -1;
show_blocking_msg = SHOW_BLOCKING_MSG_TIME;
PrintSolariumBlockingMessage();
}
break;
case EVENT_SHOW_ZERO_MONEY:
case EVENT_ABORT_OPERATIONS:
if (app_state.state != APP_STATE_IDLE)
{
MenuCursorOff();
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_OFF();
app_state.state = APP_STATE_IDLE;
app_state.timetoend = 0;
app_state.userinputtime = -1;
app_state.userinputmoney = -1;
PrintSolariumFreeMenu();
}
break;
case EVENT_SEC:
// ïðî÷èòàåì òåêóùåå âðåìÿ
SystemTime = GetTimeSec();
if (show_blocking_msg)
{
show_blocking_msg--;
PrintSolariumBlockingMessage();
}
if (!pass_edit)
{
if (app_state.state == APP_STATE_IDLE)
{
PrintSolariumFreeMenu();
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_OFF();
if (SystemTime - http_last_status_time > HTTP_SERVER_CONN_OK_TIMEOUT)
{
PrintServerDisconnectedMenu();
}
}
else if (app_state.state == APP_STATE_USER_INPUT)
{
if (app_state.timetoend > 0)
{
PrintSolariumUserInputMenu();
app_state.timetoend--;
}
else
{
app_state.state = APP_STATE_IDLE;
MenuCursorOff();
PrintSolariumFreeMenu();
}
}
else if (app_state.state == APP_STATE_WAITING_ACK)
{
if (app_state.timetoend > 0)
{
PrintWaitingAckUserMenu();
app_state.timetoend--;
}
else
{
app_state.state = APP_STATE_IDLE;
PrintSolariumFreeMenu();
SetMenu(WORK_MENU);
}
}
else if (app_state.state == APP_STATE_PRE_PAUSE)
{
if (app_state.timetoend)
{
PrintSolariumPrePauseMenu();
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_OFF();
app_state.timetoend--;
}
else
{
if (app_state.timefromserver > 0)
{
app_state.state = APP_STATE_SUNBURN;
app_state.timetoend = app_state.userinputtime;
IncCounter(0, app_state.userinputtime, 0, 0);
SaveEventRecord(0, JOURNAL_EVENT_START_SESSION, app_state.userinputtime);
//PrintSolariumSunburnMenu();
}
else if (app_state.moneyfromserver > 0)
{
app_state.state = APP_STATE_SUNBURN;
app_state.timetoend = app_state.userinputtime;
IncCounter(0, app_state.userinputtime, 0, 0);
SaveEventRecord(0, JOURNAL_EVENT_START_SESSION, app_state.userinputtime);
//PrintSolariumSunburnMenu();
}
else
{
app_state.state = APP_STATE_IDLE;
PrintSolariumFreeMenu();
SetMenu(WORK_MENU);
}
}
}
else if (app_state.state == APP_STATE_SUNBURN)
{
PrintSolariumSunburnMenu();
if (app_state.timetoend)
{
CPU_INT32U sol_type = 0;
GetData(&SolariumTypeDesc, &sol_type, 0, DATA_FLAG_SYSTEM_INDEX);
if (sol_type == 0)
{
SOLARIUM_LAMPS_ON();
SOLARIUM_VENT_OFF();
}
else
{
SOLARIUM_LAMPS_ON();
SOLARIUM_VENT_ON();
}
app_state.timetoend--;
}
else
{
CPU_INT32U vent_time = 0;
GetData(&SolariumVentilationTimeDesc, &vent_time, 0, DATA_FLAG_SYSTEM_INDEX);
if (vent_time > 0)
{
CPU_INT32U sol_type = 0;
GetData(&SolariumTypeDesc, &sol_type, 0, DATA_FLAG_SYSTEM_INDEX);
if (sol_type == 0)
{
SOLARIUM_LAMPS_ON();
SOLARIUM_VENT_OFF();
}
else
{
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_ON();
}
app_state.state = APP_STATE_VENTILATION;
app_state.timetoend = vent_time;
}
else
{
SOLARIUM_VENT_OFF();
SOLARIUM_LAMPS_OFF();
app_state.state = APP_STATE_IDLE;
}
SaveEventRecord(0, JOURNAL_EVENT_END_SESSION, app_state.userinputtime);
}
}
else if (app_state.state == APP_STATE_VENTILATION)
{
PrintSolariumVentilationMenu();
if (app_state.timetoend)
{
app_state.timetoend--;
CPU_INT32U sol_type = 0;
GetData(&SolariumTypeDesc, &sol_type, 0, DATA_FLAG_SYSTEM_INDEX);
if (sol_type == 0)
{
SOLARIUM_LAMPS_ON();
SOLARIUM_VENT_OFF();
}
else
{
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_ON();
}
}
else
{
SOLARIUM_LAMPS_OFF();
SOLARIUM_VENT_OFF();
app_state.state = APP_STATE_IDLE;
}
}
}
else
{
PrintSolariumPassMenu();
}
break;
case EVENT_KEY_STAR:
if (show_blocking_msg)
{
PrintSolariumBlockingMessage();
break;
}
if (app_state.state == APP_STATE_USER_INPUT)
{
app_state.state = APP_STATE_IDLE;
MenuCursorOff();
PrintSolariumFreeMenu();
}
else if ((GetMode() == MODE_WORK) && (app_state.state == APP_STATE_IDLE))
{
if (!pass_edit)
{
pass_edit = 1;
memset(pass_phrase, 0, sizeof(pass_phrase));
pass_phrase[0] = '*';
PrintSolariumPassMenu();
}
else
{
pass_edit = 0;
PrintSolariumFreeMenu();
}
}
break;
case EVENT_KEY_SHARP:
if (show_blocking_msg)
{
PrintSolariumBlockingMessage();
break;
}
if (app_state.state == APP_STATE_USER_INPUT)
{
CPU_INT32U mintime, maxtime;
CPU_INT32U usertime = SolariumGetUserInputTime();
GetData(&SolariumMinTimeDesc, &mintime, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&SolariumMaxTimeDesc, &maxtime, 0, DATA_FLAG_SYSTEM_INDEX);
if (usertime > maxtime * 60)
{
strcpy(message_lines[0], "ÌÀÊÑÈÌÀË.ÂÐÅÌß");
sprintf(message_lines[1], "ÇÀÃÀÐÀ %d ÌÈÍÓÒ", maxtime);
show_blocking_msg = SHOW_BLOCKING_MSG_TIME;
PrintSolariumBlockingMessage();
GetData(&SolariumTimeoutDesc, &app_state.timetoend, 0, DATA_FLAG_SYSTEM_INDEX);
SolariumStartUserInput();
MenuCursorOff();
}
else if (usertime < mintime * 60)
{
strcpy(message_lines[0], "ÌÈÍÈÌÀËÜÍ.ÂÐÅÌß");
sprintf(message_lines[1], "ÇÀÃÀÐÀ %d ÌÈÍÓÒ", mintime);
show_blocking_msg = SHOW_BLOCKING_MSG_TIME;
PrintSolariumBlockingMessage();
GetData(&SolariumTimeoutDesc, &app_state.timetoend, 0, DATA_FLAG_SYSTEM_INDEX);
SolariumStartUserInput();
MenuCursorOff();
}
else
{
PostUserEvent(EVENT_USER_INPUT_FINISHED);
}
}
else if ((GetMode() == MODE_WORK) && (app_state.state == APP_STATE_IDLE))
{
if (pass_edit)
{
if (strlen(pass_phrase) < 9)
{
pass_phrase[strlen(pass_phrase)] = '#';
PrintSolariumPassMenu();
OSTimeDly(500);
if (strcmp(pass_phrase, MODE_PASSWORD) == 0)
{
memset(pass_phrase, 0, sizeof(pass_phrase));
SetMode(MODE_SERVICE);
GoToMenu(SERVICE_MENU);
}
else
{
PrintSolariumPassMenu();
}
}
else
{
pass_edit = 0;
PrintSolariumFreeMenu();
}
}
}
break;
case EVENT_KEY_DIGIT0:
case EVENT_KEY_DIGIT1:
case EVENT_KEY_DIGIT2:
case EVENT_KEY_DIGIT3:
case EVENT_KEY_DIGIT4:
case EVENT_KEY_DIGIT5:
case EVENT_KEY_DIGIT6:
case EVENT_KEY_DIGIT7:
case EVENT_KEY_DIGIT8:
case EVENT_KEY_DIGIT9:
if (show_blocking_msg)
{
PrintSolariumBlockingMessage();
break;
}
if (app_state.state == APP_STATE_USER_INPUT)
{
user_input_str[user_input_pos[user_input_ctr]] = '0' + event - EVENT_KEY_DIGIT0;
user_input_ctr++;
user_input_ctr %= 4;
PrintSolariumUserInputMenu();
}
else if ((GetMode() == MODE_WORK) && (app_state.state == APP_STATE_IDLE))
{
if (pass_edit)
{
if (strlen(pass_phrase) < 9)
{
pass_phrase[strlen(pass_phrase)] = '0' + event - EVENT_KEY_DIGIT0;
PrintSolariumPassMenu();
}
else
{
pass_edit = 0;
PrintSolariumFreeMenu();
}
}
}
break;
#elif defined(BOARD_CENTRAL_CARWASH)
case EVENT_SEC:
// ïðîâåðêà ðåæèìà
CheckMode();
// ïðî÷èòàåì òåêóùåå âðåìÿ
SystemTime = GetTimeSec();
// ðàáî÷èé ñåðâåð - ñ÷åò÷èêè, ñîñòîÿíèÿ è ò.ï.
if (GetMode() == MODE_WORK)
{
WorkServer();
}
#if defined(BOARD_CENTRAL_CARWASH)
// ïðîâåðèì ôèñêàëüíèê, åñëè îí îòâàëèëñÿ
if ((++fr_conn_ctr % 10) == 0)
{
if ((FiscalConnState == FISCAL_NOCONN) || (TstCriticalFiscalError()))
{
if (ConnectFiscalFast() == 0)
{
CheckFiscalStatus();
}
}
}
#endif
// ñåðâåð îøèáîê
ErrorServer();
// äàëüøå òîëüêî â ðàáî÷åì ðåæèìå
if (GetMode() != MODE_WORK)
{
SelAllLeds(1);
break;
}
#if defined(BOARD_CENTRAL_CARWASH)
#if !APP_DEBUG
// åñëè åñòü îøèáêè, íå ðàáîòàåì
if (TstCriticalErrors())
{
UserPrintErrorMenu();
RefreshMenu();
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
// âûêëþ÷èì ïðèåì äåíåã, åñëè â ìåíþ ïðèåìà äåíåã
if (was_critical_error == 0)
{
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
CoinDisable();
was_critical_error = 1;
}
}
else
{
was_critical_error = 0;
}
break;
}
#endif
#endif
#if defined(BOARD_CENTRAL_CARWASH)
if (UserMenuState == USER_STATE_SELECT_POST)
{
// îáíîâëÿåì ïåðâóþ ñòðàíèöó
CoinDisable();
UserPrintSelectPostMenu();
RefreshMenu();
if (++blink_counter & 0x1)
{
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 0);
}
else
{
SetBacklight(LED_OK, 0);
SetBacklight(LED_CANSEL, 1);
}
}
else if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
// ïðèíèìàåì äåíüãè
UserPrintMoneyMenu();
RefreshMenu();
CheckFiscalStatus();
// âêëþ÷èì çàíîâî ïðèåì äåíåã, åñëè áûëà îøèáêà â ýòîì æå ìåíþ
if (was_critical_error)
{
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffff, ADDR_FL);
CoinEnable();
was_critical_error = 0;
}
}
else if (UserMenuState == USER_STATE_SHOW_THANKS)
{
// ïîêàçûâàåì "ÑÏÀÑÈÁÎ"
CoinDisable();
if (ThanksCtr)
{
UserPrintThanksMenu();
RefreshMenu();
ThanksCtr--;
}
else
{
SelectFirstMenu();
}
}
else if (UserMenuState == USER_STATE_SELECT_PAY_TYPE)
{
UserPrintSelectPayTypeMenu();
RefreshMenu();
}
else if (UserMenuState == USER_STATE_SELECT_MONEY)
{
UserPrintSelectMoneyMenu();
RefreshMenu();
}
else if (UserMenuState == USER_STATE_TERMINAL_REQUEST)
{
if (GetTermState() == TERM_STATE_DONE_PUR)
{
/// ïå÷àòü ÷åêà òåðìèíàëà
SetTermCommand(TERM_COMMAND_CLEAR_STATE, NULL);
TerminalMoney += GetAcceptedMoney();
SetAcceptedMoney(TerminalMoney);
SaveEventRecord(RecentChannel, JOURNAL_EVENT_CARD_ACCEPTED, TerminalMoney);
if (term_protocol() == TERMINAL_PROTOCOL_TTK2) PrintCardBill();
PostUserEvent(EVENT_KEY_START);
terminal_pay_flag = 1;
}
else if (GetTermState() == TERM_STATE_ERR_PUR)
{
SetTermCommand(TERM_COMMAND_CLEAR_STATE, NULL);
TerminalMoney = 0;
SaveEventRecord(RecentChannel, JOURNAL_EVENT_CARD_REJECTED, 0);
UserPrintPaymentErrorMenu();
RefreshMenu();
OSTimeDly(2000);
PostUserEvent(EVENT_KEY_CANSEL);
}
else
{
UserPrintTerminalRequestMenu();
RefreshMenu();
}
}
#endif
break;
#if defined(BOARD_CENTRAL_CARWASH)
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_UserMenu_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();
SelectFirstMenu();
break;
#endif
case EVENT_MODE_CHANGE:
ReInitMenu();
SaveEventRecord(0, JOURNAL_EVENT_CHANGE_MODE, GetMode());
if (GetMode() == MODE_SERVICE)
{
SelAllLeds(1);
}
else
{
SelAllLeds(0);
}
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);
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu();
RefreshMenu();
}
SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_COIN, money);
}
break;
case EVENT_BILL_ESCROW:
// êóïþðà â ïîëîæåíèè âîçâðàòà
if (UserMenuState != USER_STATE_ACCEPT_MONEY)
{
if (IsValidatorConnected()) if (!CC_CmdReturn(ADDR_FL)) SetErrorFlag(ERROR_VALIDATOR_CONN);
}
else
{
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);
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
UserPrintMoneyMenu();
RefreshMenu();
}
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL);
CoinEnable();
SaveEventRecord(RecentChannel, JOURNAL_EVENT_MONEY_NOTE, note);
IncBillnomCounter(billnom_index);
}
break;
#if defined(BOARD_CENTRAL_CARWASH)
case EVENT_KEY_POST1:
case EVENT_KEY_POST2:
case EVENT_KEY_POST3:
case EVENT_KEY_POST4:
case EVENT_KEY_POST5:
case EVENT_KEY_POST6:
case EVENT_KEY_POST7:
case EVENT_KEY_POST8:
if ((GetMode() != MODE_WORK) || (incassation)) break;
#if !APP_DEBUG
if (TstCriticalErrors())
{
UserPrintErrorMenu();
RefreshMenu();
break;
}
#endif
#if APP_DEBUG
if ((event == EVENT_KEY_POST5) && (UserMenuState == USER_STATE_ACCEPT_MONEY))
{
CPU_INT32U note,accmoney;
note = 100;
accmoney = GetAcceptedMoney();
accmoney += note;
SetAcceptedMoney(accmoney);
}
#endif
if (UserMenuState == USER_STATE_SELECT_MONEY)
{
GetData(&SelectedMoneyDesc, &TerminalMoney, event - EVENT_KEY_POST1, DATA_FLAG_DIRECT_INDEX);
UserMenuState = USER_STATE_TERMINAL_REQUEST;
uint32_t param[TERM_PARAM_COUNT];
param[0] = TerminalMoney;
SetTermCommand(TERM_COMMAND_PEND_PUR, param);
UserPrintTerminalRequestMenu();
RefreshMenu();
break;
}
if (CheckChannelEnabled(event - EVENT_KEY_POST1)
&& !ChannelBusy(event - EVENT_KEY_POST1))
{
if ((UserMenuState == USER_STATE_SELECT_POST)
|| ((UserMenuState == USER_STATE_ACCEPT_MONEY) && (GetAcceptedMoney() > 0)))
{
#if !APP_DEBUG
CPU_INT32U ip;
GetData(&PostIpAddrDesc, &ip, event - EVENT_KEY_POST1, DATA_FLAG_DIRECT_INDEX);
if (HostCheckIpDevice(ip, CONSOLE_TCP_DEFAULT_PORT, HOST_SOCKET_DEFAULT_TIMEOUT) != 0)
{
SaveEventRecord(event - EVENT_KEY_POST1, JOURNAL_EVENT_POST_UNAVIABLE, 0);
UserPrintIpDeviceErrMenu(event - EVENT_KEY_POST1);
RefreshMenu();
OSTimeDly(1000);
break;
}
else
#endif
{
RecentChannel = event - EVENT_KEY_POST1;
PostUserEvent(EVENT_KEY_START);
UserMenuState = USER_STATE_FINISH_PAYMENT;
}
}
break;
}
break;
#endif
case EVENT_KEY_CANSEL:
if ((GetMode() != MODE_WORK)
#if defined(BOARD_CENTRAL_CARWASH)
|| (incassation)
#endif
) break;
#if !APP_DEBUG
if (TstCriticalErrors())
{
UserPrintErrorMenu();
RefreshMenu();
break;
}
#endif
if (UserMenuState == USER_STATE_SELECT_PAY_TYPE)
{
#ifdef BOARD_SWAP_OK_CANSEL
UserMenuState = USER_STATE_ACCEPT_MONEY;
UserPrintMoneyMenu();
RefreshMenu();
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL);
CoinEnable();
#else
UserMenuState = USER_STATE_SELECT_MONEY;
UserPrintSelectMoneyMenu();
RefreshMenu();
#endif
break;
}
if (UserMenuState == USER_STATE_TERMINAL_REQUEST)
{
SetTermCommand(TERM_COMMAND_ABORT_PUR, NULL);
SelectFirstMenu();
break;
}
if (UserMenuState == USER_STATE_ACCEPT_MONEY)
{
CPU_INT32U term_en = 0, validator_en = 0, coin_en = 0;
GetData(&EnableTerminalDesc, &term_en, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&EnableValidatorDesc, &validator_en, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&EnableCoinDesc, &coin_en, 0, DATA_FLAG_SYSTEM_INDEX);
if (term_en)
{
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
CoinDisable();
SelectFirstMenu();
}
break;
}
break;
case EVENT_KEY_START:
#if defined(BOARD_CENTRAL_CARWASH)
if (incassation) break;
#endif
if (GetMode() != MODE_WORK)
{
PrintReports();
break;
}
#if !APP_DEBUG
if (TstCriticalErrors())
{
UserPrintErrorMenu();
RefreshMenu();
break;
}
#endif
if (UserMenuState == USER_STATE_SELECT_PAY_TYPE)
{
#ifdef BOARD_SWAP_OK_CANSEL
UserMenuState = USER_STATE_SELECT_MONEY;
UserPrintSelectMoneyMenu();
RefreshMenu();
#else
UserMenuState = USER_STATE_ACCEPT_MONEY;
UserPrintMoneyMenu();
RefreshMenu();
if (IsValidatorConnected()) CC_CmdBillType(0xffffff, 0xffffffff, ADDR_FL);
CoinEnable();
#endif
break;
}
if (UserMenuState == USER_STATE_TERMINAL_REQUEST)
{
if (GetAcceptedMoney() > 0)
{
UserMenuState = USER_STATE_SELECT_POST;
UserPrintSelectPostMenu();
RefreshMenu();
CoinDisable();
break;
}
}
// --------------------------
// íàõîäèìñÿ â ðàáî÷åì ðåæèìå
// --------------------------
#if defined(BOARD_CENTRAL_CARWASH)
if (UserMenuState == USER_STATE_FINISH_PAYMENT)
{
// ïîëüçîâàòåëü âíåñ äåíüãè è íàæàë ÑÒÀÐÒ
CPU_INT32U price = 1, accmoney;
CPU_INT32U post_timer;
GetData(&PostMinutePriceDesc, &price, RecentChannel, DATA_FLAG_DIRECT_INDEX);
accmoney = GetAcceptedMoney();
GetData(&PostTimerDesc, &post_timer, RecentChannel, DATA_FLAG_DIRECT_INDEX);
if (post_timer == 0)
{
ChannelsPayedTime[RecentChannel] = (accmoney * 60) / price;
}
else
{
ChannelsPayedTime[RecentChannel] = post_timer * accmoney;
}
if (ChannelsPayedTime[RecentChannel] > 0)
{
// îòïðàâèì êîìàíäó íà èñïîëíèòåëüíîå óñòðîéñòâî
CPU_INT32U ip;
CPU_INT32U len_ms,len_pause_ms, imp_cost, imp_pause;
GetData(&PostIpAddrDesc, &ip, RecentChannel, DATA_FLAG_DIRECT_INDEX);
GetData(&PostImpCostDesc, &imp_cost, RecentChannel, DATA_FLAG_DIRECT_INDEX);
GetData(&PostLenCostDesc, &len_ms, RecentChannel, DATA_FLAG_DIRECT_INDEX);
GetData(&PostPauseLenCostDesc, &len_pause_ms, RecentChannel, DATA_FLAG_DIRECT_INDEX);
GetData(&PostPauseDesc, &imp_pause, RecentChannel, DATA_FLAG_DIRECT_INDEX);
GetData(&PostTimerDesc, &post_timer, RecentChannel, DATA_FLAG_DIRECT_INDEX);
#if !APP_DEBUG
if (post_timer == 0)
{
if (HostWritePulses(ip, accmoney / imp_cost, len_ms, len_pause_ms, imp_pause, post_timer) != 0)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_POST_UNAVIABLE, 0);
UserPrintIpDeviceErrMenu(RecentChannel);
RefreshMenu();
OSTimeDly(1000);
if (terminal_pay_flag) UserMenuState = USER_STATE_SELECT_POST;
else UserMenuState = USER_STATE_ACCEPT_MONEY;
break;
}
}
else
{
if (HostWritePulses(ip, accmoney, 0, 0, imp_pause, post_timer) != 0)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_POST_UNAVIABLE, 0);
UserPrintIpDeviceErrMenu(RecentChannel);
RefreshMenu();
OSTimeDly(1000);
if (terminal_pay_flag) UserMenuState = USER_STATE_SELECT_POST;
else UserMenuState = USER_STATE_ACCEPT_MONEY;
break;
}
}
#endif
// âûêëþ÷èì êóïþðîïðèåìíèê
if (IsValidatorConnected()) CC_CmdBillType(0x000000, 0x000000, ADDR_FL);
CoinDisable();
// íàïå÷àòàåì ÷åê
if (IsFiscalConnected())
{
CPU_INT32U format;
char service_name[48];
GetData(&BillFormatDesc, &format, 0, DATA_FLAG_SYSTEM_INDEX);
GetDataStr(&ServiceNameDesc, (CPU_INT08U*)service_name, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&service_name[strlen(service_name)], " ïîñò %d", RecentChannel + 1);
if (format == 0)
{
strcat(service_name, ", ìèí.");
}
if (PrintFiscalBill(accmoney, ChannelsPayedTime[RecentChannel], terminal_pay_flag, service_name, price) == 0)
{
SaveEventRecord(RecentChannel, JOURNAL_EVENT_PRINT_BILL, GetTimeSec());
}
else
{
// îøèáêà ïå÷àòè ÷åêà
}
}
IncCounter(RecentChannel, ChannelsPayedTime[RecentChannel], accmoney, terminal_pay_flag);
SetAcceptedMoney(0);
terminal_pay_flag = 0;
// êàíàë áëîêèðóåì ïðè ñîîòâåòñòâóþùåé íàñòðîéêå
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, RecentChannel, DATA_FLAG_DIRECT_INDEX);
if (protect_en)
{
ChannelsState[RecentChannel] = CHANNEL_STATE_BUSY;
ChannelsCounters[RecentChannel] = ChannelsPayedTime[RecentChannel] + imp_pause;
}
// ñîõðàíÿåì çàïèñü ñîáûòèÿ
SaveEventRecord(RecentChannel, JOURNAL_EVENT_START_SESSION, ChannelsPayedTime[RecentChannel]);
// ïîâåñèì ìåíþ "ÑÏÀÑÈÁÎ"
last_money = accmoney;
last_post = RecentChannel;
UserPrintThanksMenu();
RefreshMenu();
UserMenuState = USER_STATE_SHOW_THANKS;
ThanksCtr = 4;
}
else
{ // äåíåã íåäîñòàòî÷íî äëÿ ðàáîòû
}
break;
}
#endif
break;
case EVENT_REREAD_SIGNAL_LEVEL:
#if !APP_DEBUG
{
CPU_INT32U en;
GetData(&EnableChannelDesc, &en, ChannelIndex, DATA_FLAG_DIRECT_INDEX);
if (en)
{
CPU_INT32U ip;
GetData(&PostIpAddrDesc, &ip, ChannelIndex, DATA_FLAG_DIRECT_INDEX);
char param_str[16];
if (HostReadParam(ip, CONSOLE_TCP_DEFAULT_PORT, "SIGNAL", param_str, 16, 500) == 0)
{
int value = -1;
if ((sscanf(param_str, "%d\n", &value) == 1) && ((value == 0) || (value == 1)))
{
CPU_INT32U signal = value;
WriteArrayFram(offsetof(TFramMap, ChannelConfig.signal) + ChannelIndex*sizeof(CPU_INT32U), sizeof(CPU_INT32U), (unsigned char*)&signal);
}
PostStatus[ChannelIndex] = 1;
}
else
{
PostStatus[ChannelIndex] = 0;
}
}
else
{
PostStatus[ChannelIndex] = 0;
}
}
#endif
break;
#elif defined(BOARD_POST_CARWASH)
case EVENT_SEC:
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
int count;
OS_ENTER_CRITICAL();
if (app_timer_value == 0)
{
if (pre_pause_counter) pre_pause_counter--;
}
else
{
if (pre_pause_counter)
{
pre_pause_counter--;
}
else
{
if (out_timer_counter)
{
out_timer_counter--;
if (config_ram->signal) FIO0SET_bit.P0_24= 1;
else FIO0CLR_bit.P0_24= 1;
}
else
{
if (out_pulse_count)
{
// îáíîâëÿåì îòñ÷åò
out_timer_counter = app_timer_value;
if (config_ram->signal) FIO0SET_bit.P0_24= 1;
else FIO0CLR_bit.P0_24= 1;
out_pulse_count--;
}
else
{
// êîíåö äëèòåëüíîñòè
if (config_ram->signal) FIO0CLR_bit.P0_24= 1;
else FIO0SET_bit.P0_24= 1;
app_timer_value = 0;
out_timer_counter = 0;
}
if (out_timer_counter) out_timer_counter--;
}
}
}
count = out_pulse_count;
OS_EXIT_CRITICAL();
if (app_timer_value == 0)
{
if (count > 0)
{
if (GetKbrdState() & (1UL << KEY_START))
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
pre_pause_counter = 0;
OS_EXIT_CRITICAL();
}
if (pre_pause_counter == 0)
{
PostUserEvent(EVENT_PULSEOUT);
}
}
}
test_counter++;
}
break;
case EVENT_KEY_START:
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
pre_pause_counter = 0;
OS_EXIT_CRITICAL();
PostUserEvent(EVENT_PULSEOUT);
break;
}
case EVENT_PULSEOUT:
{
if ((app_timer_value == 0) && (!pre_pause_counter))
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
int count, len_ms, len_pause_ms;
OS_ENTER_CRITICAL();
count = out_pulse_count;
len_ms = out_pulse_len;
len_pause_ms = out_pulse_pause_len;
OS_EXIT_CRITICAL();
if (count <= 0)
{
break;
}
do
{
OS_ENTER_CRITICAL();
count = out_pulse_count;
len_ms = out_pulse_len;
len_pause_ms = out_pulse_pause_len;
OS_EXIT_CRITICAL();
if (config_ram->signal) FIO0SET_bit.P0_24= 1;
else FIO0CLR_bit.P0_24= 1;
OSTimeDly(len_ms);
if (config_ram->signal) FIO0CLR_bit.P0_24= 1;
else FIO0SET_bit.P0_24= 1;
OSTimeDly(len_pause_ms);
if (count)
{
OS_ENTER_CRITICAL();
out_pulse_count--;
count = out_pulse_count;
OS_EXIT_CRITICAL();
}
} while (count);
}
else
{
test_counter = 0;
}
}
break;
#endif
#if !defined(BOARD_SOLARIUM_VLAD)
default:
break;
}
#endif
}
else
{
OSTimeDly(1);
}
}
}
void StartUserApplication(void)
{
// ñîçäàäèì î÷åðåäü è çàäà÷ó
if (UserQuery == NULL)
{
INT8U err;
UserQuery = OSQCreate(&UserTbl[0], USER_QUERY_LEN);
OSTaskCreate(UserAppTask, (void *)0, (OS_STK *)&UserTaskStk[USER_TASK_STK_SIZE-1], USER_TASK_PRIO);
OSTaskNameSet(USER_TASK_PRIO, "app_serv Task", &err);
}
}
/*!
Ïîëüçîâàòåëüñêàÿ èíèöèàëèçàöèÿ
*/
void UserStartupFunc(void)
{
#if defined(BOARD_SOLARIUM_VLAD)
InitControls();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
// èíèöèàëèçàöèÿ ðåæèìà ðàáîòû
InitMode();
// èíèöèàëèçàöèÿ äàííûõ
CheckAllData();
#endif
JournalInit();
#if defined(CONFIG_MUSIC_ENABLE)
player_init();
#endif
#if defined(CONFIG_SDCARD_ENABLE)
sd_init();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_VLAD)
InitPrecheckText();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
OnChangeInitByDefault();
#endif
#if defined(BOARD_CENTRAL_CARWASH)
CheckKeysCorrect();
OnChangeKeyAction();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
CheckLongCounters();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_VLAD)
// âîññòàíîâèì äåíüãè
LoadAcceptedMoney();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
// ïðîâåðèì ïàðîëü
InitPass();
#endif
#if defined(BOARD_SOLARIUM_WEB)
// âêëþ÷åíèå ëàìï
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;
// âåíòèëÿöèÿ
PINSEL1_bit.P0_23 = 0x0;
PINMODE1_bit.P0_23 = 0;
FIO0DIR_bit.P0_23 = 1;
FIO0MASK_bit.P0_23 = 0;
FIO0CLR_bit.P0_23 = 1;
// çóììåð
PINSEL3_bit.P1_21 = 0x0;
PINMODE3_bit.P1_21 = 0;
FIO1DIR_bit.P1_21 = 1;
FIO1MASK_bit.P1_21 = 0;
FIO1SET_bit.P1_21 = 1;
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
InitMenu();
OSTimeDly(1000);
#endif
#if defined(BOARD_SOLARIUM_VLAD)
LoadControlChannels();
#endif
#if defined(CONFIG_MUSIC_ENABLE)
InitMusicTask();
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_VLAD)
// çàïóñòèì âàëèäàòîð
StartUpValidator();
OSTimeDly(1000);
CPU_INT32U sound_type;
GetData(&SoundTypeDesc, &sound_type, 0, DATA_FLAG_SYSTEM_INDEX);
#if defined(CONFIG_MUSIC_ENABLE)
if (sound_type == 1)
{
PlayMusicFile(MUSIC_FILE_HARDWARE_CHECKOUT);
}
else if (sound_type == 2)
{
CPU_INT32U ctr = 30;
while (ctr--)
{
PlayMusicFile(MUSIC_FILE_HARDWARE_CHECKOUT);
if (player_conn) break;
OSTimeDly(3000);
}
}
#endif
OSTimeDly(9000);
InitFiscal();
#endif
#if defined(CONFIG_SCORE_ENABLE)
InitScoreTask();
#endif
// ïðîèíèöèàëèçèðóåì ÷àñû
InitRTC();
OSTimeDly(1100);
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_WEB) || defined(BOARD_SOLARIUM_VLAD)
// ñäåëàåì çàïèñü î âêëþ÷åíèè
SaveEventRecord(0, JOURNAL_EVENT_DEVICE_ON, GetTimeSec());
#endif
// èíèöèàëèçàöèÿ ìîäåìà
#ifdef CONFIG_MODEM_ENABLE
if (InitModem() != 0)
{
SetErrorFlag(ERROR_MODEM_CONN);
}
else
{
ClrErrorFlag(ERROR_MODEM_CONN);
}
#endif
#if defined(BOARD_CENTRAL_CARWASH) || defined(BOARD_SOLARIUM_VLAD)
// çàïóñòèì ìîíåòíèê
InitCoin();
#endif
SystemTime = GetTimeSec();
#if defined(BOARD_POST_CARWASH)
PINSEL1_bit.P0_24 = 0x0;
PINMODE1_bit.P0_24 = 0;
FIO0DIR_bit.P0_24 = 1;
FIO0MASK_bit.P0_24 = 0;
if (config_ram->signal) FIO0CLR_bit.P0_24= 1;
else FIO0SET_bit.P0_24= 1;
#endif
#ifdef CONFIG_WEB_INTERFACE
httpd_init();
#endif
#if defined(CONFIG_TCP_CONSOLE)
InitConsole();
#endif
#if defined(CONFIG_TERMINAL_ENABLE)
InitTerminalApp();
#endif
#if defined(BOARD_CENTRAL_CARWASH)
if (GetMode() == MODE_WORK) {SetMenu(WORK_MENU);}
else SetMenu(SERVICE_MENU);
#elif defined(BOARD_SOLARIUM_VLAD)
CPU_INT32U en_pass = 0;
GetData(&EnableGlobalPassDesc, &en_pass, 0, DATA_FLAG_SYSTEM_INDEX);
if (en_pass)
{
start_pass_ok = 0;
SetMenu(START_PASS_MENU);
}
else
{
start_pass_ok = 1;
if (GetMode() == MODE_WORK) {SetMenu(WORK_MENU);}
else SetMenu(SERVICE_MENU);
}
#elif defined(BOARD_SOLARIUM_WEB)
SetMenu(SERVICE_MENU);
OnZummerEnabledChange();
http_last_status_time = SystemTime;
#endif
}
int GetUserEvent(int* event)
{
CPU_INT08U err = 0;
int evt = (int)OSQPend(UserQuery, 1, &err);
if (err != 0) return 0;
*event = evt;
return 1;
}
void PostUserEvent(int event)
{
OSQPost(UserQuery, (void *)event);
}
void InitUserMenu(void)
{
for (int i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U en = 0;
GetData(&EnableChannelDesc, &en, i, DATA_FLAG_DIRECT_INDEX);
if (en)
{
ChannelsState[i] = CHANNEL_STATE_FREE;
}
else
{
ChannelsState[i] = CHANNEL_STATE_DISABLED;
}
}
#if defined(BOARD_SOLARIUM_WEB)
if (pass_edit)
{
SetMode(MODE_WORK);
pass_edit = 0;
}
#endif
}
void UserPrintMoneyMenu(void)
{
char buf[32];
CPU_INT32U accmoney;
accmoney = GetAcceptedMoney();
EnabledChannelsNum = 0;
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U ch_en = 0;
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableChannelDesc, &ch_en, i, DATA_FLAG_DIRECT_INDEX);
if ((ch_en) && !((ChannelsState[i] == CHANNEL_STATE_BUSY) && (protect_en)))
{
EnabledChannelsNum++;
if (accmoney > 0) SetBacklight(LED_POST1 + i, 1);
else SetBacklight(LED_POST1 + i, 0);
}
else
{
SetBacklight(LED_POST1 + i, 0);
}
}
if (EnabledChannelsNum == 0)
{
// íåò âêëþ÷åííûõ êàíàëîâ - ðàáîòà íåâîçìîæíà
sprintf(buf, "");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÂÑÅ ÏÎÑÒÛ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÇÀÍßÒÛ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
if (++blink_counter & 0x1)
{
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 0);
}
else
{
SetBacklight(LED_OK, 0);
SetBacklight(LED_CANSEL, 1);
}
return;
}
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 1);
sprintf(buf, " Âíåñèòå äåíüãè");
PrintUserMenuStr(buf, 0);
sprintf(buf, " è âûáåðèòå ïîñò");
PrintUserMenuStr(buf, 1);
accmoney = GetAcceptedMoney();
sprintf(buf, " Ïðèíÿòî %d ðóá.", accmoney);
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
void UserPrintSelectMoneyMenu()
{
CPU_INT32U money[2];
char buf[32];
int len;
int row = 0;
EnabledChannelsNum = 0;
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U ch_en = 0;
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableChannelDesc, &ch_en, i, DATA_FLAG_DIRECT_INDEX);
if ((ch_en) && !((ChannelsState[i] == CHANNEL_STATE_BUSY) && (protect_en)))
{
EnabledChannelsNum++;
//SetBacklight(LED_POST1 + i, 1);
}
else
{
//SetBacklight(LED_POST1 + i, 0);
}
}
if (EnabledChannelsNum == 0)
{
// íåò âêëþ÷åííûõ êàíàëîâ - ðàáîòà íåâîçìîæíà
sprintf(buf, "");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÂÑÅ ÏÎÑÒÛ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÇÀÍßÒÛ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
if (++blink_counter & 0x1)
{
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 0);
}
else
{
SetBacklight(LED_OK, 0);
SetBacklight(LED_CANSEL, 1);
}
return;
}
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 1);
GetData(&SelectedMoneyDesc, &money[0], 3, DATA_FLAG_DIRECT_INDEX);
GetData(&SelectedMoneyDesc, &money[1], 7, DATA_FLAG_DIRECT_INDEX);
if (money[0] || money[1])
{
memset(buf, 0, 32);
sprintf(buf, "4-%dð.", money[0]);
len = strlen(buf);
if (len < 9)
{
memset(&buf[len], ' ', 9 - len);
}
sprintf(&buf[9], "8-%dð.", money[1]);
len = strlen(buf);
if (len < 19)
{
memset(&buf[len], ' ', 19 - len);
}
PrintUserMenuStr(buf, 3);
SetBacklight(LED_POST4, (money[0] != 0));
SetBacklight(LED_POST8, (money[1] != 0));
}
else
{
sprintf(buf, " ÂÛÁÎÐ ÑÓÌÌÛ");
PrintUserMenuStr(buf, 0);
row = 1;
}
GetData(&SelectedMoneyDesc, &money[0], 0, DATA_FLAG_DIRECT_INDEX);
GetData(&SelectedMoneyDesc, &money[1], 4, DATA_FLAG_DIRECT_INDEX);
memset(buf, 0, 32);
sprintf(buf, "1-%dð.", money[0]);
len = strlen(buf);
if (len < 9)
{
memset(&buf[len], ' ', 9 - len);
}
sprintf(&buf[9], "5-%dð.", money[1]);
len = strlen(buf);
if (len < 19)
{
memset(&buf[len], ' ', 19 - len);
}
PrintUserMenuStr(buf, row++);
SetBacklight(LED_POST1, (money[0] != 0));
SetBacklight(LED_POST5, (money[1] != 0));
GetData(&SelectedMoneyDesc, &money[0], 1, DATA_FLAG_DIRECT_INDEX);
GetData(&SelectedMoneyDesc, &money[1], 5, DATA_FLAG_DIRECT_INDEX);
memset(buf, 0, 32);
sprintf(buf, "2-%dð.", money[0]);
len = strlen(buf);
if (len < 9)
{
memset(&buf[len], ' ', 9 - len);
}
sprintf(&buf[9], "6-%dð.", money[1]);
len = strlen(buf);
if (len < 19)
{
memset(&buf[len], ' ', 19 - len);
}
PrintUserMenuStr(buf, row++);
SetBacklight(LED_POST2, (money[0] != 0));
SetBacklight(LED_POST6, (money[1] != 0));
GetData(&SelectedMoneyDesc, &money[0], 2, DATA_FLAG_DIRECT_INDEX);
GetData(&SelectedMoneyDesc, &money[1], 6, DATA_FLAG_DIRECT_INDEX);
memset(buf, 0, 32);
sprintf(buf, "3-%dð.", money[0]);
len = strlen(buf);
if (len < 9)
{
memset(&buf[len], ' ', 9 - len);
}
sprintf(&buf[9], "7-%dð.", money[1]);
len = strlen(buf);
if (len < 19)
{
memset(&buf[len], ' ', 19 - len);
}
PrintUserMenuStr(buf, row++);
SetBacklight(LED_POST3, (money[0] != 0));
SetBacklight(LED_POST7, (money[1] != 0));
}
void UserPrintSelectPayTypeMenu(void)
{
char buf[32];
EnabledChannelsNum = 0;
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U ch_en = 0;
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableChannelDesc, &ch_en, i, DATA_FLAG_DIRECT_INDEX);
if ((ch_en) && !((ChannelsState[i] == CHANNEL_STATE_BUSY) && (protect_en)))
{
EnabledChannelsNum++;
SetBacklight(LED_POST1 + i, 0);
}
else
{
SetBacklight(LED_POST1 + i, 0);
}
}
if (EnabledChannelsNum == 0)
{
// íåò âêëþ÷åííûõ êàíàëîâ - ðàáîòà íåâîçìîæíà
sprintf(buf, "");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÂÑÅ ÏÎÑÒÛ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÇÀÍßÒÛ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
if (++blink_counter & 0x1)
{
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 0);
}
else
{
SetBacklight(LED_OK, 0);
SetBacklight(LED_CANSEL, 1);
}
return;
}
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 1);
sprintf(buf, " ÂÀÐÈÀÍÒÛ ÎÏËÀÒÛ");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ");
PrintUserMenuStr(buf, 1);
#ifdef BOARD_SWAP_OK_CANSEL
sprintf(buf, "ÍÀËÈ×ÍÛÅ ÏÎ ÊÀÐÒÅ");
#else
sprintf(buf, "ÏÎ ÊÀÐÒÅ ÍÀËÈ×ÍÛÅ");
#endif
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
void UserPrintTerminalRequestMenu()
{
char buf[32];
SetBacklight(LED_POST1, 1);
SetBacklight(LED_POST2, 1);
SetBacklight(LED_POST3, 1);
SetBacklight(LED_POST4, 1);
SetBacklight(LED_POST5, 1);
SetBacklight(LED_POST6, 1);
SetBacklight(LED_POST7, 1);
SetBacklight(LED_POST8, 1);
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 1);
sprintf(buf, "ÎÏËÀÒÀ %d ðóáëåé...", TerminalMoney);
PrintUserMenuStr(buf, 0);
CPU_INT32U proto;
GetData(&TerminalProtocolDesc, &proto, 0, DATA_FLAG_SYSTEM_INDEX);
if (proto == TERMINAL_PROTOCOL_TTK2)
{
sprintf(buf, " Âñòàâüòå ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " áàíêîâñêóþ êàðòó");
PrintUserMenuStr(buf, 2);
sprintf(buf, " â êàðòîïðèåìíèê");
PrintUserMenuStr(buf, 3);
}
else // if (proto == TERMINAL_PROTOCOL_VTK)
{
sprintf(buf, " Ïîäíåñèòå");
PrintUserMenuStr(buf, 1);
sprintf(buf, " áàíêîâñêóþ êàðòó");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ê ñ÷èòûâàòåëþ");
PrintUserMenuStr(buf, 3);
}
}
void UserPrintIpDeviceErrMenu(CPU_INT08U post)
{
char buf[32];
sprintf(buf, " ");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÏÎÑÒ %d", post + 1);
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÍÅÄÎÑÒÓÏÅÍ");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
// âûâîä ìåíþ î íåâîçìîæîñòè ðàáîòû
void UserPrintResultMenu(void)
{
char buf[32];
if (TstErrorFlag(ERROR_FR_CONN))
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÍÅÒ ÑÂßÇÈ Ñ ÔÐ");
PrintUserMenuStr(buf, 1);
sprintf(buf, "");
PrintUserMenuStr(buf, 2);
PrintUserMenuStr(buf, 3);
}
else if (TstCriticalFiscalError())
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
CPU_INT08U errcode = 0;
sprintf(buf, "ÎØÈÁÊÀ ÔÐ");
PrintUserMenuStr(buf, 1);
GetFirstCriticalFiscalError(&errcode);
GetDataItem(&JournalErrorNumberDesc0, (CPU_INT08U*)buf, errcode);
PrintUserMenuStr(buf, 2);
GetDataItem(&JournalErrorNumberDesc1, (CPU_INT08U*)buf, errcode);
PrintUserMenuStr(buf, 3);
}
else
{
sprintf(buf, " ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÊÎÌÀÍÄÀ");
PrintUserMenuStr(buf, 1);
sprintf(buf, "ÂÛÏÎËÍÅÍÀ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
}
}
// âûâîä ìåíþ î íåâîçìîæîñòè ðàáîòû
void UserPrintErrorMenu(void)
{
char buf[32];
if (TstErrorFlag(ERROR_VALIDATOR_CONN) || TstCriticalValidatorErrors())
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÊÓÏÞÐÎÏÐÈÅÌÍÈÊÀ");
PrintUserMenuStr(buf, 1);
if (TstErrorFlag(ERROR_VALIDATOR_CONN))
{
sprintf(buf, "ÍÅÒ ÑÂßÇÈ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
}
}
else if (TstErrorFlag(ERROR_FR_CONN))
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÍÅÒ ÑÂßÇÈ Ñ ÔÐ");
PrintUserMenuStr(buf, 1);
sprintf(buf, "");
PrintUserMenuStr(buf, 2);
PrintUserMenuStr(buf, 3);
}
else if (TstCriticalFiscalError())
{
sprintf(buf, "ÎØÈÁÊÀ");
PrintUserMenuStr(buf, 0);
CPU_INT08U errcode = 0;
sprintf(buf, "ÎØÈÁÊÀ ÔÐ");
PrintUserMenuStr(buf, 1);
GetFirstCriticalFiscalError(&errcode);
GetDataItem(&JournalErrorNumberDesc0, (CPU_INT08U*)buf, errcode);
PrintUserMenuStr(buf, 2);
GetDataItem(&JournalErrorNumberDesc1, (CPU_INT08U*)buf, errcode);
PrintUserMenuStr(buf, 3);
}
/*
else if (!FReportTest())
{
sprintf(buf, "ÏÅ×ÀÒb ÎÒ×ÅÒÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, "ÆÄÈÒÅ");
PrintUserMenuStr(buf, 1);
sprintf(buf, "ÏÐÈÍÒÅÐ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "ÍÅÄÎÑÒÓÏÅÍ");
PrintUserMenuStr(buf, 3);
}
*/
}
int CheckChannelEnabled(CPU_INT08U channel)
{
CPU_INT32U en = 0;
GetData(&EnableChannelDesc, &en, channel, DATA_FLAG_DIRECT_INDEX);
if (en)
{
return 1;
}
return 0;
}
void WorkServer(void)
{
for (CPU_INT08U i=0; i<CHANNELS_NUM; i++)
{
switch (ChannelsState[i])
{
case CHANNEL_STATE_FREE:
if ((UserMenuState != USER_STATE_ACCEPT_MONEY) && (UserMenuState != USER_STATE_SELECT_MONEY) && (UserMenuState != USER_STATE_TERMINAL_REQUEST)
&& !(ChannelsState[i] == CHANNEL_STATE_BUSY))
{
if (GetMode() != MODE_WORK) SetBacklight(LED_POST1 + i, 1);
}
break;
case CHANNEL_STATE_DISABLED:
if ((UserMenuState != USER_STATE_ACCEPT_MONEY) && (UserMenuState != USER_STATE_SELECT_MONEY) && (UserMenuState != USER_STATE_TERMINAL_REQUEST))
{
if (GetMode() != MODE_WORK) SetBacklight(LED_POST1 + i, 0);
}
break;
case CHANNEL_STATE_BUSY:
if ((UserMenuState != USER_STATE_ACCEPT_MONEY) && (UserMenuState != USER_STATE_SELECT_MONEY) && (UserMenuState != USER_STATE_TERMINAL_REQUEST))
{
if (GetMode() != MODE_WORK) SetBacklight(LED_POST1 + i, 0);
}
if (ChannelsCounters[i]) ChannelsCounters[i]--;
if (!ChannelsCounters[i])
{
ChannelsState[i] = CHANNEL_STATE_FREE;
// çàïèøåì ñîáûòèå
SaveEventRecord(i, JOURNAL_EVENT_END_SESSION, GetTimeSec());
}
break;
}
}
}
void UserPrintThanksMenu(void)
{
char buf[32];
sprintf(buf, " ÏÎÑÒ %d", last_post + 1);
PrintUserMenuStr(buf, 0);
sprintf(buf, " Îïëàòà %d ðóá.", last_money);
PrintUserMenuStr(buf, 1);
sprintf(buf, " Ïðèíÿòà");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
void UserPrintPaymentErrorMenu(void)
{
char buf[32];
sprintf(buf, " ");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÎÒÊÀÇ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
void UserPrintAbonementPaymentErrorMenu(void)
{
char buf[32];
sprintf(buf, " Ïî ýòîé ÊÀÐÒÅ ÇÀÃÀÐÀ");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ñåãîäíÿ ïîñåùåíèÿ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " èñ÷åðïàíû");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
int ChannelBusy(CPU_INT08U ch)
{
CPU_INT32U ch_en = 0;
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, ch, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableChannelDesc, &ch_en, ch, DATA_FLAG_DIRECT_INDEX);
if ((ch_en) && ((ChannelsState[ch] == CHANNEL_STATE_BUSY) && (protect_en)))
{
return 1;
}
return 0;
}
void UserPrintSelectPostMenu(void)
{
char buf[32];
EnabledChannelsNum = 0;
for (CPU_INT08U i = 0; i < CHANNELS_NUM; i++)
{
CPU_INT32U ch_en = 0;
CPU_INT32U protect_en = 0;
GetData(&SelectProtectDesc, &protect_en, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableChannelDesc, &ch_en, i, DATA_FLAG_DIRECT_INDEX);
if ((ch_en) && !((ChannelsState[i] == CHANNEL_STATE_BUSY) && (protect_en)))
{
EnabledChannelsNum++;
SetBacklight(LED_POST1 + i, 1);
}
else
{
SetBacklight(LED_POST1 + i, 0);
}
}
if (EnabledChannelsNum == 0)
{
// íåò âêëþ÷åííûõ êàíàëîâ - ðàáîòà íåâîçìîæíà
sprintf(buf, "");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÂÑÅ ÏÎÑÒÛ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÇÀÍßÒÛ");
PrintUserMenuStr(buf, 2);
sprintf(buf, "");
PrintUserMenuStr(buf, 3);
if (++blink_counter & 0x1)
{
SetBacklight(LED_OK, 1);
SetBacklight(LED_CANSEL, 0);
}
else
{
SetBacklight(LED_OK, 0);
SetBacklight(LED_CANSEL, 1);
}
return;
}
sprintf(buf, " ");
PrintUserMenuStr(buf, 0);
sprintf(buf, " ÂÛÁÅÐÈÒÅ");
PrintUserMenuStr(buf, 1);
sprintf(buf, " ÏÎÑÒ");
PrintUserMenuStr(buf, 2);
sprintf(buf, " ");
PrintUserMenuStr(buf, 3);
}
#if defined(BOARD_SOLARIUM_WEB)
void PrintServerDisconnectedMenu()
{
PrintUserMenuStrUnalign(" ÑÅÐÂÅÐ", 0);
PrintUserMenuStrUnalign(" ÍÅÄÎÑÒÓÏÅÍ", 1);
RefreshMenu();
}
void PrintSolariumBlockingMessage()
{
char buf[32];
strncpy(buf, message_lines[0], 16);
PrintUserMenuStr(buf, 0);
strncpy(buf, message_lines[1], 16);
PrintUserMenuStr(buf, 1);
RefreshMenu();
}
void PrintSolariumFreeMenu()
{
if (show_blocking_msg) return;
PrintUserMenuStrUnalign(" ÑÎËßÐÈé", 0);
PrintUserMenuStrUnalign(" ÑÂÎÁÎÄÅÍ", 1);
RefreshMenu();
}
void PrintSolariumPassMenu()
{
char buf[32];
sprintf(buf, " %s", pass_phrase);
PrintUserMenuStr(buf, 0);
sprintf(buf, "");
PrintUserMenuStr(buf, 1);
RefreshMenu();
}
void SolariumStartUserInput()
{
CPU_INT32U mintime, maxtime;
CPU_INT32U usertime;
GetData(&SolariumMinTimeDesc, &mintime, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&SolariumMaxTimeDesc, &maxtime, 0, DATA_FLAG_SYSTEM_INDEX);
if (app_state.timefromserver > 0)
{
usertime = app_state.timefromserver;
}
else if (app_state.moneyfromserver > 0)
{
usertime = CalcTimeSecPerMoney(app_state.moneyfromserver);
}
else
{
usertime = 0;
}
if (usertime > maxtime * 60)
{
usertime = maxtime * 60;
}
if (usertime > 99 * 60UL)
{
usertime = 99 * 60UL;
}
PrintSecToMinSec(user_input_str, usertime);
user_input_ctr = 0;
}
CPU_INT32U SolariumGetUserInputTime()
{
int min = 0, sec = 0;
if (sscanf(user_input_str, "%02d:%02d", &min, &sec) == 2)
{
return min * 60UL + sec;
}
return 0;
}
CPU_INT32U SolariumFinishUserInput()
{
int min = 0, sec = 0;
MenuCursorOff();
if (sscanf(user_input_str, "%02d:%02d", &min, &sec) == 2)
{
return min * 60UL + sec;
}
return 0;
}
void PrintSolariumUserInputMenu()
{
char str[32];
char str_time[16];
if (show_blocking_msg) return;
if (app_state.timefromserver > 0)
{
PrintSecToMinSec(str_time, app_state.timefromserver);
}
else if (app_state.moneyfromserver > 0)
{
PrintSecToMinSec(str_time, CalcTimeSecPerMoney(app_state.moneyfromserver));
}
else
{
PrintSecToMinSec(str_time, 0);
}
strcpy(str, "Äîñòóïíî ");
strcpy(&str[strlen(str)], str_time);
PrintUserMenuStr(str, 0);
strcpy(str, user_input_str);
PrintUserMenuStr(str, 1);
MenuCursorOn(5 + user_input_pos[user_input_ctr], 1);
RefreshMenu();
}
void PrintSolariumSunburnMenu()
{
char buf[32];
if (show_blocking_msg) return;
PrintUserMenuStrUnalign(" ÑÅÀÍÑ ÇÀÃÀÐÀ", 0);
PrintSecToMinSec(buf, app_state.timetoend);
PrintUserMenuStr(buf, 1);
RefreshMenu();
}
void PrintSolariumVentilationMenu()
{
char buf[32];
if (show_blocking_msg) return;
PrintUserMenuStrUnalign(" ÂÅÍÒÈËßÖÈß", 0);
PrintSecToMinSec(buf, app_state.timetoend);
PrintUserMenuStr(buf, 1);
RefreshMenu();
}
void PrintSolariumPrePauseMenu()
{
char buf[32];
if (show_blocking_msg) return;
sprintf(buf, "ÄÎ ÍÀ×ÀËÀ ÑÅÀÍÑÀ");
PrintUserMenuStr(buf, 0);
PrintSecToMinSec(buf, app_state.timetoend);
PrintUserMenuStr(buf, 1);
RefreshMenu();
}
void PrintWaitingAckUserMenu()
{
if (show_blocking_msg) return;
PrintUserMenuStrUnalign(" ÎÆÈÄÀÍÈÅ", 0);
PrintUserMenuStrUnalign(" ÎÄÎÁÐÅÍÈß", 1);
RefreshMenu();
}
#endif // #if defined(BOARD_SOLARIUM_WEB)
// ïðîâåðêà, áûëè ëè ñîõðàíåíû äåíüãè äî âûêëþ÷åíèÿ ïèòàíèÿ
void LoadAcceptedMoney(void)
{
CPU_INT32U m,crc,crct;
// ñ÷èòàåì cîõðàíåííûå äåíüãè èç FRAM
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
// ñ÷èòàåì crc16 ýòèõ äåíåã èç FRAM
GetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
crct = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
if (crct != crc)
{ // îáíóëÿåì, åñëè crc íå ñîøëàñü
m = 0;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
}
}
// äîáàâèòü äåíåã
void SetAcceptedMoney(CPU_INT32U money)
{
CPU_INT32U m,crc;
m=money;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
}
// î÷èñòèòü ñ÷åò÷èê äåíåã
void ClearAcceptedMoney(void)
{
CPU_INT32U m,crc;
m=0;
crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U));
SetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&AcceptedMoneyCRC16Desc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
}
// ïðî÷èòàòü ñ÷åò÷èê äåíåã
CPU_INT32U GetAcceptedMoney(void)
{
CPU_INT32U m;
GetData(&AcceptedMoneyDesc, &m, 0, DATA_FLAG_SYSTEM_INDEX);
return m;
}
void PrintCardBill(void)
{
CPU_INT08U err;
if (IsFiscalConnected())
{
char str[41];
int tag_size, temp1, temp2;
char str_short[16];
FPend();
sprintf(str, " ");
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
for (int i = 0; i < PRETEXT_LINE_COUNT; i++)
{
if (ReadPrecheckText(str, i) > 0)
{
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
}
}
// 1. ÎÏÅÐÀÖÈß
memset(str, 0, 40);
tag_size = ttk2_get_field_string(0x81, str, 40);
if (tag_size <= 0)
{
sprintf(str, "--- ÍÅÈÇÂÅÑÒÍÎ ---");
}
else if (strcmp(str, "PUR") == 0)
{
sprintf(str, "--- ÏÐÎÄÀÆÀ ---");
}
else
{
sprintf(str, "--- ÄÐÓÃÀß ÎÏÅÐÀÖÈß ---");
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
// 2. ÈÒÎÃÎ
memset(str, 0, 40);
sprintf(str, "ÈÒÎÃÎ:");
tag_size = ttk2_get_field_string(0x84, &str[strlen(str)], 20);
if (tag_size <= 0)
{
goto next_line0;
}
// 3. DECIMAL POINT
memset(str_short, 0, 2);
tag_size = ttk2_get_field_string(0xC2, str_short, 1);
if (tag_size > 0)
{
temp1 = str_short[0] - '0';
temp2 = strlen(str);
}
else
{
temp1 = 2;
temp2 = strlen(str);
}
memcpy(&str[20], &str[temp2 - temp1], temp1);
str[temp2 - temp1] = '.';
strcpy(&str[temp2 - temp1 + 1], &str[20]);
memset(&str[strlen(str)], 0, 40 - strlen(str));
// 4. CURRENCY
str[strlen(str)] = ' ';
tag_size = ttk2_get_field_string(0xC1, &str[strlen(str)], 40 - strlen(str));
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line0:
// 5. ÎÏÅÐÀÖÈß ÎÄÎÁÐÅÍÀ
memset(str_short, 0, 2);
tag_size = ttk2_get_field_string(0xA1, str_short, 2);
if (tag_size <= 0)
{
sprintf(str, "ÍÅÈÇÂÅÑÒÍÎ");
}
else if (str_short[0] == 'Y')
{
sprintf(str, "ÎÏÅÐÀÖÈß ÎÄÎÁÐÅÍÀ");
}
else
{
sprintf(str, "ÎÏÅÐÀÖÈß ÎÒÊËÎÍÅÍÀ");
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
// 6. Issuer Name
memset(str, 0, 40);
tag_size = ttk2_get_field_string(0x8F, str, 20);
if (tag_size < 0)
{
goto next_line1;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line1:
// 7. PAN
memset(str, 0, 40);
tag_size = ttk2_get_field_string(0x89, str, 20);
if (tag_size < 0)
{
goto next_line2;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line2:
// 8. POS Entry Mode
memset(str_short, 0, 16);
tag_size = ttk2_get_field_string(0x92, str_short, 16);
if (tag_size < 0)
{
goto next_line3;
}
if ((str_short[0] == '9') && (str_short[1] == '0'))
{
sprintf(str, "FULL TRACK READ");
}
else if ((str_short[0] == '0') && (str_short[1] == '1'))
{
sprintf(str, "MANUAL PAN ENTRY");
}
else if ((str_short[0] == '0') && (str_short[1] == '5'))
{
sprintf(str, "EMV CHIP");
}
else if ((str_short[0] == '8') && (str_short[1] == '0'))
{
sprintf(str, "EMV FALLBACK");
}
else if ((str_short[0] == '0') && (str_short[1] == '7'))
{
sprintf(str, "CONTACTLESS EMV");
}
else if ((str_short[0] == '9') && (str_short[1] == '1'))
{
sprintf(str, "CONTACTLESS");
}
else
{
goto next_line3;
}
if (str_short[2] == '9')
{
sprintf(&str[strlen(str)], " OFFLINE");
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line3:
// 9. Invoice Number
memset(str, 0, 40);
sprintf(str, "×ÅÊ:");
tag_size = ttk2_get_field_string(0x8B, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line4;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line4:
// 10. Authorization ID
memset(str, 0, 40);
sprintf(str, "ÊÎÄ ÀÂÒ:");
tag_size = ttk2_get_field_string(0x8C, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line5;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line5:
// 11. Âðåìÿ
memset(str, 0, 40);
memset(str_short, 0, 16);
sprintf(str, "ÄÀÒÀ:");
tag_size = ttk2_get_field_string(0x8D, str_short, 16);
if (tag_size == 8)
{
char *str_ptr = &str[strlen(str)];
*str_ptr++ = str_short[0]; *str_ptr++ = str_short[1];
*str_ptr++ = '-';
*str_ptr++ = str_short[2]; *str_ptr++ = str_short[3];
*str_ptr++ = '-';
*str_ptr++ = str_short[4]; *str_ptr++ = str_short[5]; *str_ptr++ = str_short[6]; *str_ptr++ = str_short[7];
}
else if (tag_size == 4)
{
char *str_ptr = &str[strlen(str)];
*str_ptr++ = str_short[0]; *str_ptr++ = str_short[1];
*str_ptr++ = '-';
*str_ptr++ = str_short[2]; *str_ptr++ = str_short[3];
}
else
{
goto next_line6;
}
sprintf(&str[strlen(str)], " ");
memset(str_short, 0, 16);
tag_size = ttk2_get_field_string(0x8E, str_short, 16);
if (tag_size == 6)
{
char *str_ptr = &str[strlen(str)];
*str_ptr++ = str_short[0]; *str_ptr++ = str_short[1];
*str_ptr++ = ':';
*str_ptr++ = str_short[2]; *str_ptr++ = str_short[3];
*str_ptr++ = ':';
*str_ptr++ = str_short[4]; *str_ptr++ = str_short[5];
}
else if (tag_size == 4)
{
char *str_ptr = &str[strlen(str)];
*str_ptr++ = str_short[0]; *str_ptr++ = str_short[1];
*str_ptr++ = ':';
*str_ptr++ = str_short[2]; *str_ptr++ = str_short[3];
}
else
{
goto next_line6;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line6:
// 12. ÒÅÐÌÈÍÀË
memset(str, 0, 40);
sprintf(str, "ÒÅÐÌÈÍÀË:");
tag_size = ttk2_get_field_string(0x9D, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line7;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line7:
// 13. MERCHANT
memset(str, 0, 40);
sprintf(str, "MERCHANT:");
tag_size = ttk2_get_field_string(0x90, &str[strlen(str)], 40 - strlen(str));
if (tag_size > 0)
{
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
}
// 14. Cardholder Verification Method
memset(str_short, 0, 2);
tag_size = ttk2_get_field_string(0x94, str_short, 2);
if (tag_size <= 0)
{
goto next_line8;
}
if (str_short[0] == 'P')
{
sprintf(str, "CVM:ÏÈÍ ÂÂÅÄÅÍ");
}
else if (str_short[0] == 'S')
{
sprintf(str, "CVM:SIGNATURE REQUIRED");
}
else if (str_short[0] == 'C')
{
sprintf(str, "CVM:PIN AND SIGNATURE");
}
else
{
sprintf(str, "CVM:NoCVM");
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line8:
// 15. TVR
memset(str, 0, 40);
memset(str_short, 0, 16);
sprintf(str, "TVR:");
tag_size = ttk2_get_field_string(0x95, str_short, 16);
if (tag_size > 0)
{
unsigned char *ptr=(unsigned char *)str_short;
while (tag_size--)
{
sprintf(&str[strlen(str)], "%02x", (unsigned int)*ptr);
ptr++;
}
}
else
{
goto next_line9;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line9:
// 16. AID
memset(str, 0, 40);
memset(str_short, 0, 16);
sprintf(str, "AID:");
tag_size = ttk2_get_field_string(0x9F06, str_short, 8);
if (tag_size > 0)
{
unsigned char *ptr=(unsigned char *)str_short;
while (tag_size--)
{
sprintf(&str[strlen(str)], "%02x", (unsigned int)*ptr);
ptr++;
}
}
else
{
goto next_line10;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line10:
// 17. Application Label
memset(str, 0, 40);
sprintf(str, "APP:");
tag_size = ttk2_get_field_string(0x50, &str[strlen(str)], 40 - strlen(str));
if (tag_size > 0)
{
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
}
// 18. Transaction Certificate
memset(str, 0, 40);
memset(str_short, 0, 16);
sprintf(str, "TC:");
tag_size = ttk2_get_field_string(0x9F26, str_short, 16);
if (tag_size > 0)
{
unsigned char *ptr=(unsigned char *)str_short;
while (tag_size--)
{
sprintf(&str[strlen(str)], "%02x", (unsigned int)*ptr);
ptr++;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
}
// 19. Retrieval Reference Number
memset(str, 0, 40);
sprintf(str, "RRN:");
tag_size = ttk2_get_field_string(0x98, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line11;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line11:
// 20. Batch No
memset(str, 0, 40);
sprintf(str, "BATCH:");
tag_size = ttk2_get_field_string(0x99, &str[strlen(str)], 40 - strlen(str));
if (tag_size <= 0)
{
goto next_line12;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line12:
// 21. ERN, RC
memset(str, 0, 40);
sprintf(str, "ERN:");
tag_size = ttk2_get_field_string(0x83, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line13;
}
sprintf(&str[strlen(str)], " RC:");
tag_size = ttk2_get_field_string(0x9B, &str[strlen(str)], 40 - strlen(str));
if (tag_size < 0)
{
goto next_line13;
}
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
goto exit_print;
}
next_line13:
sprintf(str, " ");
if (FiscPrintString(DEFAULT_PASS, 0x07, (CPU_INT08U*)str, &err) != FISC_OK)
{
}
exit_print:
if (FiscBillCut(DEFAULT_PASS, FISC_HALF_CUT, &err) != FISC_OK)
{
FPost();
return;
}
FPost();
}
}
// èíèöèàëèçàöèÿ ïàðîëÿ
void InitPass(void)
{
#if defined(BOARD_SOLARIUM_VLAD)
CPU_INT32U en_pass = 0;
#endif
CPU_INT32U pass,crc,crct;
GetData(&PassDesc, &pass, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&PassCRCDesc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
crct = crc16((unsigned char*)&pass, sizeof(CPU_INT32U));
if (crct != crc)
{ // îáíóëÿåì, åñëè crc íå ñîøëàñü
pass = DEFAULT_PASSWORD;
crc = crc16((unsigned char*)&pass, sizeof(CPU_INT32U));
SetData(&PassDesc, &pass, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&PassCRCDesc, &crc, 0, DATA_FLAG_SYSTEM_INDEX);
#if defined(BOARD_SOLARIUM_VLAD)
en_pass = 0;
SetData(&EnableGlobalPassDesc, &en_pass, 0, DATA_FLAG_SYSTEM_INDEX);
#endif
}
#if defined(BOARD_SOLARIUM_VLAD)
GetData(&EnableGlobalPassDesc, &en_pass, 0, DATA_FLAG_SYSTEM_INDEX);
if (en_pass > 1)
{
en_pass = 0;
SetData(&EnableGlobalPassDesc, &en_pass, 0, DATA_FLAG_SYSTEM_INDEX);
}
CheckVladPasswords();
#endif
}