diff --git a/PROJECT/app/app_serv.c b/PROJECT/app/app_serv.c index 1cffc4b..ac1d2ad 100644 --- a/PROJECT/app/app_serv.c +++ b/PROJECT/app/app_serv.c @@ -45,10 +45,16 @@ void UserPrintThanksMenu(int post); void UserPrintFirstMenu(void); void UserPrintErrorMenu(void); CPU_INT32U GetChannelsTimeForFree(CPU_INT08U ch); + void LoadAcceptedMoney(void); void SetAcceptedMoney(CPU_INT32U money,int post); void ClearAcceptedMoney(int post); CPU_INT32U GetAcceptedMoney(int post); + +void SetAcceptedBankMoney(CPU_INT32U money,int post); +void ClearAcceptedBankMoney(int post); +CPU_INT32U GetAcceptedBankMoney(int post); + void InitPass(void); int CheckChannelEnabled(CPU_INT08U channel); int ChannelBusy(CPU_INT08U ch); @@ -97,8 +103,9 @@ washStateEnum wash_State[COUNT_POST + COUNT_VACUUM] = {waitMoney, waitMoney, wai int countSecWait[COUNT_POST + COUNT_VACUUM] = {0, 0, 0, 0, 0, 0, 0, 0}; CPU_INT32U enable_coin[COUNT_POST + COUNT_VACUUM]; -CPU_INT32U cash_enable[COUNT_POST + COUNT_VACUUM]; -CPU_INT32U enable_signal[COUNT_POST + COUNT_VACUUM]; +CPU_INT32U cash_enable[COUNT_POST]; +CPU_INT32U bank_enable[COUNT_POST]; +CPU_INT32U enable_signal[COUNT_POST]; void DrawMenu(void) { @@ -108,10 +115,10 @@ void DrawMenu(void) { if((enable_coin[currentPosition] || cash_enable[currentPosition] - || enable_signal[currentPosition]) - && currentPosition < COUNT_POST) break; - else if((enable_coin[currentPosition] - || enable_signal[currentPosition]) + || bank_enable[currentPosition] + || enable_signal[currentPosition]) + && currentPosition < COUNT_POST) break; + else if((enable_coin[currentPosition]) && currentPosition >= COUNT_POST) break; } @@ -188,13 +195,15 @@ void UserAppTask(void *p_arg) break; } - for(int post = 0; post < COUNT_POST + COUNT_VACUUM; post++) + for(int post = 0; post < COUNT_POST; post++) { GetData(&EnableCoinDesc, &enable_coin[post], post, DATA_FLAG_DIRECT_INDEX); GetData(&EnableValidatorDesc, &cash_enable[post], post, DATA_FLAG_DIRECT_INDEX); + GetData(&EnableBankDesc, &bank_enable[post], post, DATA_FLAG_DIRECT_INDEX); GetData(&EnableSignalDesc, &enable_signal[post], post, DATA_FLAG_DIRECT_INDEX); accmoney = GetAcceptedMoney(post); + accmoney += GetAcceptedBankMoney(post); if (accmoney > 0) { @@ -235,6 +244,22 @@ void UserAppTask(void *p_arg) } } + for(int post = COUNT_POST; post < COUNT_POST + COUNT_VACUUM; post++) + { + accmoney = GetAcceptedMoney(post); + + if (accmoney > 0) + { + // для монетоприемников пылесосов - печать чека по таймауту + GetData(&CoinTimeOutDesc, &print_timeout, post, DATA_FLAG_DIRECT_INDEX); + + if (labs(OSTimeGet() - money_timestamp[post]) > 1000UL * print_timeout) + { + PostUserEvent(EVENT_CASH_PRINT_CHECK_POST1 + post); + } + } + } + // принимаем деньги DrawMenu(); @@ -320,7 +345,33 @@ void UserAppTask(void *p_arg) wash_State[number_post] = insertMoney; } break; - + + case EVENT_BANK_INSERTED_POST1: + case EVENT_BANK_INSERTED_POST2: + case EVENT_BANK_INSERTED_POST3: + case EVENT_BANK_INSERTED_POST4: + case EVENT_BANK_INSERTED_POST5: + case EVENT_BANK_INSERTED_POST6: + { + CPU_INT32U cpp = 1; + CPU_INT32U money, accmoney; + int number_post = event - EVENT_BANK_INSERTED_POST1; + + GetData(&BankPerPulseDesc, &cpp, number_post, DATA_FLAG_DIRECT_INDEX); + + money = cpp * GetResetbankCount(number_post) + testMoney; + + accmoney = GetAcceptedBankMoney(number_post); + accmoney += money; + SetAcceptedBankMoney(accmoney, number_post); + money_timestamp[number_post] = OSTimeGet(); + + if (money) SaveEventRecord(number_post, JOURNAL_EVENT_MONEY_NOTE_POST1 + number_post, money); + + wash_State[number_post] = insertMoney; + } + break; + case EVENT_KEY_CANSEL: break; @@ -387,13 +438,13 @@ void UserAppTask(void *p_arg) case EVENT_STOP_MONEY_POST4: case EVENT_STOP_MONEY_POST5: case EVENT_STOP_MONEY_POST6: - case EVENT_STOP_MONEY_VACUUM1: - case EVENT_STOP_MONEY_VACUUM2: if (GetMode() == MODE_WORK) // { int number_post = event - EVENT_STOP_MONEY_POST1; accmoney = GetAcceptedMoney(number_post); + accmoney += GetAcceptedBankMoney(number_post); + if (accmoney > 0) { wash_State[number_post] = washing; @@ -407,14 +458,14 @@ void UserAppTask(void *p_arg) case EVENT_WAIT_CASH_PRINT_CHECK_POST4: case EVENT_WAIT_CASH_PRINT_CHECK_POST5: case EVENT_WAIT_CASH_PRINT_CHECK_POST6: - case EVENT_WAIT_CASH_PRINT_CHECK_VACUUM1: - case EVENT_WAIT_CASH_PRINT_CHECK_VACUUM2: if (GetMode() == MODE_WORK) // { int number_post = event - EVENT_WAIT_CASH_PRINT_CHECK_POST1; int count_delay = 0; accmoney = GetAcceptedMoney(number_post); + accmoney += GetAcceptedBankMoney(number_post); + if (accmoney > 0) { // запустим задержку печати чека @@ -442,14 +493,46 @@ void UserAppTask(void *p_arg) int number_post = event - EVENT_CASH_PRINT_CHECK_POST1; // здесь событие старта печати чека - включили насос или пылесос - CPU_INT32U accmoney = GetAcceptedMoney(number_post); + accmoney = GetAcceptedMoney(number_post); if (accmoney > 0) { UserPrintPrintBillMenu(number_post); RefreshMenu(); - // напечатаем чек + // напечатаем наличный чек + if (IsFiscalConnected()) + { + if (PrintFiscalBill(accmoney,number_post) == 0) // здесь добавить с какого поста чек + { + SaveEventRecord(number_post, JOURNAL_EVENT_PRINT_BILL_POST1 + number_post, GetTimeSec()); + } + } + + IncCounter(number_post, ChannelsPayedTime[number_post], accmoney); + SetAcceptedMoney(0, number_post); + OSTimeDly(1000); + + // повесим меню "СПАСИБО" + if (IsFiscalConnected()) + { + UserPrintThanksMenu(number_post); + RefreshMenu(); + } + + OSTimeDly(1000); + wash_State[number_post] = waitMoney; + } + + // здесь событие старта печати чека - включили насос или пылесос + accmoney = GetAcceptedBankMoney(number_post); + + if (accmoney > 0) + { + UserPrintPrintBillMenu(number_post); + RefreshMenu(); + + // напечатаем безналичный чек if (IsFiscalConnected()) { if (PrintFiscalBill(accmoney,number_post) == 0) // здесь добавить с какого поста чек @@ -476,8 +559,8 @@ void UserAppTask(void *p_arg) break; case EVENT_KEY_F1: - //testMoney = 100; - //PostUserEvent(EVENT_CASH_INSERTED_POST1); + testMoney = 100; + PostUserEvent(EVENT_COIN_INSERTED_VACUUM1); /*FIO4SET_bit.P4_28 = 1; OSTimeDly(50); @@ -767,6 +850,24 @@ void LoadAcceptedMoney(void) SetData(&AcceptedMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX); } } + + for(int i = 0; i < COUNT_POST; i++) + { + // считаем cохраненные деньги из FRAM + GetData(&AcceptedBankMoneyDesc, &m, i, DATA_FLAG_DIRECT_INDEX); + // считаем crc16 этих денег из FRAM + GetData(&AcceptedBankMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX); + + crct = crc16((unsigned char*)&m, sizeof(CPU_INT32U)); + + if (crct != crc) + { // обнуляем, если crc не сошлась + m = 0; + crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U)); + SetData(&AcceptedBankMoneyDesc, &m, i, DATA_FLAG_DIRECT_INDEX); + SetData(&AcceptedBankMoneyCRC16Desc, &crc, i, DATA_FLAG_DIRECT_INDEX); + } + } } // добавить денег @@ -797,6 +898,34 @@ CPU_INT32U GetAcceptedMoney(int post) return m; } +// добавить денег +void SetAcceptedBankMoney(CPU_INT32U money, int post) +{ + CPU_INT32U m,crc; + m=money; + crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U)); + SetData(&AcceptedBankMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX); + SetData(&AcceptedBankMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX); +} + +// очистить счетчик денег +void ClearAcceptedBankMoney(int post) +{ + CPU_INT32U m,crc; + m=0; + crc = crc16((unsigned char*)&m, sizeof(CPU_INT32U)); + SetData(&AcceptedBankMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX); + SetData(&AcceptedBankMoneyCRC16Desc, &crc, post, DATA_FLAG_DIRECT_INDEX); +} + +// очистить счетчик денег +CPU_INT32U GetAcceptedBankMoney(int post) +{ + CPU_INT32U m; + GetData(&AcceptedBankMoneyDesc, &m, post, DATA_FLAG_DIRECT_INDEX); + return m; +} + // инициализация пароля void InitPass(void) { diff --git a/PROJECT/app/app_serv.h b/PROJECT/app/app_serv.h index 552c4c6..16fe869 100644 --- a/PROJECT/app/app_serv.h +++ b/PROJECT/app/app_serv.h @@ -54,14 +54,19 @@ enum{ EVENT_CASH_INSERTED_POST5, EVENT_CASH_INSERTED_POST6, + EVENT_BANK_INSERTED_POST1, + EVENT_BANK_INSERTED_POST2, + EVENT_BANK_INSERTED_POST3, + EVENT_BANK_INSERTED_POST4, + EVENT_BANK_INSERTED_POST5, + EVENT_BANK_INSERTED_POST6, + EVENT_STOP_MONEY_POST1, EVENT_STOP_MONEY_POST2, EVENT_STOP_MONEY_POST3, EVENT_STOP_MONEY_POST4, EVENT_STOP_MONEY_POST5, EVENT_STOP_MONEY_POST6, - EVENT_STOP_MONEY_VACUUM1, - EVENT_STOP_MONEY_VACUUM2, EVENT_WAIT_CASH_PRINT_CHECK_POST1, EVENT_WAIT_CASH_PRINT_CHECK_POST2, @@ -69,8 +74,6 @@ enum{ EVENT_WAIT_CASH_PRINT_CHECK_POST4, EVENT_WAIT_CASH_PRINT_CHECK_POST5, EVENT_WAIT_CASH_PRINT_CHECK_POST6, - EVENT_WAIT_CASH_PRINT_CHECK_VACUUM1, - EVENT_WAIT_CASH_PRINT_CHECK_VACUUM2, EVENT_CASH_PRINT_CHECK_POST1, EVENT_CASH_PRINT_CHECK_POST2, diff --git a/PROJECT/app/journal.h b/PROJECT/app/journal.h index 86de1fa..c7a27b2 100644 --- a/PROJECT/app/journal.h +++ b/PROJECT/app/journal.h @@ -3,7 +3,7 @@ #include "fiscal.h" -#define EVENT_RECORDS_COUNT 512 // число записей в журнале +#define EVENT_RECORDS_COUNT 384 // число записей в журнале #pragma pack(push, 1) /// структура записи журнала рабочих событий diff --git a/PROJECT/data/datadesc.c b/PROJECT/data/datadesc.c index bb29bcb..26da3e4 100644 --- a/PROJECT/data/datadesc.c +++ b/PROJECT/data/datadesc.c @@ -74,6 +74,41 @@ TDataDescStruct const CashPulseLenDesc = { 50 }; +/************************************* + Длина импульса входа банковского терминала, мс +*************************************/ +TRangeValueULONG const BankPulseLenRange = {20, 250}; +CPU_INT08U const BankPulseLenName[] = "Длина имп.,мс"; + +void OnChangeBankPulseLen() +{ + CPU_INT32U pulse, pause; + for(int post = 0; post < COUNT_POST; post++) + { + GetData(&BankPulseLenDesc, &pulse, post, DATA_FLAG_DIRECT_INDEX); + GetData(&BankPauseLenDesc, &pause, post, DATA_FLAG_DIRECT_INDEX); + SetBankPulseParam(pulse, pause, post); + } +} + +TDataDescStruct const BankPulseLenDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + &BankIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, bank_pulse_len), // указатель на переменную или адрес FRAM + (void*)&BankPulseLenRange, // указатель на границы параметра + OnChangeBankPulseLen, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + BankPulseLenName, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 50 +}; + /************************************* Длина паузы входа купюрника, мс *************************************/ @@ -98,6 +133,30 @@ TDataDescStruct const CashPauseLenDesc = { 20 }; +/************************************* + Длина паузы входа банковского терминала, мс +*************************************/ +TRangeValueULONG const BankPauseLenRange = {20, 250}; +CPU_INT08U const BankPauseLenName[] = "Пауза имп.,мс"; + +TDataDescStruct const BankPauseLenDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + &BankIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, bank_pause_len), // указатель на переменную или адрес FRAM + (void*)&BankPauseLenRange, // указатель на границы параметра + OnChangeBankPulseLen, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + BankPauseLenName, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 20 +}; + /************************************* Название кнопки СТАРТ (СТАРТ или ПУСК) *************************************/ @@ -136,7 +195,6 @@ CPU_INT08U const OnOffList_str0[] = " CPU_INT08U const OnOffList_str1[] = "вкл."; CPU_INT08U const *EnableValidatorList[] = {OnOffList_str0, OnOffList_str1}; - TDataDescStruct const EnableValidatorDesc = { DATA_DESC_EDIT, // тип дескриптора DATA_TYPE_ULONG, // тип параметра @@ -155,6 +213,30 @@ TDataDescStruct const EnableValidatorDesc = { 1 // значение по умолчанию }; +/************************************* + Включение банковского терминала +*************************************/ +TRangeValueULONG const EnableBankRange = {0, 1}; +CPU_INT08U const EnableBankName[] = "Банк.термин."; + +TDataDescStruct const EnableBankDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + &BankIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, DeviceConfig.EnableBank), // указатель на переменную или адрес FRAM + (void*)&EnableBankRange, // указатель на границы параметра + NULL, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + EnableBankName, // указатель на строку названия параметра + DATA_IS_INDEX, // признак индексного параметра (список строк) + EnableValidatorList, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 1 // значение по умолчанию +}; + /************************************* Включение модема *************************************/ @@ -321,7 +403,7 @@ TDataDescStruct const StatSendHourMinDesc = { /************************************* Индекс при настройке сигналов *************************************/ -TRangeValueULONG const SignalIndexRange = {0, 7}; +TRangeValueULONG const SignalIndexRange = {0, 5}; CPU_INT08U const SignalIndexName[] = "НАСТ.СИГН.ПЕЧ."; CPU_INT08U const SignalIndex_str0[] = "1"; CPU_INT08U const SignalIndex_str1[] = "2"; @@ -329,9 +411,7 @@ CPU_INT08U const SignalIndex_str2[] = "3"; CPU_INT08U const SignalIndex_str3[] = "4"; CPU_INT08U const SignalIndex_str4[] = "5"; CPU_INT08U const SignalIndex_str5[] = "6"; -CPU_INT08U const SignalIndex_str6[] = "П1"; -CPU_INT08U const SignalIndex_str7[] = "П2"; -CPU_INT08U const *SignalIndexList[] = {SignalIndex_str0, SignalIndex_str1,SignalIndex_str2,SignalIndex_str3,SignalIndex_str4,SignalIndex_str5,SignalIndex_str6,SignalIndex_str7}; +CPU_INT08U const *SignalIndexList[] = {SignalIndex_str0, SignalIndex_str1,SignalIndex_str2,SignalIndex_str3,SignalIndex_str4,SignalIndex_str5}; CPU_INT32U CoinIndex = 0; @@ -373,7 +453,7 @@ TDataDescStruct const EnableSignalDesc = { DATA_TYPE_ULONG, // тип параметра DATA_LOC_FRAM, // расположение параметра DATA_IS_ARRAY, // признак массива - COUNT_POST+COUNT_VACUUM,// размер массива + COUNT_POST,// размер массива &SignalIndexDesc, // указатель на десриптор индекса массива (void*)offsetof(TFramMap, enableSignalPrint), // указатель на переменную или адрес FRAM (void*)&EnableSignalRange, // указатель на границы параметра @@ -407,7 +487,7 @@ TDataDescStruct const SignalPulseDesc = { DATA_TYPE_ULONG, // тип параметра DATA_LOC_FRAM, // расположение параметра DATA_IS_ARRAY, // признак массива - COUNT_POST+COUNT_VACUUM, // размер массива + COUNT_POST, // размер массива &SignalIndexDesc, // указатель на десриптор индекса массива (void*)offsetof(TFramMap, signal_pulse_len), // указатель на переменную или адрес FRAM (void*)&SignalPulseRange, // указатель на границы параметра @@ -510,6 +590,38 @@ TDataDescStruct const CoinPerPulseDesc = { 1 // значение по умолчанию }; +/************************************* + Таймаут печати чека монетоприемника +*************************************/ +TRangeValueULONG const CoinTimeOutRange = {1, 999}; +CPU_INT08U const CoinTimeOutName[] = "Таймаут"; + +void OnchangeTimeOutCoin(void) +{ + if(CoinIndex < COUNT_POST) + { + + } +} + +TDataDescStruct const CoinTimeOutDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST+COUNT_VACUUM, // размер массива + &CoinIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, DeviceConfig.CoinTimeOut), // указатель на переменную или адрес FRAM + (void*)&CoinTimeOutRange, // указатель на границы параметра + OnchangeTimeOutCoin, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + CoinTimeOutName, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 30 // значение по умолчанию +}; + /************************************* Индекс при настройке купюроприемников *************************************/ @@ -538,6 +650,33 @@ TDataDescStruct const CashIndexDesc = { 0 }; +/************************************* + Индекс при настройке банковского терминала +*************************************/ +TRangeValueULONG const BankIndexRange = {0, 5}; +CPU_INT08U const BankIndexName[] = "НАСТР.БАНК.ТЕРМ"; + +void OnChangeBankIndex(void) +{ +} + +TDataDescStruct const BankIndexDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_RAM, // расположение параметра + DATA_NO_ARRAY, // признак массива + 0, // размер массива + NULL, // указатель на десриптор индекса массива + (void*)&CoinIndex, // указатель на переменную или адрес FRAM + (void*)&BankIndexRange, // указатель на границы параметра + OnChangeBankIndex, // функция по изменению + 0, // смещение между элементами в массиве + BankIndexName, // указатель на строку названия параметра + DATA_IS_INDEX, // признак индексного параметра (список строк) + CoinIndexList, // указатель на список строк для индексного параметра + DATA_INIT_ENABLE, + 0 +}; /************************************* Режим купюрника @@ -665,16 +804,45 @@ TDataDescStruct const CashPerPulseDesc = { 10 // значение по умолчанию }; +/************************************* + Цена импульса банковского терминала в импульсном режиме +*************************************/ +TRangeValueULONG const BankPerPulseRange = {1, 9999}; +CPU_INT08U const BankPerPulseName[] = "Руб./имп."; + +TDataDescStruct const BankPerPulseDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + &BankIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, DeviceConfig.BankPerPulse), // указатель на переменную или адрес FRAM + (void*)&BankPerPulseRange, // указатель на границы параметра + NULL, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + BankPerPulseName, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 10 // значение по умолчанию +}; + void OnChangeLevel() { - CPU_INT32U level1, level2, level3; + CPU_INT32U level1, level2, level3, level4; for(int post = 0; post < COUNT_POST + COUNT_VACUUM; post++) { - if(post < COUNT_POST) GetData(&CashLevelDesc, &level1, post, DATA_FLAG_DIRECT_INDEX); - GetData(&CoinLevelDesc, &level2, post, DATA_FLAG_DIRECT_INDEX); - GetData(&SignalStopMoneyLevelDesc, &level3, post, DATA_FLAG_DIRECT_INDEX); + if(post < COUNT_POST) + { + GetData(&CashLevelDesc, &level1, post, DATA_FLAG_DIRECT_INDEX); + GetData(&BankLevelDesc, &level2, post, DATA_FLAG_DIRECT_INDEX); + GetData(&SignalStopMoneyLevelDesc, &level3, post, DATA_FLAG_DIRECT_INDEX); + } + + GetData(&CoinLevelDesc, &level4, post, DATA_FLAG_DIRECT_INDEX); - SetLevelParam(level1, level2, level3, post); + SetLevelParam(level1, level2, level3, level4, post); } } @@ -705,6 +873,27 @@ TDataDescStruct const CashLevelDesc = { 1 // значение по умолчанию }; +/************************************* + Уровень сигнала банковскогог терминала +*************************************/ +TDataDescStruct const BankLevelDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + &BankIndexDesc, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, DeviceConfig.BankLevel), // указатель на переменную или адрес FRAM + (void*)&LevelRange, // указатель на границы параметра + OnChangeLevel, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + LevelName, // указатель на строку названия параметра + DATA_IS_INDEX, // признак индексного параметра (список строк) + LevelList, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 1 // значение по умолчанию +}; + /************************************* Уровень сигнала монетника *************************************/ @@ -736,7 +925,7 @@ TDataDescStruct const SignalStopMoneyLevelDesc = { DATA_TYPE_ULONG, // тип параметра DATA_LOC_FRAM, // расположение параметра DATA_IS_ARRAY, // признак массива - COUNT_POST + COUNT_VACUUM, // размер массива + COUNT_POST, // размер массива &SignalIndexDesc, // указатель на десриптор индекса массива (void*)offsetof(TFramMap, DeviceConfig.SignalLevel), // указатель на переменную или адрес FRAM (void*)&LevelRange, // указатель на границы параметра @@ -1957,6 +2146,47 @@ TDataDescStruct const AcceptedMoneyCRC16Desc = { 0 }; +/************************************* + Дескриптор для энергонезависимого сохранения текущих денег +*************************************/ +TDataDescStruct const AcceptedBankMoneyDesc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST,// размер массива + NULL, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, FRAM_AcceptedBankMoney), // указатель на переменную или адрес FRAM + NULL, // указатель на границы параметра + NULL, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + NULL, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 0 +}; + +/************************************* + Дескриптор Crc16 энергонезависимого сохранения текущих денег +*************************************/ +TDataDescStruct const AcceptedBankMoneyCRC16Desc = { + DATA_DESC_EDIT, // тип дескриптора + DATA_TYPE_ULONG, // тип параметра + DATA_LOC_FRAM, // расположение параметра + DATA_IS_ARRAY, // признак массива + COUNT_POST, // размер массива + NULL, // указатель на десриптор индекса массива + (void*)offsetof(TFramMap, crc_AcceptedBankMoney), // указатель на переменную или адрес FRAM + NULL, // указатель на границы параметра + NULL, // функция по изменению + sizeof(CPU_INT32U), // смещение между элементами в массиве + NULL, // указатель на строку названия параметра + DATA_NO_INDEX, // признак индексного параметра (список строк) + NULL, // указатель на список строк для индексного параметра + DATA_INIT_DISABLE, + 0 +}; /************************************* Дескриптор пароля @@ -2530,6 +2760,14 @@ const TDataDescArrayStruct AllDataArray[] = {&CoinLevelDesc, "CoinLevelDesc"}, {&SignalStopMoneyLevelDesc, "SignalStopMoneyLevelDesc"}, + {&EnableBankDesc, "EnableBankDesc"}, + {&BankPerPulseDesc, "BankPerPulseDesc"}, + {&BankPulseLenDesc, "BankPulseLenDesc"}, + {&BankPauseLenDesc, "BankPauseLenDesc"}, + {&BankLevelDesc, "BankLevelDesc"}, + + {&CoinTimeOutDesc, "CoinTimeOutDesc"}, + {NULL, ""} }; diff --git a/PROJECT/data/datadesc.h b/PROJECT/data/datadesc.h index 6546835..dc67cb6 100644 --- a/PROJECT/data/datadesc.h +++ b/PROJECT/data/datadesc.h @@ -17,14 +17,19 @@ // структура конфигурации аппаратуры typedef struct{ - CPU_INT32U EnableValidator[COUNT_POST + COUNT_VACUUM]; + CPU_INT32U EnableCoinAcceptor[COUNT_POST + COUNT_VACUUM]; + CPU_INT32U EnableValidator[COUNT_POST]; + CPU_INT32U EnableBank[COUNT_POST]; + CPU_INT32U EnableModem; CPU_INT32U EnableFiscal; CPU_INT32U EnableFiscalDayClear; CPU_INT32U ServiceName; CPU_INT32U CoinPerPulse[COUNT_POST + COUNT_VACUUM]; // цена импульса монетоприемника + CPU_INT32U CoinTimeOut[COUNT_POST + COUNT_VACUUM]; // таймаут печати чека монетоприемника + CPU_INT32U BillFormat; CPU_INT32U DisableFiscalErrors; // отключение реакции на ошибки ФР @@ -35,14 +40,19 @@ typedef struct{ CPU_INT32U ClearJournalAfterSend; CPU_INT32U StatSendHourMin; - CPU_INT32U CashMode[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U CashPerPulse[COUNT_POST + COUNT_VACUUM]; // цена импульса купюрника + CPU_INT32U CashMode[COUNT_POST]; + CPU_INT32U CashPerPulse[COUNT_POST]; // цена импульса купюрника + + CPU_INT32U BankPerPulse[COUNT_POST]; // цена импульса банковского терминала + CPU_INT32U PrintTimeout; CPU_INT32U PrintTimeoutAfter; - CPU_INT32U CashLevel[COUNT_POST + COUNT_VACUUM]; // уровень сигнала купюрника CPU_INT32U CoinLevel[COUNT_POST + COUNT_VACUUM]; // уровень сигнала монетника - CPU_INT32U SignalLevel[COUNT_POST + COUNT_VACUUM]; // уровень сигнала сигнала печати + + CPU_INT32U CashLevel[COUNT_POST]; // уровень сигнала купюрника + CPU_INT32U SignalLevel[COUNT_POST]; // уровень сигнала сигнала печати + CPU_INT32U BankLevel[COUNT_POST]; // уровень сигнала купюрника CPU_INT32U PrintMode; @@ -69,6 +79,7 @@ extern TDataDescStruct const EnableFiscalDesc; extern TDataDescStruct const EnableCoinDesc; extern TDataDescStruct const EnableModemDesc; extern TDataDescStruct const EnableValidatorDesc; +extern TDataDescStruct const EnableBankDesc; extern TDataDescStruct const CoinPerPulseDesc; extern TDataDescStruct const EnableFiscalDayClearDesc; @@ -104,6 +115,8 @@ extern TDataDescStruct const BillFormatDesc; extern TDataDescStruct const AcceptedMoneyDesc; extern TDataDescStruct const AcceptedMoneyCRC16Desc; +extern TDataDescStruct const AcceptedBankMoneyDesc; +extern TDataDescStruct const AcceptedBankMoneyCRC16Desc; extern TDataDescStruct const DisableFiscalErrorsDesc; @@ -164,6 +177,8 @@ extern TDataDescStruct const TaxSystemDesc; extern TDataDescStruct const CoinIndexDesc; extern TDataDescStruct const CashIndexDesc; +extern TDataDescStruct const BankIndexDesc; + extern CPU_INT32U CoinIndex; extern TDataDescStruct const SignalIndexDesc; @@ -174,4 +189,12 @@ extern TDataDescStruct const CashLevelDesc; extern TDataDescStruct const CoinLevelDesc; extern TDataDescStruct const SignalPrintLevelDesc; extern TDataDescStruct const SignalStopMoneyLevelDesc; + +extern TDataDescStruct const BankPerPulseDesc; +extern TDataDescStruct const BankPulseLenDesc; +extern TDataDescStruct const BankPauseLenDesc; +extern TDataDescStruct const BankLevelDesc; + +extern TDataDescStruct const CoinTimeOutDesc; + #endif //#ifndef _DATADESC_H_ diff --git a/PROJECT/data/fram_map.h b/PROJECT/data/fram_map.h index 0793264..d20bdb0 100644 --- a/PROJECT/data/fram_map.h +++ b/PROJECT/data/fram_map.h @@ -11,22 +11,42 @@ typedef struct CPU_INT32U SerialNum; TDeviceConfig DeviceConfig; - // счетчики - TCounters Counters; - - // длинные счетчики с CRC16 - TCountersLong CountersLong; CPU_INT32U FRAM_AcceptedMoney[COUNT_POST + COUNT_VACUUM]; CPU_INT32U crc_AcceptedMoney[COUNT_POST + COUNT_VACUUM]; + + CPU_INT32U FRAM_AcceptedBankMoney[COUNT_POST]; + CPU_INT32U crc_AcceptedBankMoney[COUNT_POST]; + CPU_INT32U enableSignalPrint[COUNT_POST]; + CPU_INT32U signal_pulse_len[COUNT_POST]; + + CPU_INT32U cash_pulse_len[COUNT_POST]; + CPU_INT32U cash_pause_len[COUNT_POST]; + + CPU_INT32U bank_pulse_len[COUNT_POST]; + CPU_INT32U bank_pause_len[COUNT_POST]; + + CPU_INT08U manual_service_flag[4]; + char manual_service_name[32]; + + CPU_INT32U TaxFormat; + CPU_INT32U SubjSell; + CPU_INT32U CommandV2; + CPU_INT32U TaxSystem; + + CPU_INT32U Pass; + CPU_INT32U crc_Pass; + // журнал событий+ошибок TEventRecord EventRecords[EVENT_RECORDS_COUNT]; CPU_INT32U Price; - CPU_INT32U Pass; - CPU_INT32U crc_Pass; + // счетчики + TCounters Counters; + // длинные счетчики с CRC16 + TCountersLong CountersLong; CPU_INT32U LastEmailTime; @@ -44,19 +64,5 @@ typedef struct CPU_INT16U port; - CPU_INT08U manual_service_flag[4]; - char manual_service_name[32]; - - CPU_INT32U cash_pulse_len[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U cash_pause_len[COUNT_POST + COUNT_VACUUM]; - - CPU_INT32U TaxFormat; - CPU_INT32U SubjSell; - CPU_INT32U CommandV2; - CPU_INT32U TaxSystem; - - CPU_INT32U enableSignalPrint[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U signal_pulse_len[COUNT_POST + COUNT_VACUUM]; - }TFramMap; diff --git a/PROJECT/menu/menudesc.c b/PROJECT/menu/menudesc.c index 3331e1e..40266ea 100644 --- a/PROJECT/menu/menudesc.c +++ b/PROJECT/menu/menudesc.c @@ -675,7 +675,7 @@ const TMenuPanel SetNewPassMenuPanel[] = {arr_SetNewPassMenuArray, NULL, 2, MENU const CPU_INT08U str_DeviceMenu_0[] = " ОБОРУДОВАНИЕ"; const CPU_INT08U str_DeviceMenu_1[] = "ФР"; const CPU_INT08U str_DeviceMenu_2[] = "Монетоприемники"; -//const CPU_INT08U str_DeviceMenu_3[] = "Модем"; +const CPU_INT08U str_DeviceMenu_3[] = "Банк.терминалы"; const CPU_INT08U str_DeviceMenu_4[] = "Купюроприемники"; const CPU_INT08U str_DeviceMenu_5[] = "Сигнал печати"; @@ -707,12 +707,12 @@ const TMenuLine line_DeviceMenu_3 = { (void*)&CoinSetupPanel // панель для перехода }; -/*const TMenuLine line_DeviceMenu_4 = { +const TMenuLine line_DeviceMenu_4 = { MENU_LINE_GOTO_MENU, // тип пункта меню 0, // доп. флаги (void*)str_DeviceMenu_3, // указатель на текстовую строку или дескриптор - (void*)&ModemSetupPanel // панель для перехода -};*/ + (void*)&BankSetupPanel // панель для перехода +}; const TMenuLine line_DeviceMenu_5 = { MENU_LINE_GOTO_MENU, // тип пункта меню @@ -721,8 +721,8 @@ const TMenuLine line_DeviceMenu_5 = { (void*)&SignalSetupPanel // панель для перехода }; -const TMenuLineArray arr_DeviceMenuArray[] = {&line_DeviceMenu_0, &line_DeviceMenu_1, &line_DeviceMenu_2, &line_DeviceMenu_3, &line_DeviceMenu_5,/*&line_DeviceMenu_4,*/ NULL}; -const TMenuPanel DeviceMenuPanel[] = {arr_DeviceMenuArray, NULL, 5, MENU_PANEL_STANDARD}; +const TMenuLineArray arr_DeviceMenuArray[] = {&line_DeviceMenu_0, &line_DeviceMenu_1, &line_DeviceMenu_2, &line_DeviceMenu_4, &line_DeviceMenu_3, &line_DeviceMenu_5, NULL}; +const TMenuPanel DeviceMenuPanel[] = {arr_DeviceMenuArray, NULL, 6, MENU_PANEL_STANDARD}; /*********************************** МЕНЮ НАСТРОЙКА сигналов печати чеков @@ -895,6 +895,13 @@ const TMenuLine line_CoinMenu_2 = { NULL // панель для перехода }; +const TMenuLine line_CoinMenu_4 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&CoinTimeOutDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + const TMenuLine line_CoinMenu_3 = { MENU_LINE_SHOW_DESC, // тип пункта меню 0, // доп. флаги @@ -907,8 +914,8 @@ void OnEnterCoinMenu(void) CoinIndex = 0; } -const TMenuLineArray arr_CoinMenuArray[] = {&line_CoinMenu_0, &line_CoinMenu_1, &line_CoinMenu_2, &line_CoinMenu_3, NULL}; -const TMenuPanel CoinSetupPanel[] = {arr_CoinMenuArray, OnEnterCoinMenu, 4, MENU_PANEL_STANDARD}; +const TMenuLineArray arr_CoinMenuArray[] = {&line_CoinMenu_0, &line_CoinMenu_1, &line_CoinMenu_2, &line_CoinMenu_4, &line_CoinMenu_3, NULL}; +const TMenuPanel CoinSetupPanel[] = {arr_CoinMenuArray, OnEnterCoinMenu, 5, MENU_PANEL_STANDARD}; /*********************************** МЕНЮ НАСТРОЙКА КУПЮРОПРИЕМНИКОВ @@ -966,6 +973,55 @@ const TMenuLine line_CashMenu_6 = { const TMenuLineArray arr_ValidatorMenuArray[] = {&line_CashMenu_0, &line_CashMenu_1, /*&line_CashMenu_2,*/ &line_CashMenu_3, &line_CashMenu_4, &line_CashMenu_5, &line_CashMenu_6, NULL}; const TMenuPanel ValidatorSetupPanel[] = {arr_ValidatorMenuArray, OnEnterCoinMenu, 6, MENU_PANEL_STANDARD}; +/*********************************** + МЕНЮ НАСТРОЙКА БАНКОВСКИХ ТЕРМИНАЛОВ +***********************************/ + +const TMenuLine line_BankMenu_0 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + MENU_FIXED_LINE|MENU_INDEX_LINE, // доп. флаги + (void*)&BankIndexDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLine line_BankMenu_1 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&EnableBankDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLine line_BankMenu_3 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&BankPerPulseDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLine line_BankMenu_4 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&BankPulseLenDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLine line_BankMenu_5 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&BankPauseLenDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLine line_BankMenu_6 = { + MENU_LINE_SHOW_DESC, // тип пункта меню + 0, // доп. флаги + (void*)&BankLevelDesc, // указатель на текстовую строку или дескриптор + NULL // панель для перехода +}; + +const TMenuLineArray arr_BankMenuArray[] = {&line_BankMenu_0, &line_BankMenu_1, &line_BankMenu_3, &line_BankMenu_4, &line_BankMenu_5, &line_BankMenu_6, NULL}; +const TMenuPanel BankSetupPanel[] = {arr_BankMenuArray, OnEnterCoinMenu, 6, MENU_PANEL_STANDARD}; + /*********************************** ЗАСТАВКА ДЛЯ КЛИЕНТА ***********************************/ diff --git a/PROJECT/menu/menudesc.h b/PROJECT/menu/menudesc.h index 8d5e6c8..46068cc 100644 --- a/PROJECT/menu/menudesc.h +++ b/PROJECT/menu/menudesc.h @@ -54,6 +54,7 @@ extern const TMenuPanel ChannelCountersPanel[]; extern const TMenuPanel CommonCountersPanel[]; extern const TMenuPanel bufReportMenuPanel[]; extern const TMenuPanel ValidatorSetupPanel[]; +extern const TMenuPanel BankSetupPanel[]; extern void PrintUserMenuStr(char* str, CPU_INT08U n); extern void PrintEventJournalRecord(TEventRecord *record); diff --git a/PROJECT/services/coin.c b/PROJECT/services/coin.c index adc83e3..9399182 100644 --- a/PROJECT/services/coin.c +++ b/PROJECT/services/coin.c @@ -13,13 +13,18 @@ void InitImpInput(void); CPU_INT32U CoinImpCounter[COUNT_POST + COUNT_VACUUM]; CPU_INT32U CashImpCounter[COUNT_POST + COUNT_VACUUM]; +CPU_INT32U BankImpCounter[COUNT_POST + COUNT_VACUUM]; static CPU_INT32U cash_pulse[COUNT_POST + COUNT_VACUUM]; static CPU_INT32U cash_pause[COUNT_POST + COUNT_VACUUM]; - static char pend_cash_counter[COUNT_POST + COUNT_VACUUM]; static CPU_INT32U pend_cash_timestamp[COUNT_POST + COUNT_VACUUM]; +static CPU_INT32U bank_pulse[COUNT_POST + COUNT_VACUUM]; +static CPU_INT32U bank_pause[COUNT_POST + COUNT_VACUUM]; +static char pend_bank_counter[COUNT_POST + COUNT_VACUUM]; +static CPU_INT32U pend_bank_timestamp[COUNT_POST + COUNT_VACUUM]; + static CPU_INT32U signal_pulse[COUNT_POST + COUNT_VACUUM]; static char pend_upsignal_counter[COUNT_POST + COUNT_VACUUM]; static char pend_downsignal_counter[COUNT_POST + COUNT_VACUUM]; @@ -28,6 +33,7 @@ static CPU_INT32U pend_signal_timestamp[COUNT_POST + COUNT_VACUUM]; CPU_INT32U cashLevel[COUNT_POST + COUNT_VACUUM]; CPU_INT32U coinLevel[COUNT_POST + COUNT_VACUUM]; CPU_INT32U SignalLevel[COUNT_POST + COUNT_VACUUM]; +CPU_INT32U bankLevel[COUNT_POST + COUNT_VACUUM]; void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause, CPU_INT32U post) { @@ -40,6 +46,17 @@ void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause, CPU_INT32U post) OS_EXIT_CRITICAL(); } +void SetBankPulseParam(CPU_INT32U pulse, CPU_INT32U pause, CPU_INT32U post) +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + bank_pulse[post] = pulse * 1; + bank_pause[post] = pause; + OS_EXIT_CRITICAL(); +} + void SetSignalPulseParam(CPU_INT32U pulse, CPU_INT32U post) { #if OS_CRITICAL_METHOD == 3 @@ -50,26 +67,38 @@ void SetSignalPulseParam(CPU_INT32U pulse, CPU_INT32U post) OS_EXIT_CRITICAL(); } -void SetLevelParam(CPU_INT32U level1, CPU_INT32U level2, CPU_INT32U level3, CPU_INT32U post) +void SetLevelParam(CPU_INT32U level1, CPU_INT32U level2, CPU_INT32U level3, CPU_INT32U level4, CPU_INT32U post) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr = 0; #endif OS_ENTER_CRITICAL(); - if(post < COUNT_POST) cashLevel[post] = level1; - coinLevel[post] = level2; - SignalLevel[post] = level3; + if(post < COUNT_POST) + { + cashLevel[post] = level1; + bankLevel[post] = level2; + SignalLevel[post] = level3; + } + + coinLevel[post] = level4; + OS_EXIT_CRITICAL(); } void CoinTask(void *p_arg) { CPU_INT32U enable_coin[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U cash_enable[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U enable_signal[COUNT_POST + COUNT_VACUUM]; + + CPU_INT32U cash_enable[COUNT_POST]; + CPU_INT32U enable_signal[COUNT_POST]; + CPU_INT32U bank_enable[COUNT_POST]; + + CPU_INT32U last_cash_count[COUNT_POST]; + CPU_INT32U last_cash_time[COUNT_POST]; + + CPU_INT32U last_bank_count[COUNT_POST]; + CPU_INT32U last_bank_time[COUNT_POST]; - CPU_INT32U last_cash_count[COUNT_POST + COUNT_VACUUM]; - CPU_INT32U last_cash_time[COUNT_POST + COUNT_VACUUM]; CPU_INT32U last_settings_time = 0; while(1) @@ -79,8 +108,13 @@ void CoinTask(void *p_arg) for(int i = 0; i < COUNT_POST + COUNT_VACUUM; i++) { GetData(&EnableCoinDesc, &enable_coin[i], i, DATA_FLAG_DIRECT_INDEX); - GetData(&EnableValidatorDesc, &cash_enable[i], i, DATA_FLAG_DIRECT_INDEX); - GetData(&EnableSignalDesc, &enable_signal[i], i, DATA_FLAG_DIRECT_INDEX); + + if(i < COUNT_POST) + { + GetData(&EnableValidatorDesc, &cash_enable[i], i, DATA_FLAG_DIRECT_INDEX); + GetData(&EnableSignalDesc, &enable_signal[i], i, DATA_FLAG_DIRECT_INDEX); + GetData(&EnableBankDesc, &bank_enable[i], i, DATA_FLAG_DIRECT_INDEX); + } } last_settings_time = OSTimeGet(); @@ -107,6 +141,9 @@ void CoinTask(void *p_arg) GetResetCoinCount(i); } + if(i >= COUNT_POST) continue; + // только монетоприемников 8 - остальных каналов 6 + OS_ENTER_CRITICAL(); if (enable_signal[i]) { @@ -131,8 +168,46 @@ void CoinTask(void *p_arg) } OS_EXIT_CRITICAL(); + if (bank_enable[i]) + { + OS_ENTER_CRITICAL(); + if (pend_bank_counter[i]) + { + // импульсы инкрементируем только после выдержки паузы + if (OSTimeGet() - pend_bank_timestamp[i] > bank_pause[i]) + { + pend_bank_counter[i] = 0; + BankImpCounter[i]++; + } + } + OS_EXIT_CRITICAL(); + + if (GetbankCount(i)) + { + if (last_bank_count[i] == GetbankCount(i)) + { + if (labs(OSTimeGet() - last_bank_time[i]) > 500) + { + PostUserEvent(EVENT_BANK_INSERTED_POST1 + i); + } + } + else + { + last_bank_count[i] = GetbankCount(i); + last_bank_time[i] = OSTimeGet(); + } + } + else + { + last_bank_time[i] = OSTimeGet(); + } + } + else + { + GetResetbankCount(i); + } + if (!cash_enable[i]) {GetResetCashCount(i); continue;} - if(i >= COUNT_POST) continue; OS_ENTER_CRITICAL(); if (pend_cash_counter[i]) @@ -229,9 +304,36 @@ CPU_INT32U GetResetCashCount(int index) return ctr; } +// получить число импульсов от купюрника +CPU_INT32U GetbankCount(int index) +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = BankImpCounter[index]; + OS_EXIT_CRITICAL(); + return ctr; +} + +// получить число импульсов от купюрника и сбросить счетчик +CPU_INT32U GetResetbankCount(int index) +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = BankImpCounter[index]; + BankImpCounter[index] = 0; + OS_EXIT_CRITICAL(); + return ctr; +} + CPU_INT32U period[COUNT_POST + COUNT_VACUUM]; CPU_INT32U period_cash[COUNT_POST + COUNT_VACUUM]; +CPU_INT32U period_bank[COUNT_POST + COUNT_VACUUM]; CPU_INT32U period_signal[COUNT_POST + COUNT_VACUUM]; + CPU_INT32U T3CR = 0; // инициализация монетоприемника @@ -241,13 +343,18 @@ void InitCoin(void) { CoinImpCounter[i] = 0; CashImpCounter[i] = 0; + BankImpCounter[i] = 0; cash_pulse[i] = 50; cash_pause[i] = 50; - pend_cash_counter[i] = 0; pend_cash_timestamp[i] = 0; + bank_pulse[i] = 50; + bank_pause[i] = 50; + pend_bank_counter[i] = 0; + pend_bank_timestamp[i] = 0; + signal_pulse[i] = 1000; pend_upsignal_counter[i] = 0; pend_downsignal_counter[i] = 0; @@ -255,6 +362,7 @@ void InitCoin(void) period[i] = 0; period_cash[i] = 0; + period_bank[i] = 0; period_signal[i] = 0; } @@ -342,19 +450,35 @@ CPU_INT32U input_register() { SETBIT(input, 18); } - if (FIO0PIN_bit.P0_6) + if (FIO1PIN_bit.P1_25) { SETBIT(input, 19); } - if (FIO1PIN_bit.P1_25) + if (FIO0PIN_bit.P0_28) { SETBIT(input, 20); } - if (FIO0PIN_bit.P0_10) + if (FIO0PIN_bit.P0_27) { SETBIT(input, 21); } - + if (FIO1PIN_bit.P1_24) + { + SETBIT(input, 22); + } + if (FIO1PIN_bit.P1_23) + { + SETBIT(input, 23); + } + if (FIO0PIN_bit.P0_6) + { + SETBIT(input, 24); + } + if (FIO0PIN_bit.P0_10) + { + SETBIT(input, 25); + } + return input; } @@ -718,26 +842,9 @@ void InputCapture_ISR(void) period[6] = T3CR; } } - - // сигнал печати чека пылесос 1 - if(TSTBIT(input_event, 19)) - { - pend_signal_timestamp[6] = OSTimeGet(); - - if ((FIO0PIN_bit.P0_6 && SignalLevel[6]) || (!FIO0PIN_bit.P0_6 && !SignalLevel[6])) - { - pend_upsignal_counter[6] = 1; - pend_downsignal_counter[6] = 0; - } - else - { - pend_upsignal_counter[6] = 0; - pend_downsignal_counter[6] = 1; - } - } // монетоприемник пылесос 2 - if(TSTBIT(input_event, 20)) + if(TSTBIT(input_event, 19)) { if ((!FIO1PIN_bit.P1_25 && coinLevel[7]) || (FIO1PIN_bit.P1_25 && !coinLevel[7])) { // пришел задний фронт @@ -752,20 +859,129 @@ void InputCapture_ISR(void) } } - // сигнал печати чека пылесос 2 - if(TSTBIT(input_event, 21)) + // банк 1 + if(TSTBIT(input_event, 20)) { - pend_signal_timestamp[7] = OSTimeGet(); - - if ((FIO0PIN_bit.P0_10 && SignalLevel[7]) || (!FIO0PIN_bit.P0_10 && !SignalLevel[7])) - { - pend_upsignal_counter[7] = 1; - pend_downsignal_counter[7] = 0; + if ((!FIO0PIN_bit.P0_28 && bankLevel[0]) || (FIO0PIN_bit.P0_28 && !bankLevel[0])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[0]; + + if (cr > (bank_pulse[0] - COIN_IMP_SPAN)) + { + pend_bank_counter[0] = 1; + pend_bank_timestamp[0] = OSTimeGet(); + } } else - { - pend_upsignal_counter[7] = 0; - pend_downsignal_counter[7] = 1; + { // пришел передний фронт + period_bank[0] = T3CR; + pend_bank_counter[0] = 0; + } + } + + // банк 2 + if(TSTBIT(input_event, 21)) + { + if ((!FIO0PIN_bit.P0_27 && bankLevel[1]) || (FIO0PIN_bit.P0_27 && !bankLevel[1])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[1]; + + if (cr > (bank_pulse[1] - COIN_IMP_SPAN)) + { + pend_bank_counter[1] = 1; + pend_bank_timestamp[1] = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank[1] = T3CR; + pend_bank_counter[1] = 0; + } + } + + // банк 3 + if(TSTBIT(input_event, 22)) + { + if ((!FIO1PIN_bit.P1_24 && bankLevel[2]) || (FIO1PIN_bit.P1_24 && !bankLevel[2])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[2]; + + if (cr > (bank_pulse[2] - COIN_IMP_SPAN)) + { + pend_bank_counter[2] = 1; + pend_bank_timestamp[2] = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank[2] = T3CR; + pend_bank_counter[2] = 0; + } + } + + // банк 4 + if(TSTBIT(input_event, 23)) + { + if ((!FIO1PIN_bit.P1_23 && bankLevel[3]) || (FIO1PIN_bit.P1_23 && !bankLevel[3])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[3]; + + if (cr > (bank_pulse[3] - COIN_IMP_SPAN)) + { + pend_bank_counter[3] = 1; + pend_bank_timestamp[3] = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank[3] = T3CR; + pend_bank_counter[3] = 0; + } + } + + // банк 5 + if(TSTBIT(input_event, 24)) + { + if ((!FIO0PIN_bit.P0_6 && bankLevel[4]) || (FIO0PIN_bit.P0_6 && !bankLevel[4])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[4]; + + if (cr > (bank_pulse[4] - COIN_IMP_SPAN)) + { + pend_bank_counter[4] = 1; + pend_bank_timestamp[4] = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank[4] = T3CR; + pend_bank_counter[4] = 0; + } + } + + // банк 6 + if(TSTBIT(input_event, 25)) + { + if ((!FIO0PIN_bit.P0_10 && bankLevel[5]) || (FIO0PIN_bit.P0_10 && !bankLevel[5])) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank[5]; + + if (cr > (bank_pulse[5] - COIN_IMP_SPAN)) + { + pend_bank_counter[5] = 1; + pend_bank_timestamp[5] = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank[5] = T3CR; + pend_bank_counter[5] = 0; } } } @@ -905,20 +1121,44 @@ void InitImpInput (void) PINMODE0_bit.P0_5 = 0; FIO0DIR_bit.P0_5 = 0; FIO0MASK_bit.P0_5 = 0; - - // сигнал печати чека пылесос 1 - PINSEL0_bit.P0_6 = 0; - PINMODE0_bit.P0_6 = 0; - FIO0DIR_bit.P0_6 = 0; - FIO0MASK_bit.P0_6 = 0; - + // монетоприемник пылесос 2 PINSEL3_bit.P1_25 = 0; PINMODE3_bit.P1_25 = 0; FIO1DIR_bit.P1_25 = 0; FIO1MASK_bit.P1_25 = 0; - // сигнал печати чека пылесос 2 + // банк 1 + PINSEL1_bit.P0_28 = 0; + PINMODE1_bit.P0_28 = 0; + FIO0DIR_bit.P0_28 = 0; + FIO0MASK_bit.P0_28 = 0; + + // банк 2 + PINSEL1_bit.P0_27 = 0; + PINMODE1_bit.P0_27 = 0; + FIO0DIR_bit.P0_27 = 0; + FIO0MASK_bit.P0_27 = 0; + + // банк 3 + PINSEL3_bit.P1_24 = 0; + PINMODE3_bit.P1_24 = 0; + FIO1DIR_bit.P1_24 = 0; + FIO1MASK_bit.P1_24 = 0; + + // банк 4 + PINSEL3_bit.P1_23 = 0; + PINMODE3_bit.P1_23 = 0; + FIO1DIR_bit.P1_23 = 0; + FIO1MASK_bit.P1_23 = 0; + + // банк 5 + PINSEL0_bit.P0_6 = 0; + PINMODE0_bit.P0_6 = 0; + FIO0DIR_bit.P0_6 = 0; + FIO0MASK_bit.P0_6 = 0; + + // банк 6 PINSEL0_bit.P0_10 = 0; PINMODE0_bit.P0_10 = 0; FIO0DIR_bit.P0_10 = 0; diff --git a/PROJECT/services/coin.h b/PROJECT/services/coin.h index e6c749b..6364829 100644 --- a/PROJECT/services/coin.h +++ b/PROJECT/services/coin.h @@ -12,11 +12,18 @@ extern CPU_INT32U GetCoinCount(int index); extern CPU_INT32U GetResetCoinCount(int index); extern void CoinDisable(void); extern void CoinEnable(void); + extern CPU_INT32U GetCashCount(int index); extern CPU_INT32U GetResetCashCount(int index); + +extern CPU_INT32U GetbankCount(int index); +extern CPU_INT32U GetResetbankCount(int index); + extern void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause, CPU_INT32U post); +extern void SetBankPulseParam(CPU_INT32U pulse, CPU_INT32U pause, CPU_INT32U post); extern void SetSignalPulseParam(CPU_INT32U pulse, CPU_INT32U post); -extern void SetLevelParam(CPU_INT32U level1, CPU_INT32U level2, CPU_INT32U level3, CPU_INT32U post); +extern void SetLevelParam(CPU_INT32U level1, CPU_INT32U level2, CPU_INT32U level3, CPU_INT32U level4, CPU_INT32U post); + #define BIT(bit) (1UL << (bit)) #define SETBIT(Val,bit) ((Val) |= BIT(bit)) diff --git a/settings/sk-mlpc2368.dni b/settings/sk-mlpc2368.dni index 692feb9..0673baf 100644 --- a/settings/sk-mlpc2368.dni +++ b/settings/sk-mlpc2368.dni @@ -14,7 +14,7 @@ Count=0 Enabled=0 ShowSource=1 [DebugChecksum] -Checksum=-59974582 +Checksum=1092686877 [Exceptions] StopOnUncaught=_ 0 StopOnThrow=_ 0 @@ -155,7 +155,9 @@ Fmt0={W}0:curr_input 4 0 [Disassemble mode] mode=0 [Breakpoints2] -Count=0 +Bp0=_ 1 "EMUL_CODE" "{$PROJ_DIR$\PROJECT\app\app_serv.c}.258.27" 0 0 1 "" 0 "" 0 +Bp1=_ 1 "EMUL_CODE" "{$PROJ_DIR$\PROJECT\app\app_serv.c}.493.19" 0 0 1 "" 0 "" 0 +Count=2 [Log file] LoggingEnabled=_ 0 LogFile=_ "" diff --git a/settings/sk-mlpc2368.wsdt b/settings/sk-mlpc2368.wsdt index 65b5ccd..7d37961 100644 --- a/settings/sk-mlpc2368.wsdt +++ b/settings/sk-mlpc2368.wsdt @@ -34,7 +34,7 @@ TabID-28963-15244Find in FilesFind-in-FilesTabID-3677-8150Debug LogDebug-Log - 0 + 1 TabID-1122-24249 @@ -52,7 +52,7 @@ - TextEditor$WS_DIR$\OS\app\app_cfg.h005858TextEditor$WS_DIR$\..\..\8\positive_6_24\OS\app\app.c02614311431TextEditor$WS_DIR$\PROJECT\services\console.c010933323332TextEditor$WS_DIR$\OS\uc\lib\lib_def.h011159735981TextEditor$WS_DIR$\PROJECT\data\fram_map.h020665665TextEditor$WS_DIR$\PROJECT\app\journal.c03901170811708TextEditor$WS_DIR$\PROJECT\services\time.c081625625TextEditor$WS_DIR$\PROJECT\app\journal.h03930573070TextEditor$WS_DIR$\PROJECT\data\data.h027688702TextEditor$WS_DIR$\PROJECT\data\datadesc.c05882625226268TextEditor$WS_DIR$\PROJECT\data\data.c034494269426TextEditor$WS_DIR$\PROJECT\menu\menudesc.c08403419934199TextEditor$WS_DIR$\PROJECT\services\coin.h00697697TextEditor$WS_DIR$\PROJECT\services\coin.c04621202120TextEditor$WS_DIR$\PROJECT\app\app_serv.c0455159871598714TextEditor$WS_DIR$\PROJECT\data\datadesc.h01214641464TextEditor$WS_DIR$\OS\app\app.c02716591659TextEditor$WS_DIR$\PROJECT\drivers\fiscal\fiscal.h012575157517TextEditor$WS_DIR$\PROJECT\services\mode.c028763763TextEditor$WS_DIR$\PROJECT\drivers\keyboard\keyboard.h00470470TextEditor$WS_DIR$\OS\uc\os_ii\source\os_core.c013595689856898TextEditor$WS_DIR$\PROJECT\app\app_serv.h06122392239TextEditor$WS_DIR$\PROJECT\menu\menu.c016245484548TextEditor$WS_DIR$\PROJECT\drivers\lcd\lcd.c028669536953TextEditor$WS_DIR$\PROJECT\menu\menu.h062922920100000010000001 + TextEditor$WS_DIR$\OS\app\app_cfg.h005858TextEditor$WS_DIR$\..\..\8\positive_6_24\OS\app\app.c02614311431TextEditor$WS_DIR$\PROJECT\services\console.c010933323332TextEditor$WS_DIR$\OS\uc\lib\lib_def.h011159735981TextEditor$WS_DIR$\PROJECT\app\journal.c03901170811708TextEditor$WS_DIR$\PROJECT\services\time.c081625625TextEditor$WS_DIR$\PROJECT\data\data.c034494269426TextEditor$WS_DIR$\PROJECT\services\coin.h00882882TextEditor$WS_DIR$\PROJECT\menu\menudesc.c08833568335683TextEditor$WS_DIR$\PROJECT\drivers\fiscal\fiscal.h02114471464TextEditor$WS_DIR$\PROJECT\services\mode.c028763763TextEditor$WS_DIR$\PROJECT\drivers\keyboard\keyboard.h00470470TextEditor$WS_DIR$\OS\uc\os_ii\source\os_core.c013595689856898TextEditor$WS_DIR$\PROJECT\app\app_serv.h05020882088TextEditor$WS_DIR$\PROJECT\menu\menu.c016245484548TextEditor$WS_DIR$\PROJECT\drivers\lcd\lcd.c028669536953TextEditor$WS_DIR$\PROJECT\menu\menu.h06292292TextEditor$WS_DIR$\PROJECT\data\fram_map.h00815815TextEditor$WS_DIR$\PROJECT\menu\menudesc.h03622922292TextEditor$WS_DIR$\PROJECT\app\journal.h06740654065TextEditor$WS_DIR$\PROJECT\services\fr.c06161629616311TextEditor$WS_DIR$\PROJECT\drivers\fiscal\fiscal.c07581951719517TextEditor$WS_DIR$\OS\app\app.c02711311131TextEditor$WS_DIR$\OS\uc\os_ii\source\os_q.c04342250222502TextEditor$WS_DIR$\PROJECT\services\coin.c05920442044TextEditor$WS_DIR$\PROJECT\data\data.h04011851185TextEditor$WS_DIR$\PROJECT\data\datadesc.c0831372023720226TextEditor$WS_DIR$\OS\uc\os_ii\source\os_time.c02171031110311TextEditor$WS_DIR$\PROJECT\app\app_serv.c02451685016850TextEditor$WS_DIR$\PROJECT\data\datadesc.h002362480100000010000001