Compare commits

..

12 Commits

Author SHA1 Message Date
d7757773bd Implement get_calculator() 2024-01-22 14:29:02 +01:00
99a3c34d53 forward declare class Calculator 2024-01-22 14:28:22 +01:00
6ce8a86c5f Added get_calculator(): access for Calculator instance 2024-01-22 14:26:57 +01:00
bcd5aaf932 Minor: add debug output 2024-01-22 13:41:50 +01:00
acb88efc5a re-add 'private' 2024-01-22 13:37:44 +01:00
e9b10166d2 Minor: implement getPaymentOptions() for const. Add getPaymentOptions() for non-const 2024-01-22 13:33:23 +01:00
33731faba9 GetTimeSteps(): compute minimal parking time and set pop_min_time. 2024-01-22 13:31:00 +01:00
15700a363d Remove m_start member.
Add defualt parameter start for GetTimeSteps().
2024-01-22 13:28:38 +01:00
506a665592 provide GetPaymentOptions() with two signatures. 2024-01-22 13:27:21 +01:00
7679eb9481 Remove 'VERSION' in project file ...
'VERSION' conflicts with 'EXTRA_QMAKEVARS_PRE' in yocto recipe.
2024-01-22 10:50:59 +01:00
a8de97a528 Initialize TimeBase multimap. 2024-01-22 10:24:32 +01:00
ed6592c273 Add:
multimap<int, ATBTimeBase> TimeBase
2024-01-22 10:23:41 +01:00
7 changed files with 90 additions and 90 deletions

View File

@@ -111,6 +111,9 @@ int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown);
class Calculator;
Calculator CALCULATE_LIBRARY_API *get_calculator();
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
parking_tariff_t *tariff,
time_t start_parking_time,

View File

@@ -13,36 +13,8 @@
using namespace std;
class Calculator {
QDateTime m_start;
mutable uint16_t m_timeStepCompensation = 0;
public:
explicit Calculator() = default;
explicit Calculator(QDateTime const start) : m_start(start) {
m_start.setTime(QTime(start.time().hour(), start.time().minute(), 0));
qCritical() << "init m_start time:" << m_start.toString(Qt::ISODate);
}
void setStartDateTime(QDateTime const &start) {
m_start = start;
m_start.setTime(QTime(start.time().hour(), start.time().minute(), 0));
qCritical() << "set m_start time:" << m_start.toString(Qt::ISODate);
}
QDateTime const &getStartDateTime() const {
return m_start;
}
QDateTime &getStartDateTime() {
return m_start;
}
void setTimeStepCompensation(uint16_t timeStepCompensation) {
m_timeStepCompensation = timeStepCompensation;
}
uint16_t getTimeStepCompensation() const {
return m_timeStepCompensation;
}
/// <summary>
/// Gets duration in seconds from cost
@@ -72,7 +44,7 @@ public:
// helper function to find time steps for a tariff with PaymentMethod::Steps
// (e.g. Schoenau/Koenigsee)
//
QList<int> GetTimeSteps(Configuration *cfg) const;
QList<int> GetTimeSteps(Configuration *cfg, quint64 startInMinutes = QDateTime::currentSecsSinceEpoch() / 60) const;
QList<int> GetSteps(Configuration *cfg) const { return GetTimeSteps(cfg); }
// additional helper functions

View File

@@ -30,6 +30,7 @@
using namespace std;
using namespace rapidjson;
class Calculator;
class Configuration
{
public:
@@ -49,6 +50,7 @@ public:
multimap<int, ATBDailyTicket> DailyTicket;
multimap<int, ATBTimeRange> TimeRange;
multimap<int, ATBTimeStepConfig> TimeStepConfig;
multimap<int, ATBTimeBase> TimeBase;
/// <summary>
/// Parse JSON string
@@ -57,7 +59,8 @@ public:
/// <returns>Returns operation status bool (OK | FAIL) </returns>
bool ParseJson(Configuration* cfg, const char* json);
ATBPaymentOption const &getPaymentOptions();
ATBPaymentOption &getPaymentOptions();
ATBPaymentOption const &getPaymentOptions() const;
QVector<ATBDailyTicket> const &getDailyTickets() const;
private:

View File

@@ -9,7 +9,8 @@ INCLUDEPATH += $$_PRO_FILE_PWD_/include/mobilisis
INCLUDEPATH += $$_PRO_FILE_PWD_/include/rapidjson
#start version with project neuhauser/galtuer
VERSION=1.0.0
#Version is set in yocto recipe with "EXTRA_QMAKEVARS_PRE"
#VERSION=1.0.0
CONFIG(debug, debug|release) {
win32 {

View File

@@ -11,6 +11,10 @@
static Calculator calculator;
Calculator CALCULATE_LIBRARY_API *get_calculator() {
return &calculator;
}
int CALCULATE_LIBRARY_API get_zone_nr(int zone)
{
if(zone > -1) return zone;

View File

@@ -695,72 +695,86 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
cost, Ticket::s[VALID]);
}
QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
QList<int> timeSteps;
QList<int> Calculator::GetTimeSteps(Configuration *cfg, quint64 startInMinutes) const {
static QList<int> timeSteps;
int const pop_id = cfg->getPaymentOptions().pop_id;
int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over;
int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config;
if (timeSteps.size() == 0) {
int const pop_id = cfg->getPaymentOptions().pop_id;
int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over;
int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config;
if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
if (pop_carry_over) {
int const pop_carry_over_time_range_id = cfg->getPaymentOptions().pop_carry_over_time_range_id;
QTime const carryOverTimeRangeFrom = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from;
QTime const carryOverTimeRangeTo = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to;
qCritical() << " payment option id:" << pop_id;
qCritical() << " payment option carry over:" << pop_carry_over;
qCritical() << "payment option time step config:" << pop_time_step_config;
if (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00
if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) {
int const durationId = itr->second.pra_payment_unit_id;
auto search = cfg->Duration.find(durationId);
if (search != cfg->Duration.end()) {
ATBDuration duration = search->second;
if (durationId == 1) {
//duration.pun_duration_min = search->second.pun_duration_min;
//duration.pun_duration_max = search->second.pun_duration_max;
if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
QDateTime start;
start.setSecsSinceEpoch(startInMinutes * 60);
uint16_t timeStepCompensation = 0;
QDateTime carryOver = m_start;
carryOver = carryOver.addDays(1);
carryOver.setTime(QTime(0, 0, 0));
if (pop_carry_over) {
int const pop_carry_over_time_range_id = cfg->getPaymentOptions().pop_carry_over_time_range_id;
QTime const carryOverTimeRangeFrom = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from;
QTime const carryOverTimeRangeTo = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to;
int const timeStep = std::ceil(m_start.secsTo(carryOver) / 60.0);
if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) {
qCritical()
<< QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)")
.arg(timeStep).arg(duration.pun_duration_min)
.arg(timeStep).arg(duration.pun_duration_max);
break;
if (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00
if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) {
int const durationId = itr->second.pra_payment_unit_id;
auto search = cfg->Duration.find(durationId);
if (search != cfg->Duration.end()) {
ATBDuration duration = search->second;
if (durationId == 1) {
QDateTime carryOver = start;
carryOver = carryOver.addDays(1);
carryOver.setTime(QTime(0, 0, 0));
int const timeStep = std::ceil(start.secsTo(carryOver) / 60.0);
if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) {
qCritical()
<< QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)")
.arg(timeStep).arg(duration.pun_duration_min)
.arg(timeStep).arg(duration.pun_duration_max);
break;
}
qCritical() << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
// set dynamic minimal parking time
cfg->getPaymentOptions().pop_min_time = timeStep;
qCritical() << " computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
duration.pun_duration = timeStep;
timeStepCompensation = duration.pun_duration_max - duration.pun_duration;
timeSteps << duration.pun_duration;
} else {
duration.pun_duration = duration.pun_duration_max - timeStepCompensation;
timeSteps << duration.pun_duration;;
}
duration.pun_duration = timeStep;
m_timeStepCompensation = duration.pun_duration_max - duration.pun_duration;
timeSteps << duration.pun_duration;
} else {
duration.pun_duration = duration.pun_duration_max - m_timeStepCompensation;
timeSteps << duration.pun_duration;;
cfg->Duration.erase(search);
cfg->Duration.insert(pair<int, ATBDuration>(duration.pun_id, duration));
} else { // if (search != cfg->Duration.end()) {
// TODO
}
cfg->Duration.erase(search);
cfg->Duration.insert(pair<int, ATBDuration>(duration.pun_id, duration));
} else { // if (search != cfg->Duration.end()) {
// TODO
}
} else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
// TODO
}
} else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
} else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) {
// TODO
}
} else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) {
} else { // if (pop_carry_over) {
// TODO
}
} else { // if (pop_carry_over) {
// TODO
}
} else {
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{
int const durationId = itr->second.pra_payment_unit_id;
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
timeSteps << durationUnit;
} else {
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{
int const durationId = itr->second.pra_payment_unit_id;
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
timeSteps << durationUnit;
}
}
}

View File

@@ -416,15 +416,15 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
// qCritical() << Customer;
break;
case MemberType::TimeBaseType:
// qCritical() << TimeBase;
cfg->TimeBase.insert(pair<int, ATBTimeRange>(TimeBase.tbase_id, TimeBase));
qCritical() << TimeBase;
cfg->TimeBase.insert(pair<int, ATBTimeBase>(TimeBase.tbase_id, TimeBase));
break;
case MemberType::TimeRangeType:
// qCritical() << TimeRange;
qCritical() << TimeRange;
cfg->TimeRange.insert(pair<int, ATBTimeRange>(TimeRange.time_range_id, TimeRange));
break;
case MemberType::TimeStepConfigType:
// qCritical() << TimeStepConfig;
qCritical() << TimeStepConfig;
cfg->TimeStepConfig.insert(pair<int, ATBTimeStepConfig>(TimeStepConfig.tsconfig_id, TimeStepConfig));
break;
default:
@@ -442,7 +442,10 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
const ATBPaymentOption & Configuration::getPaymentOptions()
{
ATBPaymentOption const &Configuration::getPaymentOptions() const {
return this->currentPaymentOptions;
}
ATBPaymentOption &Configuration::getPaymentOptions() {
return this->currentPaymentOptions;
}