Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/K08 Get Composite Schedule #745

Merged

Conversation

folkengine
Copy link
Contributor

@folkengine folkengine commented Aug 12, 2024

Describe your changes

This PR contains the complete support for the K08 requirement within the OCPP 2.0.1 standard. In includes the follow work:

  • Migration of the new Composite Schedule algorithm from v1.6 to v2.0.1.
  • Added support for Charging Station External Constraints Profiles, which are new in 2.0.1.
  • Added a message handler for GetCompositeScheduleRequest.

Core Composite Schedule Algorithm

This PR is for the core algorithm for calculating an individual Composite Schedule from a selection of Profiles within a given time range. This code is a refactoring of the code recently updated for the 1.6 version of the standard.

NOTE: As a part of this PR we have decided to keep the same names for methods to match the 1.6 version even though we felt there might be an opportunity to refactor them to clearly distinguish the different parts of the process of generating a Composite Schedule.

Here is the flow for the code in question:

sequenceDiagram
    ChargePoint->>+SmartChargingHandler: calculate_composite_schedule()
    note right of SmartChargingHandler: Determine profiles that<br/>apply to the given range
    SmartChargingHandler->>SmartChargingHandler: get_valid_profiles()

    SmartChargingHandler->>+EVSEManager: get_valid_profiles()
    EVSEManager-->>-SmartChargingHandler: profiles in range
    SmartChargingHandler->>+Profile: calculate_profile(profiles)
    Profile-->>-SmartChargingHandler: periods
    note right of SmartChargingHandler: Calculate Composite Schedule<br/>for charge_point_max<br/>tx_default<br/>charge_point_external_constraints<br/>and tx profiles
    SmartChargingHandler->>+Profile: calculate_composite_schedule(charge_point_external_constraints)
    Profile-->>-SmartChargingHandler: charge_point_external_constraints composite_schedule 
    SmartChargingHandler->>+Profile: calculate_composite_schedule(cp_max_periods)
    Profile-->>-SmartChargingHandler: charge_point_max composite_schedule 
    SmartChargingHandler->>+Profile: calculate_composite_schedule(tx_default_periods)
    Profile-->>-SmartChargingHandler: tx_default composite_schedule 
    SmartChargingHandler->>+Profile: calculate_composite_schedule(tx_periods)
    Profile-->>-SmartChargingHandler: tx composite_schedule
    SmartChargingHandler->>+Profile: calculate_composite_schedule(all three composite schedules)
    Profile-->>-SmartChargingHandler: consolidated composite_schedule
    SmartChargingHandler-->>-ChargePoint: composite_schedule

Loading

NOTE: A big change between this and the original 1.6 version of the code is the way we are testing the code in question, as well as adding existing tests that were written against the early version of the 1.6 code, that include ones that were failing before, but are now happily fixed with the earlier 1.6 update.

Here are the major refactorings in question:

  1. Using raw Profile JSON files that are serialized within the test suite instead of instantiating them in code, allowing for a clearer understanding of the actual OCPP messages that will be used to create the Composite Schedule.
  2. Support grouping of Profiles into scenario folders, so that one can clearly see how they relate and act with each other.
  3. Use parameterized based testing where possible to simplify the tests.
  4. Added smart_charging_test_utils.hpp that include methods to simplify the creation of DateTime objects used for creating test ranges.
  5. Isolate all Composite Schedule tests in the test_composite_schedule.cpp test suite.

Message handler for GetCompositeScheduleRequest

Adds a message handler for GetCompositeScheduleRequest and associated
tests within test_charge_point.cpp.

Due to the core functionality being tested within test_composite_schedule.cpp,
we primarily test that get_valid_profiles() and calculate_composite_schedule()
are being called within the right contexts:

  • We calculate a composite schedule from a list of valid profiles
  • We do not calculate a composite schedule when the EVSE ID is unknown
  • We do not calculate a composite schedule when the chargingRateUnit
    sent in the request is not configured.

Issue ticket number and link

Checklist before requesting a review

@folkengine
Copy link
Contributor Author

folkengine commented Aug 14, 2024

FYI, I have not been able to figure out how to fix the Codacy markdown linting issues.

@shankari could you please review.

@folkengine
Copy link
Contributor Author

FYI, I brought up the Codacy markdown linting issues in today's EVerest Cloud Communication Working Group meeting, and they indicated that they would file an issue on this.

@folkengine folkengine changed the title Feature/k08 get composite schedule squashed Feature/k08 Get Composite Schedule Aug 15, 2024
@folkengine folkengine changed the title Feature/k08 Get Composite Schedule Feature/K08 Get Composite Schedule Aug 15, 2024
@shankari
Copy link

shankari commented Aug 17, 2024

@folkengine note that my name has an 'i' at the end (I am not sure what 'shankar' made of your unexpected tag 😄). Although I prefer having the task in the appropriate column rather than a tag anyway since tags can get lost in the flow of email.

@folkengine
Copy link
Contributor Author

Oh no, I'm so sorry. You'd think I'd have mastered copy and paste by now.

@shankari
Copy link

Quick update on progress: I am currently at 54/70 files, although some of the files left are the more complex ones. I anticipate finishing this up tomorrow (Monday, Aug 19)

@folkengine
Copy link
Contributor Author

Quick update on progress: I am currently at 54/70 files, although some of the files left are the more complex ones. I anticipate finishing this up tomorrow (Monday, Aug 19)

Thank you @shankari

@folkengine folkengine force-pushed the feature/k08-get-composite-schedule-squashed branch from 9640e7a to 958d3cc Compare August 20, 2024 16:38
@folkengine
Copy link
Contributor Author

Rebased with latest code from main.

Copy link
Contributor

@Pietfried Pietfried left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some additional comments apart from the ones in line:

  • Handling for multiple ChargingSchedules in a ChargingProfile is missing
  • In the SmartChargingCtrlr.json you can add the value "A,W" for ChargingScheduleChargingRateUnit
  • As you mentioned in the PR description the algorithm used for the composite schedule calculation is heavily based on the one in v16. There are a lot of code duplications so I would like to discuss the options to refactor this (maybe as part of a separate PR) to keep this DRY. Let's do this in the WG meeting and/or in a separate meeting

OCTT test case results:
TC_K_39_CS Get Composite Schedule - No ChargingProfile installed on Charging Station: ✔️
TC_K_40_CS Get Composite Schedule - Stacking ChargingProfiles: ✔️
TC_K_41_CS [Beta] Get Composite Schedule - Combining chargingProfilePurposes: 🚫
TC_K_42_CS Get Composite Schedule - chargingRateUnit not supported: ✔️
TC_K_47_CS Get Composite Schedule - Unknown EVSEId: ✔️

I can share the logs for the failed test case which I did not yet investigate further.

include/ocpp/common/constants.hpp Show resolved Hide resolved
include/ocpp/common/types.hpp Outdated Show resolved Hide resolved
include/ocpp/common/constants.hpp Outdated Show resolved Hide resolved
include/ocpp/v201/smart_charging.hpp Outdated Show resolved Hide resolved
include/ocpp/v201/smart_charging.hpp Outdated Show resolved Hide resolved
tests/lib/ocpp/v201/smart_charging_test_utils.hpp Outdated Show resolved Hide resolved
tests/lib/ocpp/v201/test_profile.cpp Show resolved Hide resolved
tests/CMakeLists.txt Outdated Show resolved Hide resolved
lib/ocpp/v201/profile.cpp Outdated Show resolved Hide resolved
lib/ocpp/v201/smart_charging.cpp Outdated Show resolved Hide resolved
Copy link
Contributor

@james-ctc james-ctc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A good set of changes and I like how the approach is similar to 1.6 giving the opportunity in the future to have common scheduling processing and just the to/from JSON being different between the two. With OCPP 2.1 coming this is good to see and a great starting point.

Some general points:

  • not all files have the correct license header
  • some files are missing a blank line at the end
  • I think there is a possibility of making profile code common perhaps with inheritance to cover the multiple schedules in OCPP 2.0.1 (perhaps a separate PR)
  • some unit test only code is included in the main library code. I recommend separating that code out and keeping it with the test code. Having dead code in a library file is not recommended. (an alternative would be to use conditional compilation, #ifdef UNIT_TEST but I think it is cleaner to move it)

when I run the unit tests I'm getting a segfault in ChargePointFixture.K01FR02_CallbacksValidityChecksIfOptionalVariableChangedCallbackIsNotSetOrNotNull

[2024-08-23 10:59:31.266123] [0x00007a3c379a7740] [info]    Disconnecting websocket...
[2024-08-23 10:59:31.266127] [0x00007a3c379a7740] [info]    Closing websocket: 
[2024-08-23 10:59:31.266138] [0x00007a3c379a7740] [info]    stop()
[2024-08-23 10:59:31.266167] [0x00007a3c04a006c0] [info]    There are 1 messages in the normal message queue.
[2024-08-23 10:59:31.266182] [0x00007a3c04a006c0] [info]    There are 124 messages in the transaction message queue.
[2024-08-23 10:59:31.266188] [0x00007a3c04a006c0] [info]    Message queue stopped processing messages
[2024-08-23 10:59:31.266224] [0x00007a3c379a7740] [info]    stop() notified message queue
[2024-08-23 10:59:31.266282] [0x00007a3c02c006c0] [info]    Closed websocket of NetworkConfigurationPriority: 1 which is configurationSlot 1
[2024-08-23 10:59:31.266307] [0x00007a3c054006c0] [info]    Triggered authorization cache cleanup
[2024-08-23 10:59:31.266373] [0x00007a3c02c006c0] [info]    pause()
[2024-08-23 10:59:31.266383] [0x00007a3c02c006c0] [info]    pause() notified message queue
Segmentation fault (core dumped)

looks to be related to ocpp::common::DatabaseConnection::close_connection_internal

Core was generated by `./libocpp_unit_tests'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007a3c380a8354 in sqlite3VdbeMemSetNull () from /lib/x86_64-linux-gnu/libsqlite3.so.0

include/ocpp/common/constants.hpp Show resolved Hide resolved
include/ocpp/common/types.hpp Outdated Show resolved Hide resolved
include/ocpp/v201/profile.hpp Outdated Show resolved Hide resolved
include/ocpp/v201/profile.hpp Show resolved Hide resolved
include/ocpp/v201/utils.hpp Outdated Show resolved Hide resolved
lib/ocpp/v201/profile.cpp Show resolved Hide resolved
lib/ocpp/v201/profile.cpp Show resolved Hide resolved
lib/ocpp/v201/utils.cpp Outdated Show resolved Hide resolved
lib/ocpp/v201/profile.cpp Outdated Show resolved Hide resolved
lib/ocpp/v201/profile.cpp Outdated Show resolved Hide resolved
Copy link

@shankari shankari left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I want to start by appreciating the detailed documentation and sequence diagram in this PR. It really helped a lot with the review.

My top level comment is that this doesn't seem to support tariffs, either in the data structure (https://github.com/EVerest/libocpp/pull/745/files#diff-8d323d412965fe8a0e36a81391917726636742ca099cad43402ed5ef9171bb85R25) or in the examples (https://github.com/EVerest/libocpp/pull/745/files#diff-6db7040d530e9d5fecf07cd97aef7c865c9529a781150ed2576dc111c26d5d2aR9 and similar). I understand that the tariffs are optional, but they are part of the spec, and in all conversations I have had, they are expected to be a more popular mode of control than hard limits. I am fine with deferring this to a subsequent PR, but I would like to see an issue filed to track this gap before we merge this PR, so that we don't forget to make the changes.

Note also that I did not carefully validate the expected outputs of the tests. For example, the numbers (2000, 1, 1, 0) seem resonable but I have not done the math to verify them. I assume that the community review will check this with a fine-tooth comb.

    ASSERT_EQ(period_01.limit, 2000);
    ASSERT_EQ(period_01.numberPhases, 1);
    ASSERT_EQ(period_01.stackLevel, 1);
    ASSERT_EQ(period_01.startPeriod, 0);

Detailed comments follow...

doc/ocpp_201_status.md Outdated Show resolved Hide resolved
include/ocpp/v201/profile.hpp Show resolved Hide resolved
include/ocpp/v201/profile.hpp Show resolved Hide resolved
include/ocpp/v201/profile.hpp Show resolved Hide resolved
tests/lib/ocpp/v201/json/case_one/README.md Show resolved Hide resolved
tests/lib/ocpp/v201/test_composite_schedule.cpp Outdated Show resolved Hide resolved
tests/lib/ocpp/v201/test_profile.cpp Outdated Show resolved Hide resolved
tests/lib/ocpp/v201/test_profile.cpp Show resolved Hide resolved
tests/lib/ocpp/v201/test_profile.cpp Outdated Show resolved Hide resolved
tests/lib/ocpp/v201/test_profile.cpp Outdated Show resolved Hide resolved
@folkengine
Copy link
Contributor Author

folkengine commented Aug 26, 2024

@shankari & @james-ctc I will have to respectively disagree with your comments concerning operators against Domain entities that are only used in unit tests being placed under the testing directory.

I come from the school that sees these elements as part of the general contract for the entities. Since this is a library, and we want to support using this library for things other than itself, such as Appenzell, these would be considered a standard part of what Joshua Block calls "their general contracts".

-- Joshua Bloch, Chapter 3 Effective Java, 3rd Edition

Please forgive me for citing a Java book, but it is one of my favorites, and had a massive impact on my craft as a developer. Nevertheless, in the spirit of Git-R-Done I am going to move them and table this discussion until a later date.

Thanks for the feedback.

@james-ctc
Copy link
Contributor

I will have to respectively disagree with your comments concerning operators against Domain entities that are only used in unit tests being placed under the testing directory...

My programming background is firmware in safety critical systems where different approaches are common. MISRA compliance is often a requirement.

There are a number of things to consider.

  • in Java everything is a class, C++ supports other things as well
  • structures are used rather than classes. Those structures have no methods, if it were as below then I would agree:
class ChargingSchedulePeriod {
public:
    bool operator==(const ChargingSchedulePeriod &);
    int32_t startPeriod;
    float limit;
    std::optional<CustomData> customData;
    std::optional<int32_t> numberPhases;
    std::optional<int32_t> phaseToUse;
};
  • the comparison and string operators are not part of the structure's interface
  • in security, unreachable code is generally considered bad
  • MISRA guidelines also prohibit unused code: "There shall be no unreachable code"
  • comparisons are never used within libocpp - there is never a need to compare. Unit tests need a compare to check that the results of a test are what was expected, an alternative would be:
  ChargingSchedulePeriod a;
  ChargingSchedulePeriod b;
  ...
  EXPECT_EQ(a.startPeriod, b.startPeriod);
  EXPECT_EQ(a.limit, b.limit);
  ...

Using the out of class definition operator== simplifies the unit tests.

@folkengine
Copy link
Contributor Author

I will have to respectively disagree with your comments concerning operators against Domain entities that are only used in unit tests being placed under the testing directory...

My programming background is firmware in safety critical systems where different approaches are common. MISRA compliance is often a requirement.

There are a number of things to consider.

  • in Java everything is a class, C++ supports other things as well
  • structures are used rather than classes. Those structures have no methods, if it were as below then I would agree:
class ChargingSchedulePeriod {
public:
    bool operator==(const ChargingSchedulePeriod &);
    int32_t startPeriod;
    float limit;
    std::optional<CustomData> customData;
    std::optional<int32_t> numberPhases;
    std::optional<int32_t> phaseToUse;
};
  • the comparison and string operators are not part of the structure's interface
  • in security, unreachable code is generally considered bad
  • MISRA guidelines also prohibit unused code: "There shall be no unreachable code"
  • comparisons are never used within libocpp - there is never a need to compare. Unit tests need a compare to check that the results of a test are what was expected, an alternative would be:
  ChargingSchedulePeriod a;
  ChargingSchedulePeriod b;
  ...
  EXPECT_EQ(a.startPeriod, b.startPeriod);
  EXPECT_EQ(a.limit, b.limit);
  ...

Using the out of class definition operator== simplifies the unit tests.

Very informative. That makes total sense, and completely changes my mind. Thanks!

@folkengine folkengine force-pushed the feature/k08-get-composite-schedule-squashed branch 2 times, most recently from 7c35477 to 9a04113 Compare August 28, 2024 16:12
@folkengine
Copy link
Contributor Author

OCTT test case results:
TC_K_39_CS Get Composite Schedule - No ChargingProfile installed on Charging Station: ✔️
TC_K_40_CS Get Composite Schedule - Stacking ChargingProfiles: ✔️
TC_K_41_CS [Beta] Get Composite Schedule - Combining chargingProfilePurposes: 🚫
TC_K_42_CS Get Composite Schedule - chargingRateUnit not supported: ✔️
TC_K_47_CS Get Composite Schedule - Unknown EVSEId: ✔️

@Pietfried we have created an issue for TC_K_41_CS on our board to isolate if this is an issue with the test or with this code. Thank you for the information.

@folkengine
Copy link
Contributor Author

folkengine commented Aug 29, 2024

when I run the unit tests I'm getting a segfault in ChargePointFixture.K01FR02_CallbacksValidityChecksIfOptionalVariableChangedCallbackIsNotSetOrNotNull

[2024-08-23 10:59:31.266123] [0x00007a3c379a7740] [info]    Disconnecting websocket...
[2024-08-23 10:59:31.266127] [0x00007a3c379a7740] [info]    Closing websocket: 
[2024-08-23 10:59:31.266138] [0x00007a3c379a7740] [info]    stop()
[2024-08-23 10:59:31.266167] [0x00007a3c04a006c0] [info]    There are 1 messages in the normal message queue.
[2024-08-23 10:59:31.266182] [0x00007a3c04a006c0] [info]    There are 124 messages in the transaction message queue.
[2024-08-23 10:59:31.266188] [0x00007a3c04a006c0] [info]    Message queue stopped processing messages
[2024-08-23 10:59:31.266224] [0x00007a3c379a7740] [info]    stop() notified message queue
[2024-08-23 10:59:31.266282] [0x00007a3c02c006c0] [info]    Closed websocket of NetworkConfigurationPriority: 1 which is configurationSlot 1
[2024-08-23 10:59:31.266307] [0x00007a3c054006c0] [info]    Triggered authorization cache cleanup
[2024-08-23 10:59:31.266373] [0x00007a3c02c006c0] [info]    pause()
[2024-08-23 10:59:31.266383] [0x00007a3c02c006c0] [info]    pause() notified message queue
Segmentation fault (core dumped)

looks to be related to ocpp::common::DatabaseConnection::close_connection_internal

Core was generated by `./libocpp_unit_tests'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007a3c380a8354 in sqlite3VdbeMemSetNull () from /lib/x86_64-linux-gnu/libsqlite3.so.0

@james-ctc is it possible for you to create an issue on the US-JOET fork of libocpp? (Not actually possible given our setup)

Details of the system you are using to run the tests, and anything else that you might think would be helpful to isolate the issue would be most welcome.

@james-ctc
Copy link
Contributor

james-ctc commented Aug 29, 2024

There isn't an issues tab available to me
image

more details on the core dump (which occurs in different places)

System:
- Linux mint 22 (based on Ubuntu 24.04)
- g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0

$ cmake -B build -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="./dist" -GNinja
$ ninja -C build
$ ninja -C build install

commit 9a0411340d084802240e111b71e265754f72dfa2 (HEAD -> feature/k08-get-composite-schedule-squashed, US-JOET/feature/k08-get-composite-schedule-squashed)
Author: Christoph <[email protected]>
Date:   Wed Aug 28 07:20:33 2024 -0700

when run:
~/code/everest/workspace/libocpp/build/tests$ ./libocpp_unit_tests 
...
[ RUN      ] ChargePointFixture.K01FR02_CallbacksValidityChecksIfResetCallbackExists
...
GMOCK WARNING:
Uninteresting mock function call - returning directly.
    Function call: Call(@0x7ffe3e24aab0 StartupOfTheDevice, @0x7ffe3e24aae0 (Charging Station powered up! Firmware version: 1.0))
NOTE: You can safely ignore the above warning unless this call should not happen.  Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call.  See https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md#knowing-when-to-expect for details.
[2024-08-29 14:16:50.014981] [0x00007c902c2fc740] [info]    Disconnecting websocket...
[2024-08-29 14:16:50.014988] [0x00007c902c2fc740] [info]    Closing websocket: 
[2024-08-29 14:16:50.015007] [0x00007c902c2fc740] [info]    stop()
[2024-08-29 14:16:50.015036] [0x00007c8ffa8006c0] [info]    There are 1 messages in the normal message queue.
[2024-08-29 14:16:50.015056] [0x00007c8ffa8006c0] [info]    There are 13 messages in the transaction message queue.
[2024-08-29 14:16:50.015066] [0x00007c8ffa8006c0] [info]    Message queue stopped processing messages
[2024-08-29 14:16:50.015087] [0x00007c8ff8a006c0] [info]    Closed websocket of NetworkConfigurationPriority: 1 which is configurationSlot 1
[2024-08-29 14:16:50.015112] [0x00007c902c2fc740] [info]    stop() notified message queue
[2024-08-29 14:16:50.015190] [0x00007c8ffb2006c0] [info]    Triggered authorization cache cleanup
[2024-08-29 14:16:50.015216] [0x00007c8ff8a006c0] [info]    pause()
[2024-08-29 14:16:50.015230] [0x00007c8ff8a006c0] [info]    pause() notified message queue
[2024-08-29 14:16:50.015774] [0x00007c902c2fc740] [info]    Successfully closed database: "file::memory:?cache=shared"
Segmentation fault (core dumped)

Stack trace from core (gdb)
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./libocpp_unit_tests'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007c902c9bc7c7 in sqlite3Init () from /lib/x86_64-linux-gnu/libsqlite3.so.0
[Current thread is 1 (Thread 0x7c8ff8a006c0 (LWP 181995))]
(gdb) bt
#0  0x00007c902c9bc7c7 in sqlite3Init () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#1  0x00007c902c9bc8bf in sqlite3ReadSchema () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#2  0x00007c902c933ba0 in sqlite3LocateTable () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#3  0x00007c902c9dbc91 in ?? () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#4  0x00007c902ca061be in sqlite3WalkSelect () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#5  0x00007c902c9de803 in sqlite3SelectPrep () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#6  0x00007c902c9df8d8 in sqlite3Select () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#7  0x00007c902c9b5992 in sqlite3Parser () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#8  0x00007c902c9e50a6 in sqlite3RunParser () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#9  0x00007c902c9b9063 in ?? () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#10 0x00007c902c9b94df in ?? () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#11 0x00007c902c9b95ce in sqlite3_prepare_v2 () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#12 0x00005d9849400b61 in ocpp::common::SQLiteStatement::SQLiteStatement (this=0x7c902400a8a0, db=0x5d984a639bb8, query="SELECT ID FROM VARIABLE WHERE COMPONENT_ID = ? AND NAME = ? AND INSTANCE IS ?")
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/database/sqlite_statement.cpp:12
EVerest/EVerest#13 0x00005d98493e4614 in std::make_unique<ocpp::common::SQLiteStatement, sqlite3*&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> () at /usr/include/c++/13/bits/unique_ptr.h:1070
EVerest/EVerest#14 0x00005d98493e19c6 in ocpp::common::DatabaseConnection::new_statement (this=0x5d984a609d30, sql="SELECT ID FROM VARIABLE WHERE COMPONENT_ID = ? AND NAME = ? AND INSTANCE IS ?")
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/database/database_connection.cpp:130
EVerest/EVerest#15 0x00005d984959d3dd in ocpp::v201::DeviceModelStorageSqlite::get_variable_id (this=0x5d984a5e0640, component_id=..., variable_id=...) at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model_storage_sqlite.cpp:79
EVerest/EVerest#16 0x00005d984959e3cb in ocpp::v201::DeviceModelStorageSqlite::get_variable_attributes (this=0x5d984a5e0640, component_id=..., variable_id=..., attribute_enum=std::optional = {...})
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model_storage_sqlite.cpp:185
EVerest/EVerest#17 0x00005d984959e2b8 in ocpp::v201::DeviceModelStorageSqlite::get_variable_attribute (this=0x5d984a5e0640, component_id=..., variable_id=..., attribute_enum=@0x7c8ff89ffb44: ocpp::v201::AttributeEnum::Actual)
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model_storage_sqlite.cpp:173
EVerest/EVerest#18 0x00005d9849584093 in ocpp::v201::DeviceModel::request_value_internal (this=0x5d984a6b1870, component_id=..., variable_id=..., attribute_enum=@0x7c8ff89ffb44: ocpp::v201::AttributeEnum::Actual, value="", allow_write_only=true)
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model.cpp:236
EVerest/EVerest#19 0x00005d98490e2429 in ocpp::v201::DeviceModel::get_value<int> (this=0x5d984a6b1870, component_variable=..., attribute_enum=@0x7c8ff89ffb44: ocpp::v201::AttributeEnum::Actual)
--Type <RET> for more, q to quit, c to continue without paging--c
    at /home/james/code/everest/workspace/libocpp/include/ocpp/v201/device_model.hpp:156
EVerest/EVerest#20 0x00005d984948c2ec in operator() (__closure=0x5d984a664138) at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/charge_point.cpp:1119
EVerest/EVerest#21 0x00005d98494b78c4 in std::__invoke_impl<void, ocpp::v201::ChargePoint::init_websocket()::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
EVerest/EVerest#22 0x00005d98494b55c2 in std::__invoke_r<void, ocpp::v201::ChargePoint::init_websocket()::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#23 0x00005d98494b30b4 in std::_Function_handler<void(), ocpp::v201::ChargePoint::init_websocket()::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#24 0x00005d9848ed7ef6 in std::function<void ()>::operator()() const (this=0x5d984a664138) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#25 0x00005d98496fb95d in operator() (__closure=0x5d984a6421e0) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket.cpp:76
EVerest/EVerest#26 0x00005d98496fce7c in std::__invoke_impl<void, ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
EVerest/EVerest#27 0x00005d98496fc9c4 in std::__invoke_r<void, ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#28 0x00005d98496fc2b0 in std::_Function_handler<void(), ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#29 0x00005d9848ed7ef6 in std::function<void ()>::operator()() const (this=0x5d984a6421e0) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#30 0x00005d9849705283 in operator() (__closure=0x7c8ff89ffda0) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket_libwebsockets.cpp:828
EVerest/EVerest#31 0x00005d984970ce6a in std::__invoke_impl<void, ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
#32 0x00005d984970c606 in std::__invoke_r<void, ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#33 0x00005d984970bc03 in std::_Function_handler<void(), ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#34 0x00005d9848ed7ef6 in std::function<void ()>::operator()() const (this=0x7c8ff89ffda0) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#35 0x00005d984970b2f0 in ocpp::WebsocketTlsTPM::handle_deferred_callback_queue (this=0x5d984a642030) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket_libwebsockets.cpp:1388
EVerest/EVerest#36 0x00005d9849719408 in std::__invoke_impl<void, void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> (
    __f=@0x5d984a66a9f0: (void (ocpp::WebsocketTlsTPM::*)(ocpp::WebsocketTlsTPM * const)) 0x5d984970b1f0 <ocpp::WebsocketTlsTPM::handle_deferred_callback_queue()>, __t=@0x5d984a66a9e8: 0x5d984a642030)
    at /usr/include/c++/13/bits/invoke.h:74
EVerest/EVerest#37 0x00005d984971935b in std::__invoke<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> (
    __fn=@0x5d984a66a9f0: (void (ocpp::WebsocketTlsTPM::*)(ocpp::WebsocketTlsTPM * const)) 0x5d984970b1f0 <ocpp::WebsocketTlsTPM::handle_deferred_callback_queue()>) at /usr/include/c++/13/bits/invoke.h:96
EVerest/EVerest#38 0x00005d98497192bb in std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> >::_M_invoke<0ul, 1ul> (this=0x5d984a66a9e8) at /usr/include/c++/13/bits/std_thread.h:292
EVerest/EVerest#39 0x00005d984971922c in std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> >::operator() (this=0x5d984a66a9e8) at /usr/include/c++/13/bits/std_thread.h:299
EVerest/EVerest#40 0x00005d98497191d0 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> > >::_M_run (this=0x5d984a66a9e0) at /usr/include/c++/13/bits/std_thread.h:244
EVerest/EVerest#41 0x00007c902c766bb4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
EVerest/EVerest#42 0x00007c902c3f0a94 in start_thread (arg=<optimised out>) at ./nptl/pthread_create.c:447
EVerest/EVerest#43 0x00007c902c47dc3c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

I did a clean rebuild and got a segfault in test [ RUN ] ChargePointFixture.K01FR02_CallbacksValidityChecksIfOptionalAllConnectorsUnavailableCallbackIsNotSetOrNotNull

Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./libocpp_unit_tests'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000787ddfbae354 in sqlite3VdbeMemSetNull () from /lib/x86_64-linux-gnu/libsqlite3.so.0
[Current thread is 1 (Thread 0x787dac0006c0 (LWP 187344))]
(gdb) bt
#0  0x0000787ddfbae354 in sqlite3VdbeMemSetNull () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#1  0x0000787ddfb9ba1e in ?? () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#2  0x0000787ddfbaad47 in sqlite3_column_int () from /lib/x86_64-linux-gnu/libsqlite3.so.0
EVerest/EVerest#3  0x00005eacf0341776 in ocpp::common::SQLiteStatement::column_int (this=0x787dd008bba0, idx=1) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/database/sqlite_statement.cpp:124
EVerest/EVerest#4  0x00005eacf04de60d in ocpp::v201::DeviceModelStorageSqlite::get_variable_attributes (this=0x5eacf22cb850, component_id=..., variable_id=..., attribute_enum=std::optional = {...})
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model_storage_sqlite.cpp:210
EVerest/EVerest#5  0x00005eacf04de2b8 in ocpp::v201::DeviceModelStorageSqlite::get_variable_attribute (this=0x5eacf22cb850, component_id=..., variable_id=..., attribute_enum=@0x787dabfffb44: ocpp::v201::AttributeEnum::Actual)
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model_storage_sqlite.cpp:173
EVerest/EVerest#6  0x00005eacf04c4093 in ocpp::v201::DeviceModel::request_value_internal (this=0x5eacf228caf0, component_id=..., variable_id=..., attribute_enum=@0x787dabfffb44: ocpp::v201::AttributeEnum::Actual, value="", allow_write_only=true)
    at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/device_model.cpp:236
EVerest/EVerest#7  0x00005eacf0022429 in ocpp::v201::DeviceModel::get_value<int> (this=0x5eacf228caf0, component_variable=..., attribute_enum=@0x787dabfffb44: ocpp::v201::AttributeEnum::Actual)
    at /home/james/code/everest/workspace/libocpp/include/ocpp/v201/device_model.hpp:156
EVerest/EVerest#8  0x00005eacf03cc2ec in operator() (__closure=0x5eacf22c3a78) at /home/james/code/everest/workspace/libocpp/lib/ocpp/v201/charge_point.cpp:1119
EVerest/EVerest#9  0x00005eacf03f78c4 in std::__invoke_impl<void, ocpp::v201::ChargePoint::init_websocket()::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
EVerest/EVerest#10 0x00005eacf03f55c2 in std::__invoke_r<void, ocpp::v201::ChargePoint::init_websocket()::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#11 0x00005eacf03f30b4 in std::_Function_handler<void(), ocpp::v201::ChargePoint::init_websocket()::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#12 0x00005eacefe17ef6 in std::function<void ()>::operator()() const (this=0x5eacf22c3a78) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#13 0x00005eacf063b95d in operator() (__closure=0x5eacf232c1b0) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket.cpp:76
EVerest/EVerest#14 0x00005eacf063ce7c in std::__invoke_impl<void, ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
EVerest/EVerest#15 0x00005eacf063c9c4 in std::__invoke_r<void, ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#16 0x00005eacf063c2b0 in std::_Function_handler<void(), ocpp::Websocket::register_disconnected_callback(const std::function<void()>&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#17 0x00005eacefe17ef6 in std::function<void ()>::operator()() const (this=0x5eacf232c1b0) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#18 0x00005eacf0645283 in operator() (__closure=0x787dabfffda0) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket_libwebsockets.cpp:828
EVerest/EVerest#19 0x00005eacf064ce6a in std::__invoke_impl<void, ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/13/bits/invoke.h:61
--Type <RET> for more, q to quit, c to continue without paging--c
EVerest/EVerest#20 0x00005eacf064c606 in std::__invoke_r<void, ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/13/bits/invoke.h:111
EVerest/EVerest#21 0x00005eacf064bc03 in std::_Function_handler<void(), ocpp::WebsocketTlsTPM::close(ocpp::WebsocketCloseReason, const std::string&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/13/bits/std_function.h:290
EVerest/EVerest#22 0x00005eacefe17ef6 in std::function<void ()>::operator()() const (this=0x787dabfffda0) at /usr/include/c++/13/bits/std_function.h:591
EVerest/EVerest#23 0x00005eacf064b2f0 in ocpp::WebsocketTlsTPM::handle_deferred_callback_queue (this=0x5eacf232c000) at /home/james/code/everest/workspace/libocpp/lib/ocpp/common/websocket/websocket_libwebsockets.cpp:1388
EVerest/EVerest#24 0x00005eacf0659408 in std::__invoke_impl<void, void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> (
    __f=@0x5eacf2394ae0: (void (ocpp::WebsocketTlsTPM::*)(ocpp::WebsocketTlsTPM * const)) 0x5eacf064b1f0 <ocpp::WebsocketTlsTPM::handle_deferred_callback_queue()>, __t=@0x5eacf2394ad8: 0x5eacf232c000)
    at /usr/include/c++/13/bits/invoke.h:74
EVerest/EVerest#25 0x00005eacf065935b in std::__invoke<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> (
    __fn=@0x5eacf2394ae0: (void (ocpp::WebsocketTlsTPM::*)(ocpp::WebsocketTlsTPM * const)) 0x5eacf064b1f0 <ocpp::WebsocketTlsTPM::handle_deferred_callback_queue()>) at /usr/include/c++/13/bits/invoke.h:96
EVerest/EVerest#26 0x00005eacf06592bb in std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> >::_M_invoke<0ul, 1ul> (this=0x5eacf2394ad8) at /usr/include/c++/13/bits/std_thread.h:292
EVerest/EVerest#27 0x00005eacf065922c in std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> >::operator() (this=0x5eacf2394ad8) at /usr/include/c++/13/bits/std_thread.h:299
EVerest/EVerest#28 0x00005eacf06591d0 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (ocpp::WebsocketTlsTPM::*)(), ocpp::WebsocketTlsTPM*> > >::_M_run (this=0x5eacf2394ad0) at /usr/include/c++/13/bits/std_thread.h:244
EVerest/EVerest#29 0x0000787ddf917bb4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
EVerest/EVerest#30 0x0000787ddf5a1a94 in start_thread (arg=<optimised out>) at ./nptl/pthread_create.c:447
EVerest/EVerest#31 0x0000787ddf62ec3c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

@folkengine
Copy link
Contributor Author

There isn't an issues tab available to me.

Me neither 🤦 @james-ctc thanks, this is very helpful. I've added an issue on our board.

@folkengine
Copy link
Contributor Author

@james-ctc is it possible for you to run the tests against the main EVerest/libocpp? I'm curious if you are getting the same error against K01FR02_CallbacksValidityChecksIfOptionalVariableChangedCallbackIsNotSetOrNotNull there. Thanks!

@james-ctc
Copy link
Contributor

core dump with test
[ RUN ] ChargePointFixture.K01FR02_CallbacksValidityChecksIfOptionalEvseEffectiveOperativeStatusChangedCallbackIsNotSetOrNotNull
from commit

commit 2bc64f07c2981c5bb3e7d7c186073035d66392c4 (HEAD -> main, tag: v0.16.2, origin/main, origin/HEAD, US-JOET/main)
Author: Kai Hermann <[email protected]>
Date:   Tue Aug 27 19:18:51 2024 +0200

@folkengine folkengine force-pushed the feature/k08-get-composite-schedule-squashed branch from c985265 to 94316cf Compare September 5, 2024 17:15
@folkengine
Copy link
Contributor Author

The DCO is now failing

@Pietfried resolved

@folkengine folkengine force-pushed the feature/k08-get-composite-schedule-squashed branch from 94316cf to da7b871 Compare September 5, 2024 17:42
@folkengine
Copy link
Contributor Author

There currently is another issue with the test cases in the CI in addition to this. We are currently looking into it. I'll merge this once we sorted it out.

The issue has been fixed with: #771 . Can you please resolve the conflicts? @folkengine

@Pietfried This build is passing on our REPO

@Pietfried Pietfried merged commit 079e12b into EVerest:main Sep 5, 2024
2 of 4 checks passed
@folkengine folkengine deleted the feature/k08-get-composite-schedule-squashed branch September 5, 2024 19:32
SNSubramanya pushed a commit that referenced this pull request Sep 11, 2024
* * Added OCPP 2.0.1 Calculate Composite Schedule functionality and tests
* Added Generic optional type equality function for testing option types
* Create v201/profile.hpp to match file structure used in 1.6 CompositeSchedule work
* Added to_string functions to v201/utils to facilitate easier testing, logging and debugging
* Added OCPP 1.6 test_composite_schedule.cpp suite.
* Added ability to use serialized JSON Profiles scenarios for testing in v1.6 and 2.0.1.
* Added JSON Profiles based on specific testing scenarios for v1.6 and 2.0.1.
* Enabled now working 1.6 Composit Schedule tests
* Added v201/test_profile.cpp suite mirroring but refactoring tests done for v1.6 version
* Removed excessive logging

Signed-off-by: Christoph <[email protected]>

* Added sorting of vectors in SmartChargingTestUtils::get_charging_profiles_from_directory() to fix order issue in tests on CI

Signed-off-by: Christoph <[email protected]>

* Updated READMEs to fix linting issues

Signed-off-by: Christoph <[email protected]>

* Updated READMEs to fix more linting issues

Signed-off-by: Christoph <[email protected]>

* Removed unused LimitStackLevelPair struct caught by linter

Signed-off-by: Christoph <[email protected]>

* Added const to functions as per linter

Signed-off-by: Christoph <[email protected]>

* Added pass by const reference to functions as per linter

Signed-off-by: Christoph <[email protected]>

* Updated status doc

Signed-off-by: Christoph <[email protected]>

* Add get_valid_profiles() to Smart Charging Handler.

When retrieving the valid profiles for calculating composite schedules, this function
returns all of the profiles for a given EVSE ID, as well as the station-wide profiles.
It also ensures that the profiles are valid.

The calculations for composite schedule handle the start and end time, so this function
does not account for it at this stage.

Signed-off-by: Christopher Davis <[email protected]>
Signed-off-by: Gianfranco Berardi <[email protected]>

* added calculation for charging station external constraints.
added tests to cover external constraints.
refactored calculation for both max and external to a method.

Signed-off-by: Coury Richards <[email protected]>

* smart_charging: Make more functions mockable

Make `calculate_composite_schedule()` and `get_valid_profiles()` part
of the `SmartChargingHandlerInterface` so they may be overriden for
mocking.

Signed-off-by: Christopher Davis <[email protected]>

* smart_charging: Take chargingRateUnit as optional in `calculate_composite_schedule()`

The internal functions (and the v1.6 impl) take this as optional, but
we were requiring a value.

Signed-off-by: Christopher Davis <[email protected]>

* charge_point: Handle GetCompositeScheduleRequest

Adds a message handler for GetCompositeScheduleRequest and associated
tests within `test_charge_point.cpp`.

Due to the core functionality being tested within `test_composite_schedule.cpp`,
we primarily test that `get_valid_profiles()` and `calculate_composite_schedule()`
are being called within the right contexts:

* We calculate a composite schedule from a list of valid profiles
* We do not calculate a composite schedule when the EVSE ID is unknown
* We do not calculate a composite schedule when the `chargingRateUnit`
sent in the request is not configured.

Signed-off-by: Christopher Davis <[email protected]>

* doc: Update OCPP v2.0.1 status doc

We now cover:

- K08.FR.03
- K08.FR.04
- K08.FR.05
- K08.FR.07

Signed-off-by: Christopher Davis <[email protected]>

* Resolving PR comments from @Pietfried

Signed-off-by: Christoph <[email protected]>

* Moving location of json profiles as per PR comment

Signed-off-by: Christoph <[email protected]>

* Moving static functions only used in file into anonymous namespace as per PR comments

Signed-off-by: Christoph <[email protected]>

* Moving static functions only used in file into anonymous namespace as per PR comments

Signed-off-by: Christoph <[email protected]>

* Added documentation to test utility function as per PR review

Signed-off-by: Christoph <[email protected]>

* Moving equality operators to smart_charging_test_utils as per PR review

Signed-off-by: Christoph <[email protected]>

* Corrected mistake in Status doc as per PR review

Signed-off-by: Christoph <[email protected]>

* Updated constants as per PR review

Signed-off-by: Christoph <[email protected]>

* Updated profile comments  as per PR review

Signed-off-by: Christoph <[email protected]>

* Moved functions only used in tests to tests  as per PR review

Signed-off-by: Christoph <[email protected]>

* Added link to issue resolved in Case One composite schedule scenario test as per PR review

Signed-off-by: Christoph <[email protected]>

* Removed unused struct as per PR review

Signed-off-by: Christoph <[email protected]>

* Moved functions only used in tests to tests as per PR review

Signed-off-by: Christoph <[email protected]>

* Rolled back accidental changes to 1.6 code

Signed-off-by: Christoph <[email protected]>

* Remove profile scenario not used in PR

Signed-off-by: Christoph <[email protected]>

* Added more detailed Grid foundation test as per PR review.

Signed-off-by: Christoph <[email protected]>

* Fixed CalculateProfileEntryType_Param_Test as per PR review.

Signed-off-by: Christoph <[email protected]>

* Updated CalculateChargingSchedule_Overlap test names  as per PR review.

Signed-off-by: Christoph <[email protected]>

* Updated CalculateChargingScheduleCombined_CombinedOverlapT names  as per PR review.

Signed-off-by: Christoph <[email protected]>

* Moved functions only used in tests to tests as per PR review

Signed-off-by: Christoph <[email protected]>

* Added in grabbing transaction session start for relative profiles as per PR review

Signed-off-by: Christoph <[email protected]>

* Added check for evse_id == 0 as per PR review

Signed-off-by: Christoph <[email protected]>

* Touch to rerun GitHub Actions

Signed-off-by: Christoph <[email protected]>

* Touch to rerun GitHub Actions

Signed-off-by: Christoph <[email protected]>

* Touch to rerun GitHub Actions

Signed-off-by: Christoph <[email protected]>

---------

Signed-off-by: Christoph <[email protected]>
Signed-off-by: Christopher Davis <[email protected]>
Signed-off-by: Gianfranco Berardi <[email protected]>
Signed-off-by: Coury Richards <[email protected]>
Co-authored-by: Gianfranco Berardi <[email protected]>
Co-authored-by: Coury Richards <[email protected]>
Co-authored-by: Christopher Davis <[email protected]>
Signed-off-by: Soumya Subramanya <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants