Skip to content

Commit 5386c2f

Browse files
committedMar 10, 2025·
LG-83 CDD API support for listing optional endpoints
1 parent 55879b4 commit 5386c2f

File tree

7 files changed

+153
-0
lines changed

7 files changed

+153
-0
lines changed
 

‎lib/api/wpc.h

+15
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,21 @@ app_res_e WPC_get_config_data_item(const uint16_t endpoint,
960960
const size_t payload_capacity,
961961
uint8_t *const size);
962962

963+
/**
964+
* \brief Get a list of endpoints of existing optional config data items
965+
* \param endpoints
966+
* Pointer to read config data item endpoints into
967+
* \param endpoints_capacity
968+
* Allocated size of the given endpoints buffer (bytes). If received
969+
* endpoints list is larger, the function fails.
970+
* \param endpoints_count
971+
* Number of endpoints written to the given endpoints buffer
972+
* \return Return code of the operation
973+
*/
974+
app_res_e WPC_get_config_data_item_list(uint16_t *const endpoints,
975+
const size_t endpoints_capacity,
976+
uint8_t *const endpoints_count);
977+
963978
/**
964979
* \brief Callback definition to register for received data
965980
* \param bytes

‎lib/wpc/include/msap.h

+24
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,18 @@ typedef struct __attribute__((__packed__))
211211
uint8_t payload[MAXIMUM_CDC_ITEM_PAYLOAD_SIZE];
212212
} msap_config_data_item_get_conf_pl_t;
213213

214+
typedef struct __attribute__((__packed__))
215+
{
216+
uint8_t command;
217+
} msap_config_data_item_list_items_req_pl_t;
218+
219+
typedef struct __attribute__((__packed__))
220+
{
221+
uint8_t result;
222+
uint8_t amount_endpoints;
223+
uint8_t endpoints_list[MAXIMUM_CDC_ITEM_LIST_BYTE_COUNT];
224+
} msap_config_data_item_list_items_conf_pl_t;
225+
214226
typedef struct __attribute__((__packed__))
215227
{
216228
uint8_t indication_status;
@@ -509,6 +521,18 @@ int msap_config_data_item_get_request(const uint16_t endpoint,
509521
const size_t payload_capacity,
510522
uint8_t *const payload_size);
511523

524+
/**
525+
* \brief Request to get config data item list
526+
* \param command
527+
* Reserved for future use. Currently only value 0 is used.
528+
* \param response
529+
* Pointer to the read response.
530+
* \return Negative value upon internal error, otherwise result code returned
531+
* by the DualMCU API
532+
*/
533+
int msap_config_data_item_list_items_request(const uint8_t command,
534+
msap_config_data_item_list_items_conf_pl_t *const response);
535+
512536
/**
513537
* \brief Handler for stack state indication
514538
* \param payload

‎lib/wpc/include/wpc_constants.h

+2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292
#define MSAP_CONFIG_DATA_ITEM_GET_CONFIRM (SAP_CONFIRM_OFFSET + MSAP_CONFIG_DATA_ITEM_GET_REQUEST)
9393
#define MSAP_CONFIG_DATA_ITEM_RX_INDICATION 0x31
9494
#define MSAP_CONFIG_DATA_ITEM_RX_RESPONSE (SAP_RESPONSE_OFFSET + MSAP_CONFIG_DATA_ITEM_RX_INDICATION)
95+
#define MSAP_CONFIG_DATA_ITEM_LIST_ITEMS_REQUEST 0x32
96+
#define MSAP_CONFIG_DATA_ITEM_LIST_ITEMS_CONFIRM (SAP_RESPONSE_OFFSET + MSAP_CONFIG_DATA_ITEM_LIST_ITEMS_REQUEST)
9597

9698
/*
9799
* Configuration Service Access Points

‎lib/wpc/include/wpc_types.h

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ typedef struct __attribute__((__packed__))
6767
msap_image_block_read_req_pl_t msap_image_block_read_request_payload;
6868
msap_config_data_item_set_req_pl_t msap_config_data_item_set_request_payload;
6969
msap_config_data_item_get_req_pl_t msap_config_data_item_get_request_payload;
70+
msap_config_data_item_list_items_req_pl_t msap_config_data_item_list_items_request_payload;
7071
// Indication
7172
dsap_data_tx_ind_pl_t dsap_data_tx_indication_payload;
7273
dsap_data_rx_ind_pl_t dsap_data_rx_indication_payload;
@@ -88,6 +89,7 @@ typedef struct __attribute__((__packed__))
8889
msap_scratchpad_target_read_conf_pl_t msap_scratchpad_target_read_confirm_payload;
8990
msap_image_block_read_conf_pl_t msap_image_block_read_confirm_payload;
9091
msap_config_data_item_get_conf_pl_t msap_config_data_item_get_confirm_payload;
92+
msap_config_data_item_list_items_conf_pl_t msap_config_data_item_list_items_confirm_payload;
9193
// Response
9294
sap_resp_pl_t sap_response_payload;
9395
} payload;

‎lib/wpc/msap.c

+30
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,36 @@ int msap_config_data_item_get_request(const uint16_t endpoint,
532532
return confirm.payload.sap_generic_confirm_payload.result;
533533
}
534534

535+
int msap_config_data_item_list_items_request(const uint8_t command,
536+
msap_config_data_item_list_items_conf_pl_t *const response)
537+
{
538+
wpc_frame_t request = {
539+
.primitive_id = MSAP_CONFIG_DATA_ITEM_LIST_ITEMS_REQUEST,
540+
.payload_length = sizeof(msap_config_data_item_list_items_req_pl_t),
541+
.payload = {
542+
.msap_config_data_item_list_items_request_payload = {
543+
.command = command
544+
}
545+
}
546+
};
547+
548+
wpc_frame_t confirm;
549+
const int res = WPC_Int_send_request(&request, &confirm);
550+
if (res < 0)
551+
{
552+
return res;
553+
}
554+
555+
if (confirm.payload.sap_generic_confirm_payload.result == 0)
556+
{
557+
memcpy(response,
558+
&confirm.payload.msap_config_data_item_list_items_confirm_payload,
559+
sizeof(msap_config_data_item_list_items_conf_pl_t));
560+
}
561+
562+
return confirm.payload.sap_generic_confirm_payload.result;
563+
}
564+
535565
void msap_stack_state_indication_handler(msap_stack_state_ind_pl_t * payload)
536566
{
537567
LOGI("Status is 0x%02x\n", payload->status);

‎lib/wpc/wpc.c

+40
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,46 @@ app_res_e WPC_get_config_data_item(const uint16_t endpoint,
12181218
return convert_error_code(CDC_ITEM_GET_ERROR_CODE_LUT, res);
12191219
}
12201220

1221+
static const app_res_e CDC_GET_ITEM_LIST_ERROR_CODE_LUT[] = {
1222+
APP_RES_OK, // 0
1223+
};
1224+
1225+
app_res_e WPC_get_config_data_item_list(uint16_t *const endpoints,
1226+
const size_t endpoints_capacity,
1227+
uint8_t *const endpoints_count)
1228+
{
1229+
msap_config_data_item_list_items_conf_pl_t response = { 0 };
1230+
const int msap_res = msap_config_data_item_list_items_request(0, &response);
1231+
if (msap_res < 0)
1232+
{
1233+
LOGE("Error getting config data item list: %d\n", msap_res);
1234+
return APP_RES_INTERNAL_ERROR;
1235+
}
1236+
1237+
const app_res_e res = convert_error_code(CDC_GET_ITEM_LIST_ERROR_CODE_LUT, msap_res);
1238+
if (res == APP_RES_OK)
1239+
{
1240+
if (response.amount_endpoints * 2 > endpoints_capacity)
1241+
{
1242+
LOGE("Endpoints list buffer size is too small: %d\n", endpoints_capacity);
1243+
return APP_RES_INTERNAL_ERROR;
1244+
}
1245+
if (response.amount_endpoints * 2 > sizeof(response.endpoints_list))
1246+
{
1247+
LOGE("Invalid amount of endpoints received: %d\n", response.amount_endpoints);
1248+
return APP_RES_INTERNAL_ERROR;
1249+
}
1250+
1251+
_Static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__, "");
1252+
memcpy(endpoints,
1253+
&response.endpoints_list,
1254+
response.amount_endpoints * 2);
1255+
*endpoints_count = response.amount_endpoints;
1256+
}
1257+
1258+
return res;
1259+
}
1260+
12211261
#ifdef REGISTER_DATA_PER_ENDPOINT
12221262
app_res_e WPC_register_for_data(uint8_t dst_ep, onDataReceived_cb_f onDataReceived)
12231263
{

‎test/cdd_tests.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,43 @@ TEST_F(WpcCddApiTest, settingTooManyOptionalItemsShouldFail)
313313
ASSERT_GT(detected_max_item_count, 0);
314314
}
315315

316+
TEST_F(WpcCddApiTest, gettingEndpointsListShouldFailIfBufferIsTooSmall)
317+
{
318+
const uint8_t TEST_PAYLOAD[] = { 0x10 };
319+
ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(100, TEST_PAYLOAD, sizeof(TEST_PAYLOAD)));
320+
ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(200, TEST_PAYLOAD, sizeof(TEST_PAYLOAD)));
321+
322+
uint16_t endpoints_list[1] = { 0 };
323+
uint8_t endpoints_count = 0xFF;
324+
ASSERT_EQ(APP_RES_INTERNAL_ERROR,
325+
WPC_get_config_data_item_list(endpoints_list, sizeof(endpoints_list), &endpoints_count));
326+
}
327+
328+
TEST_F(WpcCddApiTest, shouldReturnEmptyListIfNoOptionalItemIsSet)
329+
{
330+
uint16_t endpoints_list[10] = { 0 };
331+
uint8_t endpoints_count = 0xFF;
332+
ASSERT_EQ(APP_RES_OK,
333+
WPC_get_config_data_item_list(endpoints_list, sizeof(endpoints_list), &endpoints_count));
334+
ASSERT_EQ(0, endpoints_count);
335+
}
336+
337+
TEST_F(WpcCddApiTest, gettingListOfOptionalEndpointsShouldWork)
338+
{
339+
const std::set<uint16_t> endpoints = { 0xAABB, 0x1234, 0xD0B0 };
340+
for (const auto& endpoint : endpoints) {
341+
const uint8_t TEST_PAYLOAD[] = { 0x10 };
342+
ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(endpoint, TEST_PAYLOAD, sizeof(TEST_PAYLOAD)));
343+
}
344+
345+
uint16_t endpoints_list[3] = { 0 };
346+
uint8_t endpoints_count = 0xFF;
347+
ASSERT_EQ(APP_RES_OK,
348+
WPC_get_config_data_item_list(endpoints_list, sizeof(endpoints_list), &endpoints_count));
349+
350+
ASSERT_EQ(endpoints.size(), endpoints_count);
351+
for (uint8_t i = 0; i < endpoints_count; i++){
352+
ASSERT_EQ(1, endpoints.count(endpoints_list[i]));
353+
}
354+
}
355+

0 commit comments

Comments
 (0)
Please sign in to comment.