Compare commits
	
		
			22 Commits
		
	
	
		
			v1.0.0
			...
			neuhauser-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1173732172 | |||
| 1b933c05a6 | |||
| ac45ebb926 | |||
| 9af39fa83f | |||
| 17ae11212a | |||
| 89b7589600 | |||
| 179d3348b9 | |||
| b43fa274bd | |||
| 0ce630dfa3 | |||
| 0671a6dde6 | |||
| d7757773bd | |||
| 99a3c34d53 | |||
| 6ce8a86c5f | |||
| bcd5aaf932 | |||
| acb88efc5a | |||
| e9b10166d2 | |||
| 33731faba9 | |||
| 15700a363d | |||
| 506a665592 | |||
| 
						
						
							
						
						7679eb9481
	
				 | 
					
					
						|||
| a8de97a528 | |||
| ed6592c273 | 
@@ -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);
 | 
			
		||||
 | 
			
		||||
QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg);
 | 
			
		||||
int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration *cfg);
 | 
			
		||||
 | 
			
		||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(       // deprecated
 | 
			
		||||
                                            parking_tariff_t *tariff,
 | 
			
		||||
                                            time_t start_parking_time,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,36 +13,22 @@
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
class Calculator {
 | 
			
		||||
    QDateTime m_start;
 | 
			
		||||
    mutable uint16_t m_timeStepCompensation = 0;
 | 
			
		||||
public:
 | 
			
		||||
    mutable QList<int> m_timeSteps;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    Calculator(Calculator const &other) = delete;
 | 
			
		||||
    void operator=(Calculator const &) = delete;
 | 
			
		||||
 | 
			
		||||
    static Calculator &GetInstance() {
 | 
			
		||||
        static Calculator c;
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
    void ResetTimeSteps() { m_timeSteps.clear(); }
 | 
			
		||||
    QList<int> timeSteps() const { return m_timeSteps; }
 | 
			
		||||
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// Gets duration in seconds from cost
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,19 @@
 | 
			
		||||
#include <QFileInfo>
 | 
			
		||||
#include <QDateTime>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QList>
 | 
			
		||||
 | 
			
		||||
static Calculator calculator;
 | 
			
		||||
QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg) {
 | 
			
		||||
    return Calculator::GetInstance().GetTimeSteps(cfg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration *cfg) {
 | 
			
		||||
    // for each new sell-procedure, recomute the timesteps. implicitly, set
 | 
			
		||||
    // the minimal parking time.
 | 
			
		||||
    Calculator::GetInstance().ResetTimeSteps();
 | 
			
		||||
    Calculator::GetInstance().GetTimeSteps(cfg);
 | 
			
		||||
    return qRound(cfg->getPaymentOptions().pop_min_time);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int CALCULATE_LIBRARY_API get_zone_nr(int zone)
 | 
			
		||||
{
 | 
			
		||||
@@ -98,6 +109,8 @@ void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
 | 
			
		||||
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown)
 | 
			
		||||
{
 | 
			
		||||
    qCritical() << "   compute_next_timestep()     currentTimeMinutes: " << currentTimeMinutes;
 | 
			
		||||
    qCritical() << "   compute_next_timestep() up/down (1=up, 0=down): " << UpDown;
 | 
			
		||||
 | 
			
		||||
    Configuration const *cfg = tariff;
 | 
			
		||||
 | 
			
		||||
    // compute payment method id (e.g. Linear=3, Steps=4)
 | 
			
		||||
@@ -124,7 +137,8 @@ int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int cu
 | 
			
		||||
    // without given YearPeriod, SpecialDays and SpecialDaysWorktime
 | 
			
		||||
    if (paymentMethodId == PaymentMethod::Steps)
 | 
			
		||||
    {
 | 
			
		||||
        static const QList<int> stepList = calculator.GetTimeSteps(tariff);
 | 
			
		||||
        const QList<int> stepList = Calculator::GetInstance().GetTimeSteps(tariff);
 | 
			
		||||
        qCritical() << "   compute_next_timestep()     timeSteps:" << stepList;
 | 
			
		||||
 | 
			
		||||
        int currentStepIndex = stepList.indexOf(currentTimeMinutes);
 | 
			
		||||
 | 
			
		||||
@@ -225,7 +239,7 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
 | 
			
		||||
    start = start.toLocalTime().addSecs(start_parking_time * 60);
 | 
			
		||||
    QDateTime end(start);
 | 
			
		||||
    if (start.isValid()) {
 | 
			
		||||
        double cost = calculator.GetCostFromDuration(
 | 
			
		||||
        double cost = Calculator::GetInstance().GetCostFromDuration(
 | 
			
		||||
                    tariff,
 | 
			
		||||
                    tariff->getPaymentOptions().pop_payment_method_id,
 | 
			
		||||
                    start,
 | 
			
		||||
@@ -284,7 +298,7 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (start_parking_time.isValid()) {
 | 
			
		||||
        double cost = calculator.GetCostFromDuration(
 | 
			
		||||
        double cost = Calculator::GetInstance().GetCostFromDuration(
 | 
			
		||||
                        tariff,
 | 
			
		||||
                        tariff->getPaymentOptions().pop_payment_method_id,
 | 
			
		||||
                        start_parking_time,         // starting time
 | 
			
		||||
@@ -327,7 +341,7 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
 | 
			
		||||
        qCritical() << "      start (cs): " << cs;
 | 
			
		||||
        qCritical() << "           price: " << price;
 | 
			
		||||
 | 
			
		||||
        duration = calculator.GetDurationFromCost(tariff,
 | 
			
		||||
        duration = Calculator::GetInstance().GetDurationFromCost(tariff,
 | 
			
		||||
                                                  tariff->getPaymentOptions().pop_payment_method_id,
 | 
			
		||||
                                                  cs.toLocal8Bit().constData(),
 | 
			
		||||
                                                  price, false, true).c_str();
 | 
			
		||||
@@ -352,7 +366,7 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
 | 
			
		||||
    CalcState calcState;
 | 
			
		||||
    if (start_parking_time.isValid()) {
 | 
			
		||||
        QString cs = start_parking_time.toString(Qt::ISODate);
 | 
			
		||||
        QString endTime = calculator.GetDurationFromCost(
 | 
			
		||||
        QString endTime = Calculator::GetInstance().GetDurationFromCost(
 | 
			
		||||
                    tariff,
 | 
			
		||||
                    tariff->getPaymentOptions().pop_payment_method_id,
 | 
			
		||||
                    cs.toLocal8Bit().constData(),
 | 
			
		||||
@@ -380,7 +394,7 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(parking_tariff
 | 
			
		||||
    CalcState calcState;
 | 
			
		||||
    if (start_parking_time.isValid()) {
 | 
			
		||||
 | 
			
		||||
        ticketEndTime = calculator.GetDailyTicketDuration(tariff,
 | 
			
		||||
        ticketEndTime = Calculator::GetInstance().GetDailyTicketDuration(tariff,
 | 
			
		||||
                                                            start_parking_time,
 | 
			
		||||
                                                            tariff->getPaymentOptions().pop_payment_method_id,
 | 
			
		||||
                                                            false);    // carry over
 | 
			
		||||
 
 | 
			
		||||
@@ -696,13 +696,27 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
 | 
			
		||||
    QList<int> timeSteps;
 | 
			
		||||
    if (m_timeSteps.size() > 0) {
 | 
			
		||||
        //qCritical() << __PRETTY_FUNCTION__ << "timeSteps:" << m_timeSteps;
 | 
			
		||||
        return m_timeSteps;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QDateTime start = QDateTime::currentDateTime();
 | 
			
		||||
    start.setTime(QTime(start.time().hour(), start.time().minute(), 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;
 | 
			
		||||
 | 
			
		||||
    qCritical() << __PRETTY_FUNCTION__ << "             start parking time:" << start.toString(Qt::ISODate);
 | 
			
		||||
    qCritical() << __PRETTY_FUNCTION__ << "              payment option id:" << pop_id;
 | 
			
		||||
    qCritical() << __PRETTY_FUNCTION__ << "      payment option carry over:" << pop_carry_over;
 | 
			
		||||
 | 
			
		||||
    if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
 | 
			
		||||
        //qCritical() << __PRETTY_FUNCTION__ << "payment option time step config:" << "TimeStepConfig::DYNAMIC";
 | 
			
		||||
 | 
			
		||||
        uint16_t timeStepCompensation = 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;
 | 
			
		||||
@@ -716,14 +730,11 @@ QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
 | 
			
		||||
                        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;
 | 
			
		||||
 | 
			
		||||
                                QDateTime carryOver = m_start;
 | 
			
		||||
                                QDateTime carryOver = start;
 | 
			
		||||
                                carryOver = carryOver.addDays(1);
 | 
			
		||||
                                carryOver.setTime(QTime(0, 0, 0));
 | 
			
		||||
 | 
			
		||||
                                int const timeStep = std::ceil(m_start.secsTo(carryOver) / 60.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)")
 | 
			
		||||
@@ -731,12 +742,19 @@ QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
 | 
			
		||||
                                            .arg(timeStep).arg(duration.pun_duration_max);
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                                qCritical() << __PRETTY_FUNCTION__ << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
 | 
			
		||||
 | 
			
		||||
                                // set dynamic minimal parking time
 | 
			
		||||
                                cfg->getPaymentOptions().pop_min_time = timeStep;
 | 
			
		||||
 | 
			
		||||
                                qCritical() << __PRETTY_FUNCTION__ << "  computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
 | 
			
		||||
 | 
			
		||||
                                duration.pun_duration = timeStep;
 | 
			
		||||
                                m_timeStepCompensation = duration.pun_duration_max - duration.pun_duration;
 | 
			
		||||
                                timeSteps << duration.pun_duration;
 | 
			
		||||
                                timeStepCompensation = duration.pun_duration_max - duration.pun_duration;
 | 
			
		||||
                                m_timeSteps << duration.pun_duration;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                duration.pun_duration = duration.pun_duration_max - m_timeStepCompensation;
 | 
			
		||||
                                timeSteps << duration.pun_duration;;
 | 
			
		||||
                                duration.pun_duration = duration.pun_duration_max - timeStepCompensation;
 | 
			
		||||
                                m_timeSteps << duration.pun_duration;;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            cfg->Duration.erase(search);
 | 
			
		||||
@@ -756,15 +774,19 @@ QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
 | 
			
		||||
            // TODO
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        qCritical() << __PRETTY_FUNCTION__ << "payment option time step config:" << "TimeStepConfig::STATIC";
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
            m_timeSteps << durationUnit;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return timeSteps;
 | 
			
		||||
    qCritical() << __PRETTY_FUNCTION__ << "NEW timeSteps:" << m_timeSteps;
 | 
			
		||||
 | 
			
		||||
    return m_timeSteps;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep) const {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,18 +54,22 @@ int main() {
 | 
			
		||||
    cout << endl;
 | 
			
		||||
 | 
			
		||||
    if (isParsed) {
 | 
			
		||||
        QDateTime start = QDateTime::currentDateTime();
 | 
			
		||||
        start.setTime(QTime(start.time().hour(), start.time().minute(), 0));
 | 
			
		||||
        Calculator calculator(start);
 | 
			
		||||
        QList<int> timeSteps = calculator.GetTimeSteps(&cfg);
 | 
			
		||||
        int minParkingTime = get_minimal_parkingtime(&cfg);
 | 
			
		||||
        QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
 | 
			
		||||
        qCritical() << timeSteps;
 | 
			
		||||
        int Down = 0;
 | 
			
		||||
        int Up = 1;
 | 
			
		||||
        //compute_next_timestep(&cfg, )
 | 
			
		||||
 | 
			
		||||
        for (int i=0; i<timeSteps.size(); ++i) {
 | 
			
		||||
            uint32_t price = calculator.GetPriceForTimeStep(&cfg, timeSteps.at(i));
 | 
			
		||||
            uint32_t duration = calculator.GetDurationForPrice(&cfg, price);
 | 
			
		||||
            qCritical() << "nextTimeStep relative to start:"
 | 
			
		||||
                        << duration << start.addSecs(duration * 60)
 | 
			
		||||
                        << "(price so far:" << price << ")";
 | 
			
		||||
            int nextTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Up);
 | 
			
		||||
            qCritical() << "nextTimeStep" << nextTimeStep;
 | 
			
		||||
 | 
			
		||||
//            uint32_t price = calculator.GetPriceForTimeStep(&cfg, timeSteps.at(i));
 | 
			
		||||
//            uint32_t duration = calculator.GetDurationForPrice(&cfg, price);
 | 
			
		||||
//            qCritical() << "nextTimeStep relative to start:"
 | 
			
		||||
//                        << duration << start.addSecs(duration * 60)
 | 
			
		||||
//                        << "(price so far:" << price << ")";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user