Исправляем ошибки

This commit is contained in:
Dmitriy 2025-05-20 23:01:28 +03:00
parent 0e6ab22246
commit e59c6054b6
11 changed files with 2245 additions and 2146 deletions

View File

@ -799,6 +799,10 @@ void AppVladEventProcess(CPU_INT32U event)
}
}
CPU_INT32U password;
GetData(&PassDescAdmin, &password, 0, DATA_FLAG_SYSTEM_INDEX);
if(get_abonement_data()->uid[0] != password) break;
if(app_state.user_menu == USER_MENU_IDLE)
{
// ïðîâåðèì - íå íàäî ëè áîíóñû î÷èñòèòü
@ -827,61 +831,67 @@ void AppVladEventProcess(CPU_INT32U event)
if(read_mifare_card() != NULL)
{
// ïîïîëíÿåì êàðòó
mifaredata_t* data = get_mifare_data();
abonement_data* data = get_abonement_data();
uint32_t pay = 0, bonus = 0, best_before = 0;
uint32_t counter_money = 0, counter_bonus = 0, counter_runs = 0;
uint32_t counter_money_sum = 0, counter_bonus_sum = 0, counter_runs_sum = 0;
uint32_t all_counter_money = 0;
GetData(&AbonementMoneyDesc, &pay, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&AbonementBonusDesc, &bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&AbonementBestBeforeDesc, &best_before, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterMoneyAbonementDesc, &counter_money, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterBonusAbonementDesc, &counter_bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterRunsAbonementDesc, &counter_runs, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterMoneyAbonementDesc, &counter_money_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterBonusAbonementDesc, &counter_bonus_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterRunsAbonementDesc, &counter_runs_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterAbonementMoneyDesc, &all_counter_money, 0, DATA_FLAG_DIRECT_INDEX);
counter_money += pay;
counter_bonus += bonus;
counter_runs++;
counter_money_sum += pay;
counter_bonus_sum += bonus;
counter_runs_sum++;
all_counter_money += pay;
SetData(&CounterMoneyAbonementDesc, &counter_money, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterBonusAbonementDesc, &counter_bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterRunsAbonementDesc, &counter_runs, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterMoneyAbonementDesc, &counter_money_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterBonusAbonementDesc, &counter_bonus_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterRunsAbonementDesc, &counter_runs_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterAbonementMoneyDesc, &all_counter_money, 0, DATA_FLAG_DIRECT_INDEX);
uint32_t SystemTime = GetTimeSec() + best_before * 24L * 60L;
data->money += pay;
data->bonus = bonus;
data->best_before = SystemTime;
if(!write_mifare_card())
CPU_INT32U password;
GetData(&PassDescAdmin, &password, 0, DATA_FLAG_SYSTEM_INDEX);
if(data->uid[0] == password)
{
app_state.user_menu = USER_MENU_IDLE;
}
else
{
app_state.user_menu = USER_MENU_FINISH_PAY_BONUS_CARD;
PrintFinishPayMenu();
RefreshMenu();
PlayMusicFile(52);
uint32_t pay = 0, bonus = 0, best_before = 0;
uint32_t counter_money = 0, counter_bonus = 0, counter_runs = 0;
uint32_t counter_money_sum = 0, counter_bonus_sum = 0, counter_runs_sum = 0;
uint32_t all_counter_money = 0;
GetData(&AbonementMoneyDesc, &pay, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&AbonementBonusDesc, &bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&AbonementBestBeforeDesc, &best_before, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterMoneyAbonementDesc, &counter_money, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterBonusAbonementDesc, &counter_bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterRunsAbonementDesc, &counter_runs, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterMoneyAbonementDesc, &counter_money_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterBonusAbonementDesc, &counter_bonus_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterRunsAbonementDesc, &counter_runs_sum, 4, DATA_FLAG_DIRECT_INDEX);
GetData(&CounterAbonementMoneyDesc, &all_counter_money, 0, DATA_FLAG_DIRECT_INDEX);
counter_money += pay;
counter_bonus += bonus;
counter_runs++;
counter_money_sum += pay;
counter_bonus_sum += bonus;
counter_runs_sum++;
all_counter_money += pay;
SetData(&CounterMoneyAbonementDesc, &counter_money, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterBonusAbonementDesc, &counter_bonus, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterRunsAbonementDesc, &counter_runs, app_state.current_abonement, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterMoneyAbonementDesc, &counter_money_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterBonusAbonementDesc, &counter_bonus_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterRunsAbonementDesc, &counter_runs_sum, 4, DATA_FLAG_DIRECT_INDEX);
SetData(&CounterAbonementMoneyDesc, &all_counter_money, 0, DATA_FLAG_DIRECT_INDEX);
uint32_t SystemTime = GetTimeSec() + best_before * 24L * 60L;
data->money += pay;
data->bonus = bonus;
data->best_before = SystemTime;
data->type_abonement = app_state.current_abonement;
if(!write_mifare_card())
{
app_state.user_menu = USER_MENU_IDLE;
}
else
{
app_state.user_menu = USER_MENU_FINISH_PAY_BONUS_CARD;
PrintFinishPayMenu();
RefreshMenu();
PlayMusicFile(52);
}
}
}
@ -890,10 +900,13 @@ void AppVladEventProcess(CPU_INT32U event)
if(app_state.user_menu == USER_MENU_ABONENT_PROCESSING)
{
mifaredata_t* data = get_mifare_data();
abonement_data* data = get_abonement_data();
CPU_INT32U password;
GetData(&PassDescAdmin, &password, 0, DATA_FLAG_SYSTEM_INDEX);
if(data->money + data->bonus > app_state.moneytopay
&& read_mifare_card() != NULL)
if(read_mifare_card() != NULL
&& data->money + data->bonus > app_state.moneytopay
&& data->uid[0] == password)
{
int delta = data->money - app_state.moneytopay;
data->bonus -= (delta < 0) ? delta : 0;
@ -901,7 +914,7 @@ void AppVladEventProcess(CPU_INT32U event)
if(!write_mifare_card())
{
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_CARD_REJECTED, 0);
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_ABONEMENT_REJECTED, 0);
UserPrintPaymentErrorMenu();
RefreshMenu();
app_state.user_menu = USER_MENU_CARD_FAIL;
@ -910,14 +923,14 @@ void AppVladEventProcess(CPU_INT32U event)
else
{
SetAcceptedMoney(app_state.moneytopay);
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_CARD_ACCEPTED, app_state.moneytopay);
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_ABONEMENT_ACCEPTED, app_state.moneytopay);
app_state.user_menu = USER_MENU_CARD_OK;
PostUserEvent(EVENT_FINISH_PAYMENT_ABONEMENT_SOLARIUM);
}
}
else
{
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_CARD_REJECTED, 0);
SaveEventRecord(app_state.ch_index, JOURNAL_EVENT_ABONEMENT_REJECTED, 0);
UserPrintPaymentErrorMenu();
RefreshMenu();
app_state.user_menu = USER_MENU_CARD_FAIL;
@ -2418,7 +2431,7 @@ void PrintStartReadCardMenu(void)
void PrintBalanceMenu(void)
{
char str[32];
mifaredata_t* data = get_mifare_data();
abonement_data* data = get_abonement_data();
PrintUserMenuStr(" Âàøà êàðòà çàãàðà: ", 0);

View File

@ -194,6 +194,12 @@ void GetEventStr(char* str, char event)
case JOURNAL_EVENT_CARD_REJECTED:
sprintf(str, "Áàíê.îïëàòà ");
break;
case JOURNAL_EVENT_ABONEMENT_ACCEPTED:
sprintf(str, "ÁÊÇ.îïëàòà ");
break;
case JOURNAL_EVENT_ABONEMENT_REJECTED:
sprintf(str, "ÁÊÇ.îïëàòà ");
break;
case JOURNAL_EVENT_START_SESSION:
#if defined(BOARD_CENTRAL_CARWASH)
sprintf(str, "Íà÷.ðàáîòû ");

View File

@ -102,7 +102,10 @@ typedef struct{
// ÂÑÅ ÎØÈÁÊÈ ÔÐ ÔÀÒÀËÜÍÛÅ
#define ERROR_FR 53
#define JOURNAL_EVENTS_COUNT (ERROR_FR+FR_ERROR_NUMBER) // ÷èñëî ñîáûòèé
#define JOURNAL_EVENT_ABONEMENT_ACCEPTED 54 // ïðèíÿò àáîíåìåíò, ñóììà áåçíàëà
#define JOURNAL_EVENT_ABONEMENT_REJECTED 55 // àáîíåìåíò îòêëîíåíà
#define JOURNAL_EVENTS_COUNT (JOURNAL_EVENT_ABONEMENT_REJECTED+FR_ERROR_NUMBER) // ÷èñëî ñîáûòèé
// êàíàë
CPU_INT08U channel;

View File

@ -5119,7 +5119,7 @@ CPU_INT08U const AbonementIndexHour_str0[] = "
CPU_INT08U const AbonementIndexHour_str1[] = "ÇÎËÎÒÎé";
CPU_INT08U const AbonementIndexHour_str2[] = "ÏËÀÒÈÍÎÂÛé";
CPU_INT08U const AbonementIndexHour_str3[] = "ÀËÌÀÇÍÛé";
CPU_INT08U const *AbonementIndexHourList[] = {AbonementIndexHour_str0, AbonementIndexHour_str1/*, AbonementIndexHour_str2, AbonementIndexHour_str3*/};
CPU_INT08U const *AbonementIndexHourList[] = {AbonementIndexHour_str0, AbonementIndexHour_str1, AbonementIndexHour_str2, AbonementIndexHour_str3};
CPU_INT32U abonement_index;
@ -5305,9 +5305,9 @@ CPU_INT08U const AbonementBestBeforeName[] = "
TDataDescStruct const AbonementBestBeforeDesc = {
DATA_DESC_EDIT, // òèï äåñêðèïòîðà
DATA_TYPE_ULONG, // òèï ïàðàìåòðà
DATA_LOC_FRAM, // ðàñïîëîæåíèå ïàðàìåòðà
DATA_LOC_FRAM, // ðàñïîëîæåíèå ïàðàìåòðà
DATA_IS_ARRAY, // ïðèçíàê ìàññèâà
2, // ðàçìåð ìàññèâà
4, // ðàçìåð ìàññèâà
&AbonementIndexDesc, // óêàçàòåëü íà äåñêðèïòîð èíäåêñà ìàññèâà
(void*)offsetof(TFramMap, AbonementBestBefore), // óêàçàòåëü íà ïåðåìåííóþ èëè àäðåñ FRAM
(void*)&AbonementBestBeforeRange, // óêàçàòåëü íà ãðàíèöû ïàðàìåòðà

View File

@ -3,8 +3,13 @@
#include "rfid-spi.h"
#include "time.h"
#include "CRC16.h"
#include "datadesc.h"
// äàííûå ñ÷èòàííûå ñ êàðòû
mifaredata_t mifare_card_data;
// âàëèäíûå äàííûå àáîíåìåíòà
abonement_data abonement;
#define START_BLOCK 12
#define NR_KNOWN_KEYS 2
@ -24,6 +29,16 @@ void set_mifare_data(mifaredata_t* data)
memcpy(&mifare_card_data, &data, sizeof(mifaredata_t));
}
abonement_data* get_abonement_data()
{
return &abonement;
}
void set_abonement_data(abonement_data* data)
{
memcpy(&abonement, &data, sizeof(abonement_data));
}
/**
* Calculates the bit pattern needed for the specified access bits. In the [C1 C2 C3] tuples C1 is MSB (=4) and C3 is LSB (=1).
*/
@ -143,6 +158,29 @@ mifaredata_t* read_mifare_card()
if(block%4 == 3) block++;
}
CPU_INT32U crc1;
crc1 = crc16((unsigned char*)&mifare_card_data.abonement_data_copy1.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
if(crc1 == mifare_card_data.abonement_data_copy1.crc)
{
memcpy(&abonement, &mifare_card_data.abonement_data_copy1.init, sizeof(abonement_data));
}
else
{
CPU_INT32U crc2 = crc16((unsigned char*)&mifare_card_data.abonement_data_copy2.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
if(crc2 == mifare_card_data.abonement_data_copy2.crc)
{
memcpy(&abonement, &mifare_card_data.abonement_data_copy2.init, sizeof(abonement_data));
}
else
{
for(uint8_t i = 0; i < sizeof(abonement_data); i++)
{
((uint8_t *)&abonement)[i] = 0x00;
}
}
}
return &mifare_card_data;
}
@ -185,6 +223,16 @@ bool write_mifare_card()
return false;
}
CPU_INT32U crc;
memcpy(&mifare_card_data.abonement_data_copy1.init, &abonement, sizeof(abonement_data) - sizeof(CPU_INT32U));
crc = crc16((unsigned char*)&mifare_card_data.abonement_data_copy1.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
mifare_card_data.abonement_data_copy1.crc = crc;
memcpy(&mifare_card_data.abonement_data_copy2.init, &abonement, sizeof(abonement_data) - sizeof(CPU_INT32U));
crc = crc16((unsigned char*)&mifare_card_data.abonement_data_copy2.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
mifare_card_data.abonement_data_copy2.crc = crc;
for(uint8_t i = 0; i < sizeof(mifare_card_data); i += 16)
{
status = pcd_authenticate(PICC_CMD_MF_AUTH_KEY_B, block, &key, get_uid());
@ -224,28 +272,50 @@ void stop_card_working()
mifaredata_t* init_mifare_card_data()
{
for(uint8_t i = 0; i < sizeof(mifare_card_data); i++)
for(uint8_t i = 0; i < sizeof(mifaredata_t); i++)
{
((uint8_t *)&mifare_card_data)[i] = 0x00;
}
mifare_card_data.init = 0xDEADBEEF;
for(uint8_t i = 0; i < sizeof(abonement_data); i++)
{
((uint8_t *)&abonement)[i] = 0x00;
}
abonement.init = 0xDEADBEEF;
CPU_INT32U password;
GetData(&PassDescAdmin, &password, 0, DATA_FLAG_SYSTEM_INDEX);
abonement.uid[0] = password;
return &mifare_card_data;
}
bool is_empty_mifare_card()
{
return mifare_card_data.init != 0xDEADBEEF;
bool empty = false;
CPU_INT32U crc1, crc2;
crc1 = crc16((unsigned char*)&mifare_card_data.abonement_data_copy1.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
crc2 = crc16((unsigned char*)&mifare_card_data.abonement_data_copy2.init, sizeof(abonement_data) - sizeof(CPU_INT32U));
if((mifare_card_data.abonement_data_copy1.init != 0xDEADBEEF || crc1 != mifare_card_data.abonement_data_copy1.crc)
&& (mifare_card_data.abonement_data_copy2.init != 0xDEADBEEF || crc2 != mifare_card_data.abonement_data_copy2.crc)
)
{
empty = true;
}
return empty;
}
bool need_clear_bonus()
{
uint32_t SystemTime = GetTimeSec();
if(SystemTime > mifare_card_data.best_before)
if(SystemTime > abonement.best_before)
{
mifare_card_data.bonus = 0;
abonement.bonus = 0;
return true;
}

View File

@ -5,22 +5,35 @@
#include <stdbool.h>
typedef struct {
uint32_t init; // 4 - îáÿçàòåëüíî äîëæíà áûòü â íà÷àëå
uint32_t uid[5]; // 20
uint32_t init; // 4
uint32_t uid[10]; // 40
uint32_t money; // 4
uint32_t bonus; // 4
uint32_t type_abonement; // 4
uint32_t number_abonement; // 4
uint32_t best_before; // 4
uint32_t crc; // 4
uint8_t reserv[32]; // 32
} abonement_data; // 48
typedef struct {
abonement_data abonement_data_copy1; // 48
abonement_data abonement_data_copy2; // 48
} mifaredata_t; // 96
extern mifaredata_t* get_mifare_data();
extern void set_mifare_data(mifaredata_t* data);
/// @brief Óñòàíîâêà äàííûõ àáîíåìåíòà
/// @param data
extern void set_abonement_data(abonement_data* data);
/// @brief Äàííûå àáîíåìåíòà, ïîëó÷åíèå
/// @return
extern abonement_data* get_abonement_data();
extern mifaredata_t* read_mifare_card();
extern bool write_mifare_card();
extern mifaredata_t* init_mifare_card_data();

View File

@ -25,7 +25,7 @@ if not "%~1" == "" goto debugFile
@echo on
"C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --backend -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
"C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --backend -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
@echo off
goto end
@ -34,7 +34,7 @@ goto end
@echo on
"C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" "--debug_file=%~1" --backend -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
"C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" "--debug_file=%~1" --backend -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
@echo off
:end

View File

@ -23,9 +23,9 @@
if ($debugfile -eq "")
{
& "C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --backend -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
& "C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --backend -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
}
else
{
& "C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --debug_file=$debugfile --backend -f "C:\work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
& "C:\Program Files\IAR Systems\Embedded Workbench 9.0\common\bin\cspybat" -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.general.xcl" --debug_file=$debugfile --backend -f "C:\git_work\solarium.vlad\settings\sk-mlpc2368.Solarium_Vlad.driver.xcl"
}

View File

@ -2,7 +2,7 @@
"C:\Program Files\IAR Systems\Embedded Workbench 9.0\arm\bin\armJLINK.dll"
"C:\work\solarium.vlad\Solarium Vlad\Exe\sk_mlpc2368.out"
"C:\git_work\solarium.vlad\Solarium Vlad\Exe\sk_mlpc2368.out"
--plugin="C:\Program Files\IAR Systems\Embedded Workbench 9.0\arm\bin\armbat.dll"

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff