diff --git a/examples/common/pigweed/protos/attributes_service.options b/examples/common/pigweed/protos/attributes_service.options index 247d0c5404c3e2..aa6b7acb9cb6e0 100644 --- a/examples/common/pigweed/protos/attributes_service.options +++ b/examples/common/pigweed/protos/attributes_service.options @@ -1,3 +1,4 @@ chip.rpc.AttributeData.data_bytes max_size:128 +chip.rpc.AttributeData.data_string max_size:128 chip.rpc.AttributeData.tlv_data max_size:256 diff --git a/examples/common/pigweed/protos/attributes_service.proto b/examples/common/pigweed/protos/attributes_service.proto index ef34448f93b68f..55276f0dadf564 100644 --- a/examples/common/pigweed/protos/attributes_service.proto +++ b/examples/common/pigweed/protos/attributes_service.proto @@ -5,203 +5,203 @@ import 'pw_protobuf_protos/common.proto'; package chip.rpc; enum AttributeType { - ZCL_NO_DATA_ATTRIBUTE_TYPE = 0x00; // No data - ZCL_BOOLEAN_ATTRIBUTE_TYPE = 0x10; // Boolean - ZCL_BITMAP8_ATTRIBUTE_TYPE = 0x18; // 8-bit bitmap - ZCL_BITMAP16_ATTRIBUTE_TYPE = 0x19; // 16-bit bitmap - ZCL_BITMAP32_ATTRIBUTE_TYPE = 0x1B; // 32-bit bitmap - ZCL_BITMAP64_ATTRIBUTE_TYPE = 0x1F; // 64-bit bitmap - ZCL_INT8U_ATTRIBUTE_TYPE = 0x20; // Unsigned 8-bit integer - ZCL_INT16U_ATTRIBUTE_TYPE = 0x21; // Unsigned 16-bit integer - ZCL_INT24U_ATTRIBUTE_TYPE = 0x22; // Unsigned 24-bit integer - ZCL_INT32U_ATTRIBUTE_TYPE = 0x23; // Unsigned 32-bit integer - ZCL_INT40U_ATTRIBUTE_TYPE = 0x24; // Unsigned 40-bit integer - ZCL_INT48U_ATTRIBUTE_TYPE = 0x25; // Unsigned 48-bit integer - ZCL_INT56U_ATTRIBUTE_TYPE = 0x26; // Unsigned 56-bit integer - ZCL_INT64U_ATTRIBUTE_TYPE = 0x27; // Unsigned 64-bit integer - ZCL_INT8S_ATTRIBUTE_TYPE = 0x28; // Signed 8-bit integer - ZCL_INT16S_ATTRIBUTE_TYPE = 0x29; // Signed 16-bit integer - ZCL_INT24S_ATTRIBUTE_TYPE = 0x2A; // Signed 24-bit integer - ZCL_INT32S_ATTRIBUTE_TYPE = 0x2B; // Signed 32-bit integer - ZCL_INT40S_ATTRIBUTE_TYPE = 0x2C; // Signed 40-bit integer - ZCL_INT48S_ATTRIBUTE_TYPE = 0x2D; // Signed 48-bit integer - ZCL_INT56S_ATTRIBUTE_TYPE = 0x2E; // Signed 56-bit integer - ZCL_INT64S_ATTRIBUTE_TYPE = 0x2F; // Signed 64-bit integer - ZCL_ENUM8_ATTRIBUTE_TYPE = 0x30; // 8-bit enumeration - ZCL_ENUM16_ATTRIBUTE_TYPE = 0x31; // 16-bit enumeration - ZCL_SINGLE_ATTRIBUTE_TYPE = 0x39; // Single precision - ZCL_DOUBLE_ATTRIBUTE_TYPE = 0x3A; // Double precision - ZCL_OCTET_STRING_ATTRIBUTE_TYPE = 0x41; // Octet String - ZCL_CHAR_STRING_ATTRIBUTE_TYPE = 0x42; // Character String - ZCL_LONG_OCTET_STRING_ATTRIBUTE_TYPE = 0x43; // Long Octet String - ZCL_LONG_CHAR_STRING_ATTRIBUTE_TYPE = 0x44; // Long Character String - ZCL_ARRAY_ATTRIBUTE_TYPE = 0x48; // List - ZCL_STRUCT_ATTRIBUTE_TYPE = 0x4C; // Structure - ZCL_TOD_ATTRIBUTE_TYPE = 0xE0; // Time of day - ZCL_DATE_ATTRIBUTE_TYPE = 0xE1; // Date - ZCL_UTC_ATTRIBUTE_TYPE = 0xE2; // UTC Time - ZCL_EPOCH_US_ATTRIBUTE_TYPE = 0xE3; // Epoch Microseconds - ZCL_EPOCH_S_ATTRIBUTE_TYPE = 0xE4; // Epoch Seconds - ZCL_SYSTIME_US_ATTRIBUTE_TYPE = 0xE5; // System Time Microseconds - ZCL_PERCENT_ATTRIBUTE_TYPE = 0xE6; // Percentage units 1% - ZCL_PERCENT100THS_ATTRIBUTE_TYPE = 0xE7; // Percentage units 0.01% - ZCL_CLUSTER_ID_ATTRIBUTE_TYPE = 0xE8; // Cluster ID - ZCL_ATTRIB_ID_ATTRIBUTE_TYPE = 0xE9; // Attribute ID - ZCL_FIELD_ID_ATTRIBUTE_TYPE = 0xEA; // Field ID - ZCL_EVENT_ID_ATTRIBUTE_TYPE = 0xEB; // Event ID - ZCL_COMMAND_ID_ATTRIBUTE_TYPE = 0xEC; // Command ID - ZCL_ACTION_ID_ATTRIBUTE_TYPE = 0xED; // Action ID - ZCL_TRANS_ID_ATTRIBUTE_TYPE = 0xEF; // Transaction ID - ZCL_NODE_ID_ATTRIBUTE_TYPE = 0xF0; // Node ID - ZCL_VENDOR_ID_ATTRIBUTE_TYPE = 0xF1; // Vendor ID - ZCL_DEVTYPE_ID_ATTRIBUTE_TYPE = 0xF2; // Device Type ID - ZCL_FABRIC_ID_ATTRIBUTE_TYPE = 0xF3; // Fabric ID - ZCL_GROUP_ID_ATTRIBUTE_TYPE = 0xF4; // Group ID - ZCL_STATUS_ATTRIBUTE_TYPE = 0xF5; // Status Code - ZCL_DATA_VER_ATTRIBUTE_TYPE = 0xF6; // Data Version - ZCL_EVENT_NO_ATTRIBUTE_TYPE = 0xF7; // Event Number - ZCL_ENDPOINT_NO_ATTRIBUTE_TYPE = 0xF8; // Endpoint Number - ZCL_FABRIC_IDX_ATTRIBUTE_TYPE = 0xF9; // Fabric Index - ZCL_IPADR_ATTRIBUTE_TYPE = 0xFA; // IP Address - ZCL_IPV4ADR_ATTRIBUTE_TYPE = 0xFB; // IPv4 Address - ZCL_IPV6ADR_ATTRIBUTE_TYPE = 0xFC; // IPv6 Address - ZCL_IPV6PRE_ATTRIBUTE_TYPE = 0xFD; // IPv6 Prefix - ZCL_HWADR_ATTRIBUTE_TYPE = 0xFE; // Hardware Address - ZCL_UNKNOWN_ATTRIBUTE_TYPE = 0xFF; // Unknown + ZCL_NO_DATA_ATTRIBUTE_TYPE = 0x00; // No data + ZCL_BOOLEAN_ATTRIBUTE_TYPE = 0x10; // Boolean + ZCL_BITMAP8_ATTRIBUTE_TYPE = 0x18; // 8-bit bitmap + ZCL_BITMAP16_ATTRIBUTE_TYPE = 0x19; // 16-bit bitmap + ZCL_BITMAP32_ATTRIBUTE_TYPE = 0x1B; // 32-bit bitmap + ZCL_BITMAP64_ATTRIBUTE_TYPE = 0x1F; // 64-bit bitmap + ZCL_INT8U_ATTRIBUTE_TYPE = 0x20; // Unsigned 8-bit integer + ZCL_INT16U_ATTRIBUTE_TYPE = 0x21; // Unsigned 16-bit integer + ZCL_INT24U_ATTRIBUTE_TYPE = 0x22; // Unsigned 24-bit integer + ZCL_INT32U_ATTRIBUTE_TYPE = 0x23; // Unsigned 32-bit integer + ZCL_INT40U_ATTRIBUTE_TYPE = 0x24; // Unsigned 40-bit integer + ZCL_INT48U_ATTRIBUTE_TYPE = 0x25; // Unsigned 48-bit integer + ZCL_INT56U_ATTRIBUTE_TYPE = 0x26; // Unsigned 56-bit integer + ZCL_INT64U_ATTRIBUTE_TYPE = 0x27; // Unsigned 64-bit integer + ZCL_INT8S_ATTRIBUTE_TYPE = 0x28; // Signed 8-bit integer + ZCL_INT16S_ATTRIBUTE_TYPE = 0x29; // Signed 16-bit integer + ZCL_INT24S_ATTRIBUTE_TYPE = 0x2A; // Signed 24-bit integer + ZCL_INT32S_ATTRIBUTE_TYPE = 0x2B; // Signed 32-bit integer + ZCL_INT40S_ATTRIBUTE_TYPE = 0x2C; // Signed 40-bit integer + ZCL_INT48S_ATTRIBUTE_TYPE = 0x2D; // Signed 48-bit integer + ZCL_INT56S_ATTRIBUTE_TYPE = 0x2E; // Signed 56-bit integer + ZCL_INT64S_ATTRIBUTE_TYPE = 0x2F; // Signed 64-bit integer + ZCL_ENUM8_ATTRIBUTE_TYPE = 0x30; // 8-bit enumeration + ZCL_ENUM16_ATTRIBUTE_TYPE = 0x31; // 16-bit enumeration + ZCL_SINGLE_ATTRIBUTE_TYPE = 0x39; // Single precision + ZCL_DOUBLE_ATTRIBUTE_TYPE = 0x3A; // Double precision + ZCL_OCTET_STRING_ATTRIBUTE_TYPE = 0x41; // Octet String + ZCL_CHAR_STRING_ATTRIBUTE_TYPE = 0x42; // Character String + ZCL_LONG_OCTET_STRING_ATTRIBUTE_TYPE = 0x43; // Long Octet String + ZCL_LONG_CHAR_STRING_ATTRIBUTE_TYPE = 0x44; // Long Character String + ZCL_ARRAY_ATTRIBUTE_TYPE = 0x48; // List + ZCL_STRUCT_ATTRIBUTE_TYPE = 0x4C; // Structure + ZCL_TOD_ATTRIBUTE_TYPE = 0xE0; // Time of day + ZCL_DATE_ATTRIBUTE_TYPE = 0xE1; // Date + ZCL_UTC_ATTRIBUTE_TYPE = 0xE2; // UTC Time + ZCL_EPOCH_US_ATTRIBUTE_TYPE = 0xE3; // Epoch Microseconds + ZCL_EPOCH_S_ATTRIBUTE_TYPE = 0xE4; // Epoch Seconds + ZCL_SYSTIME_US_ATTRIBUTE_TYPE = 0xE5; // System Time Microseconds + ZCL_PERCENT_ATTRIBUTE_TYPE = 0xE6; // Percentage units 1% + ZCL_PERCENT100THS_ATTRIBUTE_TYPE = 0xE7; // Percentage units 0.01% + ZCL_CLUSTER_ID_ATTRIBUTE_TYPE = 0xE8; // Cluster ID + ZCL_ATTRIB_ID_ATTRIBUTE_TYPE = 0xE9; // Attribute ID + ZCL_FIELD_ID_ATTRIBUTE_TYPE = 0xEA; // Field ID + ZCL_EVENT_ID_ATTRIBUTE_TYPE = 0xEB; // Event ID + ZCL_COMMAND_ID_ATTRIBUTE_TYPE = 0xEC; // Command ID + ZCL_ACTION_ID_ATTRIBUTE_TYPE = 0xED; // Action ID + ZCL_TRANS_ID_ATTRIBUTE_TYPE = 0xEF; // Transaction ID + ZCL_NODE_ID_ATTRIBUTE_TYPE = 0xF0; // Node ID + ZCL_VENDOR_ID_ATTRIBUTE_TYPE = 0xF1; // Vendor ID + ZCL_DEVTYPE_ID_ATTRIBUTE_TYPE = 0xF2; // Device Type ID + ZCL_FABRIC_ID_ATTRIBUTE_TYPE = 0xF3; // Fabric ID + ZCL_GROUP_ID_ATTRIBUTE_TYPE = 0xF4; // Group ID + ZCL_STATUS_ATTRIBUTE_TYPE = 0xF5; // Status Code + ZCL_DATA_VER_ATTRIBUTE_TYPE = 0xF6; // Data Version + ZCL_EVENT_NO_ATTRIBUTE_TYPE = 0xF7; // Event Number + ZCL_ENDPOINT_NO_ATTRIBUTE_TYPE = 0xF8; // Endpoint Number + ZCL_FABRIC_IDX_ATTRIBUTE_TYPE = 0xF9; // Fabric Index + ZCL_IPADR_ATTRIBUTE_TYPE = 0xFA; // IP Address + ZCL_IPV4ADR_ATTRIBUTE_TYPE = 0xFB; // IPv4 Address + ZCL_IPV6ADR_ATTRIBUTE_TYPE = 0xFC; // IPv6 Address + ZCL_IPV6PRE_ATTRIBUTE_TYPE = 0xFD; // IPv6 Prefix + ZCL_HWADR_ATTRIBUTE_TYPE = 0xFE; // Hardware Address + ZCL_UNKNOWN_ATTRIBUTE_TYPE = 0xFF; // Unknown } enum ClusterType { - ZCL_INVALID_CLUSTER_ID = 0x0000; - ZCL_POWER_CONFIG_CLUSTER_ID = 0x0001; - ZCL_DEVICE_TEMP_CLUSTER_ID = 0x0002; - ZCL_IDENTIFY_CLUSTER_ID = 0x0003; - ZCL_GROUPS_CLUSTER_ID = 0x0004; - ZCL_ON_OFF_CLUSTER_ID = 0x0006; - ZCL_LEVEL_CONTROL_CLUSTER_ID = 0x0008; - ZCL_ALARM_CLUSTER_ID = 0x0009; - ZCL_TIME_CLUSTER_ID = 0x000A; - ZCL_POWER_PROFILE_CLUSTER_ID = 0x001A; - ZCL_APPLIANCE_CONTROL_CLUSTER_ID = 0x001B; - ZCL_DESCRIPTOR_CLUSTER_ID = 0x001D; - ZCL_POLL_CONTROL_CLUSTER_ID = 0x0020; - ZCL_ACTIONS_CLUSTER_ID = 0x0025; - ZCL_BASIC_CLUSTER_ID = 0x0028; - ZCL_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_ID = 0x0029; - ZCL_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_ID = 0x002A; - ZCL_UNIT_LOCALIZATION_CLUSTER_ID = 0x002D; - ZCL_POWER_SOURCE_CLUSTER_ID = 0x002F; - ZCL_GENERAL_COMMISSIONING_CLUSTER_ID = 0x0030; - ZCL_NETWORK_COMMISSIONING_CLUSTER_ID = 0x0031; - ZCL_DIAGNOSTIC_LOGS_CLUSTER_ID = 0x0032; - ZCL_GENERAL_DIAGNOSTICS_CLUSTER_ID = 0x0033; - ZCL_SOFTWARE_DIAGNOSTICS_CLUSTER_ID = 0x0034; - ZCL_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0035; - ZCL_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0036; - ZCL_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0037; - ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_ID = 0x0039; - ZCL_SWITCH_CLUSTER_ID = 0x003B; - ZCL_ADMINISTRATOR_COMMISSIONING_CLUSTER_ID = 0x003C; - ZCL_OPERATIONAL_CREDENTIALS_CLUSTER_ID = 0x003E; - ZCL_FIXED_LABEL_CLUSTER_ID = 0x0040; - ZCL_BOOLEAN_STATE_CLUSTER_ID = 0x0045; - ZCL_MODE_SELECT_CLUSTER_ID = 0x0050; - ZCL_LAUNDRY_WASHER_MODE_CLUSTER_ID = 0x0051; - ZCL_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_ID = 0x0052; - ZCL_LAUNDRY_WASHER_CONTROLS_CLUSTER_ID = 0x0053; - ZCL_RVC_RUN_MODE_CLUSTER_ID = 0x0054; - ZCL_RVC_CLEAN_MODE_CLUSTER_ID = 0x0055; - ZCL_TEMPERATURE_CONTROL_CLUSTER_ID = 0x0056; - ZCL_REFRIGERATOR_ALARM_CLUSTER_ID = 0x0057; - ZCL_DISHWASHER_MODE_CLUSTER_ID = 0x0059; - ZCL_AIR_QUALITY_CLUSTER_ID = 0x005B; - ZCL_DISHWASHER_ALARM_CLUSTER_ID = 0x005D; - ZCL_SMOKE_CO_ALARM_ID = 0x005C; - ZCL_OPERATIONAL_STATE_CLUSTER_ID = 0x0060; - ZCL_RVC_OPERATIONAL_STATE_CLUSTER_ID = 0x0061; - ZCL_HEPA_FILTER_MONITORING_CLUSTER_ID = 0x0071; - ZCL_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_ID = 0x0072; - ZCL_SHADE_CONFIG_CLUSTER_ID = 0x0100; - ZCL_DOOR_LOCK_CLUSTER_ID = 0x0101; - ZCL_WINDOW_COVERING_CLUSTER_ID = 0x0102; - ZCL_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_ID = 0x0200; - ZCL_THERMOSTAT_CLUSTER_ID = 0x0201; - ZCL_FAN_CONTROL_CLUSTER_ID = 0x0202; - ZCL_DEHUMID_CONTROL_CLUSTER_ID = 0x0203; - ZCL_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_ID = 0x0204; - ZCL_COLOR_CONTROL_CLUSTER_ID = 0x0300; - ZCL_BALLAST_CONFIGURATION_CLUSTER_ID = 0x0301; - ZCL_ILLUMINANCE_MEASUREMENT_CLUSTER_ID = 0x0400; - ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_ID = 0x0402; - ZCL_PRESSURE_MEASUREMENT_CLUSTER_ID = 0x0403; - ZCL_FLOW_MEASUREMENT_CLUSTER_ID = 0x0404; - ZCL_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_ID = 0x0405; - ZCL_OCCUPANCY_SENSING_CLUSTER_ID = 0x0406; - ZCL_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040C; - ZCL_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040D; - ZCL_ETHYLENE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040E; - ZCL_ETHYLENE_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040F; - ZCL_HYDROGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0410; - ZCL_HYDROGEN_SULPHIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0411; - ZCL_NITRIC_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0412; - ZCL_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0413; - ZCL_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0414; - ZCL_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0415; - ZCL_SULFUR_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0416; - ZCL_DISSOLVED_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0417; - ZCL_BROMATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0418; - ZCL_CHLORAMINES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0419; - ZCL_CHLORINE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041A; - ZCL_FECAL_COLIFORM_AND_E_COLI_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041B; - ZCL_FLUORIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041C; - ZCL_HALOACETIC_ACIDS_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041D; - ZCL_TOTAL_TRIHALOMETHANES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041E; - ZCL_TOTAL_COLIFORM_BACTERIA_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041F; - ZCL_TURBIDITY_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0420; - ZCL_COPPER_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0421; - ZCL_LEAD_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0422; - ZCL_MANGANESE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0423; - ZCL_SULFATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0424; - ZCL_BROMODICHLOROMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0425; - ZCL_BROMOFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0426; - ZCL_CHLORODIBROMOMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0427; - ZCL_CHLOROFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0428; - ZCL_SODIUM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0429; - ZCL_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042A; - ZCL_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042B; - ZCL_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042C; - ZCL_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042D; - ZCL_TOTAL_VOLATILE_ORGANIC_COMPOUNDS_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042E; - ZCL_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042F; - ZCL_WAKE_ON_LAN_CLUSTER_ID = 0x0503; - ZCL_CHANNEL_CLUSTER_ID = 0x0504; - ZCL_TARGET_NAVIGATOR_CLUSTER_ID = 0x0505; - ZCL_MEDIA_PLAYBACK_CLUSTER_ID = 0x0506; - ZCL_MEDIA_INPUT_CLUSTER_ID = 0x0507; - ZCL_LOW_POWER_CLUSTER_ID = 0x0508; - ZCL_KEYPAD_INPUT_CLUSTER_ID = 0x0509; - ZCL_CONTENT_LAUNCHER_CLUSTER_ID = 0x050A; - ZCL_AUDIO_OUTPUT_CLUSTER_ID = 0x050B; - ZCL_APPLICATION_LAUNCHER_CLUSTER_ID = 0x050C; - ZCL_APPLICATION_BASIC_CLUSTER_ID = 0x050D; - ZCL_ACCOUNT_LOGIN_CLUSTER_ID = 0x050E; - ZCL_CONTENT_CONTROL_CLUSTER_ID = 0x050F; - ZCL_MESSAGING_CLUSTER_ID = 0x0703; - ZCL_MESSAGES_CLUSTER_ID = 0x0097; - ZCL_APPLIANCE_IDENTIFICATION_CLUSTER_ID = 0x0B00; - ZCL_METER_IDENTIFICATION_CLUSTER_ID = 0x0B01; - ZCL_APPLIANCE_EVENTS_AND_ALERT_CLUSTER_ID = 0x0B02; - ZCL_APPLIANCE_STATISTICS_CLUSTER_ID = 0x0B03; - ZCL_SAMPLE_MFG_SPECIFIC_CLUSTER_ID = 0xFC00; + ZCL_INVALID_CLUSTER_ID = 0x0000; ZCL_POWER_CONFIG_CLUSTER_ID = 0x0001; + ZCL_DEVICE_TEMP_CLUSTER_ID = 0x0002; + ZCL_IDENTIFY_CLUSTER_ID = 0x0003; + ZCL_GROUPS_CLUSTER_ID = 0x0004; + ZCL_ON_OFF_CLUSTER_ID = 0x0006; + ZCL_LEVEL_CONTROL_CLUSTER_ID = 0x0008; + ZCL_ALARM_CLUSTER_ID = 0x0009; + ZCL_TIME_CLUSTER_ID = 0x000A; + ZCL_POWER_PROFILE_CLUSTER_ID = 0x001A; + ZCL_APPLIANCE_CONTROL_CLUSTER_ID = 0x001B; + ZCL_DESCRIPTOR_CLUSTER_ID = 0x001D; + ZCL_POLL_CONTROL_CLUSTER_ID = 0x0020; + ZCL_ACTIONS_CLUSTER_ID = 0x0025; + ZCL_BASIC_CLUSTER_ID = 0x0028; + ZCL_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_ID = 0x0029; + ZCL_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_ID = 0x002A; + ZCL_UNIT_LOCALIZATION_CLUSTER_ID = 0x002D; + ZCL_POWER_SOURCE_CLUSTER_ID = 0x002F; + ZCL_GENERAL_COMMISSIONING_CLUSTER_ID = 0x0030; + ZCL_NETWORK_COMMISSIONING_CLUSTER_ID = 0x0031; + ZCL_DIAGNOSTIC_LOGS_CLUSTER_ID = 0x0032; + ZCL_GENERAL_DIAGNOSTICS_CLUSTER_ID = 0x0033; + ZCL_SOFTWARE_DIAGNOSTICS_CLUSTER_ID = 0x0034; + ZCL_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0035; + ZCL_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0036; + ZCL_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0037; + ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_ID = 0x0039; + ZCL_SWITCH_CLUSTER_ID = 0x003B; + ZCL_ADMINISTRATOR_COMMISSIONING_CLUSTER_ID = 0x003C; + ZCL_OPERATIONAL_CREDENTIALS_CLUSTER_ID = 0x003E; + ZCL_FIXED_LABEL_CLUSTER_ID = 0x0040; + ZCL_BOOLEAN_STATE_CLUSTER_ID = 0x0045; + ZCL_MODE_SELECT_CLUSTER_ID = 0x0050; + ZCL_LAUNDRY_WASHER_MODE_CLUSTER_ID = 0x0051; + ZCL_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_ID = 0x0052; + ZCL_LAUNDRY_WASHER_CONTROLS_CLUSTER_ID = 0x0053; + ZCL_RVC_RUN_MODE_CLUSTER_ID = 0x0054; + ZCL_RVC_CLEAN_MODE_CLUSTER_ID = 0x0055; + ZCL_TEMPERATURE_CONTROL_CLUSTER_ID = 0x0056; + ZCL_REFRIGERATOR_ALARM_CLUSTER_ID = 0x0057; + ZCL_DISHWASHER_MODE_CLUSTER_ID = 0x0059; + ZCL_AIR_QUALITY_CLUSTER_ID = 0x005B; + ZCL_DISHWASHER_ALARM_CLUSTER_ID = 0x005D; + ZCL_SMOKE_CO_ALARM_ID = 0x005C; + ZCL_OPERATIONAL_STATE_CLUSTER_ID = 0x0060; + ZCL_RVC_OPERATIONAL_STATE_CLUSTER_ID = 0x0061; + ZCL_HEPA_FILTER_MONITORING_CLUSTER_ID = 0x0071; + ZCL_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_ID = 0x0072; + ZCL_SHADE_CONFIG_CLUSTER_ID = 0x0100; + ZCL_DOOR_LOCK_CLUSTER_ID = 0x0101; + ZCL_WINDOW_COVERING_CLUSTER_ID = 0x0102; + ZCL_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_ID = 0x0200; + ZCL_THERMOSTAT_CLUSTER_ID = 0x0201; + ZCL_FAN_CONTROL_CLUSTER_ID = 0x0202; + ZCL_DEHUMID_CONTROL_CLUSTER_ID = 0x0203; + ZCL_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_ID = 0x0204; + ZCL_COLOR_CONTROL_CLUSTER_ID = 0x0300; + ZCL_BALLAST_CONFIGURATION_CLUSTER_ID = 0x0301; + ZCL_ILLUMINANCE_MEASUREMENT_CLUSTER_ID = 0x0400; + ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_ID = 0x0402; + ZCL_PRESSURE_MEASUREMENT_CLUSTER_ID = 0x0403; + ZCL_FLOW_MEASUREMENT_CLUSTER_ID = 0x0404; + ZCL_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_ID = 0x0405; + ZCL_OCCUPANCY_SENSING_CLUSTER_ID = 0x0406; + ZCL_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040C; + ZCL_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040D; + ZCL_ETHYLENE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040E; + ZCL_ETHYLENE_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040F; + ZCL_HYDROGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0410; + ZCL_HYDROGEN_SULPHIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0411; + ZCL_NITRIC_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0412; + ZCL_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0413; + ZCL_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0414; + ZCL_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0415; + ZCL_SULFUR_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0416; + ZCL_DISSOLVED_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0417; + ZCL_BROMATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0418; + ZCL_CHLORAMINES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0419; + ZCL_CHLORINE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041A; + ZCL_FECAL_COLIFORM_AND_E_COLI_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041B; + ZCL_FLUORIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041C; + ZCL_HALOACETIC_ACIDS_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041D; + ZCL_TOTAL_TRIHALOMETHANES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041E; + ZCL_TOTAL_COLIFORM_BACTERIA_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041F; + ZCL_TURBIDITY_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0420; + ZCL_COPPER_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0421; + ZCL_LEAD_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0422; + ZCL_MANGANESE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0423; + ZCL_SULFATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0424; + ZCL_BROMODICHLOROMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0425; + ZCL_BROMOFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0426; + ZCL_CHLORODIBROMOMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0427; + ZCL_CHLOROFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0428; + ZCL_SODIUM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0429; + ZCL_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042A; + ZCL_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042B; + ZCL_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042C; + ZCL_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042D; + ZCL_TOTAL_VOLATILE_ORGANIC_COMPOUNDS_CONCENTRATION_MEASUREMENT_CLUSTER_ID = + 0x042E; + ZCL_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x042F; + ZCL_WAKE_ON_LAN_CLUSTER_ID = 0x0503; + ZCL_CHANNEL_CLUSTER_ID = 0x0504; + ZCL_TARGET_NAVIGATOR_CLUSTER_ID = 0x0505; + ZCL_MEDIA_PLAYBACK_CLUSTER_ID = 0x0506; + ZCL_MEDIA_INPUT_CLUSTER_ID = 0x0507; + ZCL_LOW_POWER_CLUSTER_ID = 0x0508; + ZCL_KEYPAD_INPUT_CLUSTER_ID = 0x0509; + ZCL_CONTENT_LAUNCHER_CLUSTER_ID = 0x050A; + ZCL_AUDIO_OUTPUT_CLUSTER_ID = 0x050B; + ZCL_APPLICATION_LAUNCHER_CLUSTER_ID = 0x050C; + ZCL_APPLICATION_BASIC_CLUSTER_ID = 0x050D; + ZCL_ACCOUNT_LOGIN_CLUSTER_ID = 0x050E; + ZCL_CONTENT_CONTROL_CLUSTER_ID = 0x050F; + ZCL_MESSAGING_CLUSTER_ID = 0x0703; + ZCL_MESSAGES_CLUSTER_ID = 0x0097; + ZCL_APPLIANCE_IDENTIFICATION_CLUSTER_ID = 0x0B00; + ZCL_METER_IDENTIFICATION_CLUSTER_ID = 0x0B01; + ZCL_APPLIANCE_EVENTS_AND_ALERT_CLUSTER_ID = 0x0B02; + ZCL_APPLIANCE_STATISTICS_CLUSTER_ID = 0x0B03; + ZCL_SAMPLE_MFG_SPECIFIC_CLUSTER_ID = 0xFC00; - // NOTE: This is a large number that becomes negative as a 32-bit integer. - // - // Protobuf documentation states: - // Enumerator constants must be in the range of a 32-bit integer. Since enum values - // use varint encoding on the wire, negative values are inefficient and thus not recommended. - ZCL_TEST_CLUSTER_ID = -918523; // 0xFFF1FC05; + // NOTE: This is a large number that becomes negative as a 32-bit integer. + // + // Protobuf documentation states: + // Enumerator constants must be in the range of a 32-bit integer. Since enum + // values use varint encoding on the wire, negative values are inefficient + // and thus not recommended. + ZCL_TEST_CLUSTER_ID = -918523; // 0xFFF1FC05; } - message AttributeMetadata { uint32 endpoint = 1; ClusterType cluster = 2; @@ -220,6 +220,7 @@ message AttributeData { int32 data_int16 = 7; int32 data_int32 = 8; float data_single = 10; + string data_string = 11; }; optional bytes tlv_data = 9; } @@ -230,6 +231,6 @@ message AttributeWrite { } service Attributes { - rpc Write(AttributeWrite) returns (pw.protobuf.Empty){} - rpc Read(AttributeMetadata) returns (AttributeData){} + rpc Write(AttributeWrite) returns(pw.protobuf.Empty) {} + rpc Read(AttributeMetadata) returns(AttributeData) {} } diff --git a/examples/common/pigweed/rpc_services/Attributes.h b/examples/common/pigweed/rpc_services/Attributes.h index c7f102a0e6ba24..cfbb400ae2f7f2 100644 --- a/examples/common/pigweed/rpc_services/Attributes.h +++ b/examples/common/pigweed/rpc_services/Attributes.h @@ -18,6 +18,7 @@ #pragma once +#include "attributes_service/attributes_service.pb.h" #include "attributes_service/attributes_service.rpc.pb.h" #include "pigweed/rpc_services/internal/StatusUtils.h" @@ -44,46 +45,177 @@ namespace rpc { class Attributes : public pw_rpc::nanopb::Attributes::Service { public: - ::pw::Status Write(const chip_rpc_AttributeWrite & request, pw_protobuf_Empty & response) + static constexpr TLV::Tag kAttributeDataTag = TLV::ContextTag(1); + static constexpr TLV::Tag kDataTag = TLV::ContextTag(to_underlying(chip::app::AttributeDataIB::Tag::kData)); + + CHIP_ERROR PositionOnDataElement(chip::TLV::TLVReader & reader) { - const void * data; - DeviceLayer::StackLock lock; + // Expect the TLV to be the full structure as received from a read (or subset) + // TLV is a full ReportDataMessage + // - Anonymous Structure (container of everything) + // - 1: Array (one element) + // - Anonymous (the element) + // - 1 (AttributeData/AttributeDataIB) - Structure + // - 0 - Data Version + // - 1 - Path (1: Node, 2: Endpoint, 3: Cluster, 4: Attribute, ...) + // - 2 - Data (variable - may be raw data or a Structure) + + TLV::TLVType unused_outer_type; + + // Enter anonymous wrapper + ReturnErrorOnFailure(reader.Next()); // got to anonymous + ReturnErrorOnFailure(reader.EnterContainer(unused_outer_type)); + + // Enter the array + ReturnErrorOnFailure(reader.Next()); + ReturnErrorOnFailure(reader.EnterContainer(unused_outer_type)); + + // enter the structure of data + ReturnErrorOnFailure(reader.Next()); + ReturnErrorOnFailure(reader.EnterContainer(unused_outer_type)); + + // Find AttributeData Container + { + chip::TLV::TLVReader tmp; + ReturnErrorOnFailure(reader.FindElementWithTag(kAttributeDataTag, tmp)); + reader = tmp; + } + + // Enter into AttributeData Container + ReturnErrorOnFailure(reader.EnterContainer(unused_outer_type)); + + // Find Data Container + { + chip::TLV::TLVReader tmp; + ReturnErrorOnFailure(reader.FindElementWithTag(kDataTag, tmp)); + reader = tmp; + } + + return CHIP_NO_ERROR; + } + + pw::Result ReadIntoTlv(const chip_rpc_AttributeData & data, chip::MutableByteSpan tempBuffer) + { + TLV::TLVReader result; + + if (data.has_tlv_data) + { + result.Init(data.tlv_data.bytes, data.tlv_data.size); + CHIP_ERROR err = PositionOnDataElement(result); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Support, "Failed to parse input TLV buffer: %" CHIP_ERROR_FORMAT, err.Format()); + return pw::Status::InvalidArgument(); + } + + return result; + } - switch (request.data.which_data) + TLV::TLVWriter writer; + + writer.Init(tempBuffer); + + CHIP_ERROR write_status; + + TLV::TLVType outer; + VerifyOrReturnError(writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outer) == CHIP_NO_ERROR, + pw::Status::Internal()); + + switch (data.which_data) { case chip_rpc_AttributeData_data_bool_tag: - data = &request.data.data.data_bool; + write_status = writer.Put(kDataTag, data.data.data_bool); break; case chip_rpc_AttributeData_data_uint8_tag: - data = &request.data.data.data_uint8; + write_status = writer.Put(kDataTag, data.data.data_uint8); break; case chip_rpc_AttributeData_data_uint16_tag: - data = &request.data.data.data_uint16; + write_status = writer.Put(kDataTag, data.data.data_uint16); break; case chip_rpc_AttributeData_data_uint32_tag: - data = &request.data.data.data_uint32; + write_status = writer.Put(kDataTag, data.data.data_uint32); break; case chip_rpc_AttributeData_data_int8_tag: - data = &request.data.data.data_int8; + write_status = writer.Put(kDataTag, data.data.data_int8); break; case chip_rpc_AttributeData_data_int16_tag: - data = &request.data.data.data_int16; + write_status = writer.Put(kDataTag, data.data.data_int16); break; case chip_rpc_AttributeData_data_int32_tag: - data = &request.data.data.data_int32; + write_status = writer.Put(kDataTag, data.data.data_int32); + break; + case chip_rpc_AttributeData_data_single_tag: + write_status = writer.Put(kDataTag, data.data.data_single); break; case chip_rpc_AttributeData_data_bytes_tag: - data = &request.data.data.data_bytes; + write_status = writer.PutBytes(kDataTag, data.data.data_bytes.bytes, data.data.data_bytes.size); break; - case chip_rpc_AttributeData_data_single_tag: - data = &request.data.data.data_single; + case chip_rpc_AttributeData_data_string_tag: + write_status = writer.PutString(kDataTag, data.data.data_string); break; default: return pw::Status::InvalidArgument(); } - RETURN_STATUS_IF_NOT_OK( - emberAfWriteAttribute(request.metadata.endpoint, request.metadata.cluster, request.metadata.attribute_id, - const_cast(static_cast(data)), request.metadata.type)); + + if (write_status != CHIP_NO_ERROR) + { + ChipLogError(Support, "Failed to encode TLV data: %" CHIP_ERROR_FORMAT, write_status.Format()); + return pw::Status::Internal(); + } + + VerifyOrReturnValue(writer.EndContainer(outer) == CHIP_NO_ERROR, pw::Status::Internal()); + VerifyOrReturnValue(writer.Finalize() == CHIP_NO_ERROR, pw::Status::Internal()); + result.Init(tempBuffer.data(), writer.GetLengthWritten()); + + VerifyOrReturnError(result.Next() == CHIP_NO_ERROR, pw::Status::Internal()); + VerifyOrReturnError(result.EnterContainer(outer) == CHIP_NO_ERROR, pw::Status::Internal()); + + // This positions on the data element + VerifyOrReturnError(result.Next() == CHIP_NO_ERROR, pw::Status::Internal()); + + return result; + } + + ::pw::Status Write(const chip_rpc_AttributeWrite & request, pw_protobuf_Empty & response) + { + app::ConcreteAttributePath path(request.metadata.endpoint, request.metadata.cluster, request.metadata.attribute_id); + + DeviceLayer::StackLock lock; + + // TODO: this assumes a singleton data model provider + app::DataModel::Provider * provider = app::InteractionModelEngine::GetInstance()->GetDataModelProvider(); + + app::DataModel::ServerClusterFinder serverClusterFinder(provider); + auto info = serverClusterFinder.Find(path); + if (!info.has_value()) + { + return ::pw::Status::NotFound(); + } + + Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kPase }; + app::DataModel::WriteAttributeRequest write_request; + write_request.path = path; + write_request.operationFlags.Set(app::DataModel::OperationFlags::kInternal); + write_request.subjectDescriptor = &subjectDescriptor; + + uint8_t raw_value_buffer[64]; // enough to hold general types + pw::Result tlvReader = ReadIntoTlv(request.data, chip::MutableByteSpan(raw_value_buffer)); + + if (!tlvReader.status().ok()) + { + return tlvReader.status(); + } + + app::AttributeValueDecoder decoder(tlvReader.value(), subjectDescriptor); + app::DataModel::ActionReturnStatus result = provider->WriteAttribute(write_request, decoder); + + if (!result.IsSuccess()) + { + app::DataModel::ActionReturnStatus::StringStorage storage; + ChipLogError(Support, "Failed to write data: %s", result.c_str(storage)); + return ::pw::Status::Internal(); + } + return pw::OkStatus(); } @@ -92,6 +224,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service app::ConcreteAttributePath path(request.endpoint, request.cluster, request.attribute_id); MutableByteSpan tlvBuffer(response.tlv_data.bytes); PW_TRY(ReadAttributeIntoTlvBuffer(path, tlvBuffer)); + // NOTE: TLV will be a full AttributeReportIB (so not purely the data) response.tlv_data.size = tlvBuffer.size(); response.has_tlv_data = true; @@ -137,6 +270,16 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service PW_TRY(TlvBufferGetData(tlvBuffer, TLV::kTLVType_FloatingPointNumber, response.data.data_single)); response.which_data = chip_rpc_AttributeData_data_single_tag; break; + case chip_rpc_AttributeType_ZCL_OCTET_STRING_ATTRIBUTE_TYPE: + case chip_rpc_AttributeType_ZCL_LONG_OCTET_STRING_ATTRIBUTE_TYPE: + PW_TRY(TlvBufferGetData(tlvBuffer, TLV::kTLVType_ByteString, response.data.data_bytes)); + response.which_data = chip_rpc_AttributeData_data_bytes_tag; + break; + case chip_rpc_AttributeType_ZCL_CHAR_STRING_ATTRIBUTE_TYPE: + case chip_rpc_AttributeType_ZCL_LONG_CHAR_STRING_ATTRIBUTE_TYPE: + PW_TRY(TlvBufferGetData(tlvBuffer, TLV::kTLVType_UTF8String, response.data.data_string)); + response.which_data = chip_rpc_AttributeData_data_string_tag; + break; case chip_rpc_AttributeType_ZCL_BITMAP8_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_BITMAP16_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_BITMAP32_ATTRIBUTE_TYPE: @@ -153,10 +296,6 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service case chip_rpc_AttributeType_ZCL_INT56S_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT64S_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_DOUBLE_ATTRIBUTE_TYPE: - case chip_rpc_AttributeType_ZCL_OCTET_STRING_ATTRIBUTE_TYPE: - case chip_rpc_AttributeType_ZCL_CHAR_STRING_ATTRIBUTE_TYPE: - case chip_rpc_AttributeType_ZCL_LONG_OCTET_STRING_ATTRIBUTE_TYPE: - case chip_rpc_AttributeType_ZCL_LONG_CHAR_STRING_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_STRUCT_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_TOD_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_DATE_ATTRIBUTE_TYPE: @@ -249,6 +388,24 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service return ::pw::OkStatus(); } + template + CHIP_ERROR TlvGet(TLV::TLVReader & reader, T & value) + { + return reader.Get(value); + } + + CHIP_ERROR TlvGet(TLV::TLVReader & reader, chip_rpc_AttributeData_data_bytes_t & value) + { + value.size = reader.GetLength(); + return reader.GetBytes(value.bytes, sizeof(value.bytes)); + } + + template + CHIP_ERROR TlvGet(TLV::TLVReader & reader, char (&value)[N]) + { + return reader.GetString(value, N); + } + template ::pw::Status TlvBufferGetData(ByteSpan tlvBuffer, TLV::TLVType expectedDataType, T & responseData) { @@ -275,7 +432,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service TLV::TLVReader dataReader; PW_TRY(ChipErrorToPwStatus(dataParser.GetData(&dataReader))); PW_TRY(CheckTlvTagAndType(&dataReader, TLV::ContextTag(0x2), expectedDataType)); - PW_TRY(ChipErrorToPwStatus(dataReader.Get(responseData))); + PW_TRY(ChipErrorToPwStatus(TlvGet(dataReader, responseData))); return ::pw::OkStatus(); } diff --git a/examples/platform/linux/system_rpc_server.cc b/examples/platform/linux/system_rpc_server.cc index b87a1c5d50bcc0..345845cfc3619c 100644 --- a/examples/platform/linux/system_rpc_server.cc +++ b/examples/platform/linux/system_rpc_server.cc @@ -42,6 +42,7 @@ uint16_t socket_port = 33000; stream::ServerSocket server_socket; stream::SocketStream socket_stream; +bool socket_stream_ready = false; hdlc::RpcChannelOutput hdlc_channel_output(socket_stream, hdlc::kDefaultRpcAddress, "HDLC channel"); Channel channels[] = { rpc::Channel::Create<1>(&hdlc_channel_output) }; @@ -57,10 +58,20 @@ void set_socket_port(uint16_t new_socket_port) void Init() { PW_LOG_INFO("Starting pw_rpc server on port %d", socket_port); - PW_CHECK_OK(server_socket.Listen(socket_port)); + Status status = server_socket.Listen(socket_port); + if (!status.ok()) + { + PW_LOG_ERROR("Listen failed. Initialization failed."); + return; + } auto accept_result = server_socket.Accept(); - PW_CHECK_OK(accept_result.status()); - socket_stream = *std::move(accept_result); + if (!accept_result.status().ok()) + { + PW_LOG_ERROR("Accept failed. Initialization failed."); + return; + } + socket_stream = *std::move(accept_result); + socket_stream_ready = true; } rpc::Server & Server() @@ -70,6 +81,11 @@ rpc::Server & Server() Status Start() { + if (!socket_stream_ready) + { + PW_LOG_ERROR("Socket failed to initialize. PWRPC start failed."); + return Status::FailedPrecondition(); + } // Declare a buffer for decoding incoming HDLC frames. std::array input_buffer; hdlc::Decoder decoder(input_buffer);