Skip to content

Commit be6f727

Browse files
committed
em-analysis: Fix history data reading
Before the callback was triggered before the handler was registered. This was never robust, but due to this code and the callback tick running in the main task this was not a problem. Now with the callback tick running in the IO task and this code running in the main task, the callback can be received befor the handler is registered. Register the handler first before triggering the callback to avoid this problem.
1 parent fe8d940 commit be6f727

1 file changed

Lines changed: 65 additions & 64 deletions

File tree

software/src/modules/em_energy_analysis/em_energy_analysis.cpp

Lines changed: 65 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,6 +1381,23 @@ void EMEnergyAnalysis::history_wallbox_5min_response(IChunkedResponse *response,
13811381
uint16_t utc_end_slots = (utc_end_hour * 60 + utc_end_minute) / 5; // since midnight
13821382

13831383
uint32_t seqnum = history_request_seqnum++;
1384+
StreamMetadata *metadata = &metadata_array[0];
1385+
1386+
metadata->response = response;
1387+
metadata->response_ownership = response_ownership;
1388+
metadata->response_owner_id = response_owner_id;
1389+
metadata->call_begin = true;
1390+
metadata->write_comma = false;
1391+
metadata->next_offset = 0;
1392+
metadata->seqnum = seqnum;
1393+
metadata->uid = uid;
1394+
metadata->utc_end_year = utc_end_year;
1395+
metadata->utc_end_month = utc_end_month;
1396+
metadata->utc_end_day = utc_end_day;
1397+
metadata->utc_end_slots = utc_start_slots > 0 ? utc_end_slots : 0;
1398+
1399+
em_common.wem_register_sd_wallbox_data_points_low_level_callback(wallbox_5min_data_points_handler, metadata);
1400+
13841401
uint8_t status;
13851402
int rc;
13861403

@@ -1402,13 +1419,14 @@ void EMEnergyAnalysis::history_wallbox_5min_response(IChunkedResponse *response,
14021419
utc_end_minute,
14031420
utc_end_slots,
14041421
&status);
1405-
utc_end_slots = 0;
14061422
}
14071423

14081424
//logger.printfln("history_wallbox_5min_response: u%u %d-%02d-%02d",
14091425
// uid, 2000 + year, month, day);
14101426

14111427
if (rc != TF_E_OK || status != 0) {
1428+
em_common.wem_register_sd_wallbox_data_points_low_level_callback(nullptr, nullptr);
1429+
14121430
OwnershipGuard ownership_guard(response_ownership, response_owner_id);
14131431

14141432
if (ownership_guard.have_ownership()) {
@@ -1429,24 +1447,6 @@ void EMEnergyAnalysis::history_wallbox_5min_response(IChunkedResponse *response,
14291447
response->end(write_result);
14301448
}
14311449
}
1432-
else {
1433-
StreamMetadata *metadata = &metadata_array[0];
1434-
1435-
metadata->response = response;
1436-
metadata->response_ownership = response_ownership;
1437-
metadata->response_owner_id = response_owner_id;
1438-
metadata->call_begin = true;
1439-
metadata->write_comma = false;
1440-
metadata->next_offset = 0;
1441-
metadata->seqnum = seqnum;
1442-
metadata->uid = uid;
1443-
metadata->utc_end_year = utc_end_year;
1444-
metadata->utc_end_month = utc_end_month;
1445-
metadata->utc_end_day = utc_end_day;
1446-
metadata->utc_end_slots = utc_end_slots;
1447-
1448-
em_common.wem_register_sd_wallbox_data_points_low_level_callback(wallbox_5min_data_points_handler, metadata);
1449-
}
14501450
}
14511451

14521452
static void wallbox_daily_data_points_handler(void *do_not_use,
@@ -1564,13 +1564,27 @@ void EMEnergyAnalysis::history_wallbox_daily_response(IChunkedResponse *response
15641564
uint8_t month = history_wallbox_daily.get("month")->asUint();
15651565

15661566
uint32_t seqnum = history_request_seqnum++;
1567+
StreamMetadata *metadata = &metadata_array[1];
1568+
1569+
metadata->response = response;
1570+
metadata->response_ownership = response_ownership;
1571+
metadata->response_owner_id = response_owner_id;
1572+
metadata->call_begin = true;
1573+
metadata->write_comma = false;
1574+
metadata->next_offset = 0;
1575+
metadata->seqnum = seqnum;
1576+
1577+
em_common.wem_register_sd_wallbox_daily_data_points_low_level_callback(wallbox_daily_data_points_handler, metadata);
1578+
15671579
uint8_t status;
15681580
int rc = em_common.wem_get_sd_wallbox_daily_data_points(uid, year, month, 1, days_per_month(2000 + year, month), &status);
15691581

15701582
//logger.printfln("history_wallbox_daily_response: u%u %d-%02d",
15711583
// uid, 2000 + year, month);
15721584

15731585
if (rc != TF_E_OK || status != 0) {
1586+
em_common.wem_register_sd_wallbox_daily_data_points_low_level_callback(nullptr, nullptr);
1587+
15741588
OwnershipGuard ownership_guard(response_ownership, response_owner_id);
15751589

15761590
if (ownership_guard.have_ownership()) {
@@ -1591,19 +1605,6 @@ void EMEnergyAnalysis::history_wallbox_daily_response(IChunkedResponse *response
15911605
response->end(write_result);
15921606
}
15931607
}
1594-
else {
1595-
StreamMetadata *metadata = &metadata_array[1];
1596-
1597-
metadata->response = response;
1598-
metadata->response_ownership = response_ownership;
1599-
metadata->response_owner_id = response_owner_id;
1600-
metadata->call_begin = true;
1601-
metadata->write_comma = false;
1602-
metadata->next_offset = 0;
1603-
metadata->seqnum = seqnum;
1604-
1605-
em_common.wem_register_sd_wallbox_daily_data_points_low_level_callback(wallbox_daily_data_points_handler, metadata);
1606-
}
16071608
}
16081609

16091610
struct [[gnu::packed]] EnergyManager5MinData {
@@ -1818,6 +1819,22 @@ void EMEnergyAnalysis::history_energy_manager_5min_response(IChunkedResponse *re
18181819
uint16_t utc_end_slots = (utc_end_hour * 60 + utc_end_minute) / 5; // since midnight
18191820

18201821
uint32_t seqnum = history_request_seqnum++;
1822+
StreamMetadata *metadata = &metadata_array[2];
1823+
1824+
metadata->response = response;
1825+
metadata->response_ownership = response_ownership;
1826+
metadata->response_owner_id = response_owner_id;
1827+
metadata->call_begin = true;
1828+
metadata->write_comma = false;
1829+
metadata->next_offset = 0;
1830+
metadata->seqnum = seqnum;
1831+
metadata->utc_end_year = utc_end_year;
1832+
metadata->utc_end_month = utc_end_month;
1833+
metadata->utc_end_day = utc_end_day;
1834+
metadata->utc_end_slots = utc_start_slots > 0 ? utc_end_slots : 0;
1835+
1836+
em_common.wem_register_sd_energy_manager_data_points_low_level_callback(energy_manager_5min_data_points_handler, metadata);
1837+
18211838
uint8_t status;
18221839
int rc;
18231840

@@ -1838,14 +1855,14 @@ void EMEnergyAnalysis::history_energy_manager_5min_response(IChunkedResponse *re
18381855
utc_end_minute,
18391856
utc_end_slots,
18401857
&status);
1841-
1842-
utc_end_slots = 0;
18431858
}
18441859

18451860
//logger.printfln("history_energy_manager_5min_response: %d-%02d-%02d",
18461861
// 2000 + year, month, day);
18471862

18481863
if (rc != TF_E_OK || status != 0) {
1864+
em_common.wem_register_sd_energy_manager_data_points_low_level_callback(nullptr, nullptr);
1865+
18491866
OwnershipGuard ownership_guard(response_ownership, response_owner_id);
18501867

18511868
if (ownership_guard.have_ownership()) {
@@ -1866,23 +1883,6 @@ void EMEnergyAnalysis::history_energy_manager_5min_response(IChunkedResponse *re
18661883
response->end(write_result);
18671884
}
18681885
}
1869-
else {
1870-
StreamMetadata *metadata = &metadata_array[2];
1871-
1872-
metadata->response = response;
1873-
metadata->response_ownership = response_ownership;
1874-
metadata->response_owner_id = response_owner_id;
1875-
metadata->call_begin = true;
1876-
metadata->write_comma = false;
1877-
metadata->next_offset = 0;
1878-
metadata->seqnum = seqnum;
1879-
metadata->utc_end_year = utc_end_year;
1880-
metadata->utc_end_month = utc_end_month;
1881-
metadata->utc_end_day = utc_end_day;
1882-
metadata->utc_end_slots = utc_end_slots;
1883-
1884-
em_common.wem_register_sd_energy_manager_data_points_low_level_callback(energy_manager_5min_data_points_handler, metadata);
1885-
}
18861886
}
18871887

18881888
static void energy_manager_daily_data_points_handler(void *do_not_use,
@@ -2025,13 +2025,27 @@ void EMEnergyAnalysis::history_energy_manager_daily_response(IChunkedResponse *r
20252025
uint8_t month = history_energy_manager_daily.get("month")->asUint();
20262026

20272027
uint32_t seqnum = history_request_seqnum++;
2028+
StreamMetadata *metadata = &metadata_array[3];
2029+
2030+
metadata->response = response;
2031+
metadata->response_ownership = response_ownership;
2032+
metadata->response_owner_id = response_owner_id;
2033+
metadata->call_begin = true;
2034+
metadata->write_comma = false;
2035+
metadata->next_offset = 0;
2036+
metadata->seqnum = seqnum;
2037+
2038+
em_common.wem_register_sd_energy_manager_daily_data_points_low_level_callback(energy_manager_daily_data_points_handler, metadata);
2039+
20282040
uint8_t status;
20292041
int rc = em_common.wem_get_sd_energy_manager_daily_data_points(year, month, 1, days_per_month(2000 + year, month), &status);
20302042

20312043
//logger.printfln("history_energy_manager_daily_response: %d-%02d",
20322044
// 2000 + year, month);
20332045

20342046
if (rc != TF_E_OK || status != 0) {
2047+
em_common.wem_register_sd_energy_manager_daily_data_points_low_level_callback(nullptr, nullptr);
2048+
20352049
OwnershipGuard ownership_guard(response_ownership, response_owner_id);
20362050

20372051
if (ownership_guard.have_ownership()) {
@@ -2052,17 +2066,4 @@ void EMEnergyAnalysis::history_energy_manager_daily_response(IChunkedResponse *r
20522066
response->end(write_result);
20532067
}
20542068
}
2055-
else {
2056-
StreamMetadata *metadata = &metadata_array[3];
2057-
2058-
metadata->response = response;
2059-
metadata->response_ownership = response_ownership;
2060-
metadata->response_owner_id = response_owner_id;
2061-
metadata->call_begin = true;
2062-
metadata->write_comma = false;
2063-
metadata->next_offset = 0;
2064-
metadata->seqnum = seqnum;
2065-
2066-
em_common.wem_register_sd_energy_manager_daily_data_points_low_level_callback(energy_manager_daily_data_points_handler, metadata);
2067-
}
20682069
}

0 commit comments

Comments
 (0)