@@ -15,27 +15,27 @@ using namespace ArduinoOcpp::Ocpp16;
1515
1616ConnectorMeterValuesRecorder::ConnectorMeterValuesRecorder (OcppModel& context, int connectorId)
1717 : context(context), connectorId{connectorId} {
18- sampleTimestamp = std::vector<OcppTimestamp>();
19- energy = std::vector<float >();
20- power = std::vector<float >();
2118
2219 MeterValueSampleInterval = declareConfiguration (" MeterValueSampleInterval" , 60 );
2320 MeterValuesSampledDataMaxLength = declareConfiguration (" MeterValuesSampledDataMaxLength" , 4 , CONFIGURATION_VOLATILE , false , true , false , false );
2421}
2522
2623void ConnectorMeterValuesRecorder::takeSample () {
27- if (energySampler != nullptr || powerSampler != nullptr ) {
28- if (!context.getOcppTime ().isValid ()) return ;
29- sampleTimestamp.push_back (context.getOcppTime ().getOcppTimestampNow ());
30- }
24+ if (meterValueSamplers.empty ()) return ;
3125
32- if (energySampler != nullptr ) {
33- energy.push_back (energySampler ());
26+ std::unique_ptr<MeterValue> sample;
27+ if (context.getOcppTime ().isValid ()) {
28+ sample.reset (new MeterValue (context.getOcppTime ().getOcppTimestampNow ()));
29+ }
30+ if (!sample) {
31+ return ;
3432 }
3533
36- if (powerSampler != nullptr ) {
37- power. push_back ( powerSampler ());
34+ for ( auto mvs = meterValueSamplers. begin (); mvs != meterValueSamplers. end (); mvs++ ) {
35+ sample-> addSampledValue ((*mvs)-> takeValue ());
3836 }
37+
38+ meterValue.push_back (std::move (sample));
3939}
4040
4141OcppMessage *ConnectorMeterValuesRecorder::loop () {
@@ -73,7 +73,7 @@ OcppMessage *ConnectorMeterValuesRecorder::loop() {
7373 /*
7474 * Is the value buffer already full? If yes, return MeterValues message
7575 */
76- if (((int ) sampleTimestamp .size ()) >= (int ) *MeterValuesSampledDataMaxLength) {
76+ if (((int ) meterValue .size ()) >= (int ) *MeterValuesSampledDataMaxLength) {
7777 auto result = toMeterValues ();
7878 return result;
7979 }
@@ -82,59 +82,35 @@ OcppMessage *ConnectorMeterValuesRecorder::loop() {
8282}
8383
8484OcppMessage *ConnectorMeterValuesRecorder::toMeterValues () {
85- if (sampleTimestamp. size () == 0 ) {
85+ if (meterValue. empty () ) {
8686 AO_DBG_DEBUG (" Checking if to send MeterValues ... No" );
8787 clear ();
8888 return nullptr ;
89- }
90-
91- // decide which measurands to send. If a measurand is missing at at least one point in time, omit that measurand completely
92-
93- if (energy.size () == sampleTimestamp.size () && power.size () == sampleTimestamp.size ()) {
94- auto result = new MeterValues (&sampleTimestamp, &energy, &power, connectorId, lastTransactionId);
95- clear ();
96- return result;
97- }
98-
99- if (energy.size () == sampleTimestamp.size () && power.size () != sampleTimestamp.size ()) {
100- auto result = new MeterValues (&sampleTimestamp, &energy, nullptr , connectorId, lastTransactionId);
101- clear ();
102- return result;
103- }
104-
105- if (energy.size () != sampleTimestamp.size () && power.size () == sampleTimestamp.size ()) {
106- auto result = new MeterValues (&sampleTimestamp, nullptr , &power, connectorId, lastTransactionId);
89+ } else {
90+ auto result = new MeterValues (meterValue, connectorId, lastTransactionId);
10791 clear ();
10892 return result;
10993 }
110-
111- // Maybe the energy sampler or power sampler was set during recording. Discard recorded data.
112- AO_DBG_WARN (" Invalid data set. Discard data set and restart recording" );
113- clear ();
114-
115- return nullptr ;
11694}
11795
11896OcppMessage *ConnectorMeterValuesRecorder::takeMeterValuesNow () {
11997
120- if (!energySampler && !powerSampler ) {
98+ if (meterValueSamplers. empty () ) {
12199 return nullptr ;
122100 }
123101
124- decltype (sampleTimestamp) t_now;
125- decltype (energy) e_now;
126- decltype (power) p_now;
102+ std::unique_ptr<MeterValue> value;
127103
128104 if (context.getOcppTime ().isValid ()) {
129- t_now. push_back ( context.getOcppTime ().getOcppTimestampNow ());
105+ value. reset ( new MeterValue ( context.getOcppTime ().getOcppTimestampNow () ));
130106 }
131107
132- if (energySampler ) {
133- e_now. push_back ( energySampler ()) ;
108+ if (!value ) {
109+ return nullptr ;
134110 }
135111
136- if (powerSampler ) {
137- p_now. push_back ( powerSampler ());
112+ for ( auto mvs = meterValueSamplers. begin (); mvs != meterValueSamplers. end (); mvs++ ) {
113+ value-> addSampledValue ((*mvs)-> takeValue ());
138114 }
139115
140116 int txId_now = -1 ;
@@ -143,24 +119,29 @@ OcppMessage *ConnectorMeterValuesRecorder::takeMeterValuesNow() {
143119 txId_now = connector->getTransactionId ();
144120 }
145121
146- return new MeterValues (&t_now, &e_now, &p_now, connectorId, txId_now);
122+ decltype (meterValue) mv_now;
123+ mv_now.push_back (std::move (value));
124+
125+ return new MeterValues (mv_now, connectorId, txId_now);
147126}
148127
149128void ConnectorMeterValuesRecorder::clear () {
150- sampleTimestamp.clear ();
151- energy.clear ();
152- power.clear ();
129+ meterValue.clear ();
153130}
154131
155132void ConnectorMeterValuesRecorder::setPowerSampler (PowerSampler ps){
156- this ->powerSampler = ps;
133+ this ->powerSampler = ps;
157134}
158135
159136void ConnectorMeterValuesRecorder::setEnergySampler (EnergySampler es){
160- this ->energySampler = es;
137+ this ->energySampler = es;
138+ }
139+
140+ void ConnectorMeterValuesRecorder::addMeterValueSampler (std::unique_ptr<SampledValueSampler> meterValueSampler) {
141+ meterValueSamplers.push_back (std::move (meterValueSampler));
161142}
162143
163- float ConnectorMeterValuesRecorder::readEnergyActiveImportRegister () {
144+ int32_t ConnectorMeterValuesRecorder::readEnergyActiveImportRegister () {
164145 if (energySampler != nullptr ) {
165146 return energySampler ();
166147 } else {
0 commit comments