| #!/usr/bin/env python3 |
| """Parses a ZAP input file and outputs directories to compile.""" |
| |
| import argparse |
| import json |
| import pathlib |
| import sys |
| import typing |
| |
| # List of directories in src/app/clusters to build for server clusters. |
| SERVER_CLUSTERS: typing.Dict[str, typing.List[str]] = { |
| 'ACCESS_CONTROL_CLUSTER': ['access-control-server'], |
| 'ACCOUNT_LOGIN_CLUSTER': ['account-login-server'], |
| 'ADMINISTRATOR_COMMISSIONING_CLUSTER': ['administrator-commissioning-server'], |
| 'ALARM_CLUSTER': [], |
| 'APPLICATION_BASIC_CLUSTER': ['application-basic-server'], |
| 'APPLICATION_LAUNCHER_CLUSTER': ['application-launcher-server'], |
| 'AUDIO_OUTPUT_CLUSTER': ['audio-output-server'], |
| 'BALLAST_CONFIGURATION_CLUSTER': [], |
| 'BARRIER_CONTROL_CLUSTER': ['barrier-control-server'], |
| 'BASIC_INFORMATION_CLUSTER': ['basic-information'], |
| 'BINARY_INPUT_BASIC_CLUSTER': [], |
| 'BINDING_CLUSTER': ['bindings'], |
| 'BOOLEAN_STATE_CLUSTER': [], |
| 'ACTIONS_CLUSTER': [], |
| 'BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER': ['bridged-device-basic-information-server'], |
| 'CHANNEL_CLUSTER': ['channel-server'], |
| 'CLIENT_MONITORING_CLUSTER': ['client-monitoring-server'], |
| 'COLOR_CONTROL_CLUSTER': ['color-control-server'], |
| 'COMMISSIONING_CLUSTER': [], |
| 'CONTENT_LAUNCHER_CLUSTER': ['content-launch-server'], |
| 'DESCRIPTOR_CLUSTER': ['descriptor'], |
| 'DEVICE_TEMP_CLUSTER': [], |
| 'DIAGNOSTIC_LOGS_CLUSTER': ['diagnostic-logs-server'], |
| 'DOOR_LOCK_CLUSTER': ['door-lock-server'], |
| 'ELECTRICAL_MEASUREMENT_CLUSTER': [], |
| 'ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER': ['ethernet-network-diagnostics-server'], |
| 'FAULT_INJECTION_CLUSTER': ['fault-injection-server'], |
| 'FAN_CONTROL_CLUSTER': ['fan-control-server'], |
| 'FIXED_LABEL_CLUSTER': ['fixed-label-server'], |
| 'FLOW_MEASUREMENT_CLUSTER': [], |
| 'GENERAL_COMMISSIONING_CLUSTER': ['general-commissioning-server'], |
| 'GENERAL_DIAGNOSTICS_CLUSTER': ['general-diagnostics-server'], |
| 'GROUP_KEY_MANAGEMENT_CLUSTER': ['group-key-mgmt-server'], |
| 'GROUPS_CLUSTER': ['groups-server'], |
| 'IAS_ZONE_CLUSTER': [], |
| 'IDENTIFY_CLUSTER': ['identify-server'], |
| 'ILLUMINANCE_MEASUREMENT_CLUSTER': [], |
| 'KEYPAD_INPUT_CLUSTER': ['keypad-input-server'], |
| 'LEVEL_CONTROL_CLUSTER': ['level-control'], |
| 'LOCALIZATION_CONFIGURATION_CLUSTER': ['localization-configuration-server'], |
| 'LOW_POWER_CLUSTER': ['low-power-server'], |
| 'MEDIA_INPUT_CLUSTER': ['media-input-server'], |
| 'MEDIA_PLAYBACK_CLUSTER': ['media-playback-server'], |
| 'MODE_SELECT_CLUSTER': ['mode-select-server'], |
| 'NETWORK_COMMISSIONING_CLUSTER': ['network-commissioning'], |
| 'OCCUPANCY_SENSING_CLUSTER': ['occupancy-sensor-server'], |
| 'ON_OFF_CLUSTER': ['on-off-server'], |
| 'ON_OFF_SWITCH_CONFIGURATION_CLUSTER': [], |
| 'OPERATIONAL_CREDENTIALS_CLUSTER': ['operational-credentials-server'], |
| 'OTA_BOOTLOAD_CLUSTER': [], |
| 'OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER': ['ota-provider'], |
| 'OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER': ['ota-requestor'], |
| 'POWER_SOURCE_CLUSTER': ['power-source-server'], |
| 'POWER_SOURCE_CONFIGURATION_CLUSTER': ['power-source-configuration-server'], |
| 'POLL_CONTROL_CLUSTER': [], |
| 'POWER_CONFIG_CLUSTER': [], |
| 'POWER_PROFILE_CLUSTER': [], |
| 'PRESSURE_MEASUREMENT_CLUSTER': [], |
| 'PROXY_CONFIGURATION_CLUSTER': [], |
| 'PROXY_DISCOVERY_CLUSTER': [], |
| 'PROXY_VALID_CLUSTER': [], |
| 'PUMP_CONFIGURATION_AND_CONTROL_CLUSTER': ['pump-configuration-and-control-server'], |
| 'PWM_CLUSTER': [], |
| 'RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER': [], |
| 'SCENES_CLUSTER': ['scenes'], |
| 'SOFTWARE_DIAGNOSTICS_CLUSTER': ['software-diagnostics-server'], |
| 'SWITCH_CLUSTER': ['switch-server'], |
| 'TARGET_NAVIGATOR_CLUSTER': ['target-navigator-server'], |
| 'TEMPERATURE_MEASUREMENT_CLUSTER': [], |
| 'UNIT_TESTING_CLUSTER': ['test-cluster-server'], |
| 'THERMOSTAT_CLUSTER': ['thermostat-server'], |
| 'THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER': ['thermostat-user-interface-configuration-server'], |
| 'THREAD_NETWORK_DIAGNOSTICS_CLUSTER': ['thread-network-diagnostics-server'], |
| 'TIME_CLUSTER': [], |
| 'TIME_FORMAT_LOCALIZATION_CLUSTER': ['time-format-localization-server'], |
| 'TIME_SYNCHRONIZATION_CLUSTER': [], |
| 'UNIT_LOCALIZATION_CLUSTER': [], |
| 'USER_LABEL_CLUSTER': ['user-label-server'], |
| 'WAKE_ON_LAN_CLUSTER': ['wake-on-lan-server'], |
| 'WIFI_NETWORK_DIAGNOSTICS_CLUSTER': ['wifi-network-diagnostics-server'], |
| 'WINDOW_COVERING_CLUSTER': ['window-covering-server'], |
| 'ZLL_COMMISSIONING_CLUSTER': [] |
| } |
| |
| # List of directories in src/app/clusters to build for client clusters. |
| CLIENT_CLUSTERS: typing.Dict[str, typing.List[str]] = { |
| 'ACCESS_CONTROL_CLUSTER': [], |
| 'ACCOUNT_LOGIN_CLUSTER': [], |
| 'ADMINISTRATOR_COMMISSIONING_CLUSTER': [], |
| 'ALARM_CLUSTER': [], |
| 'APPLICATION_BASIC_CLUSTER': [], |
| 'APPLICATION_LAUNCHER_CLUSTER': [], |
| 'AUDIO_OUTPUT_CLUSTER': [], |
| 'BALLAST_CONFIGURATION_CLUSTER': [], |
| 'BARRIER_CONTROL_CLUSTER': [], |
| 'BASIC_INFORMATION_CLUSTER': [], |
| 'BINARY_INPUT_BASIC_CLUSTER': [], |
| 'BINDING_CLUSTER': [], |
| 'BOOLEAN_STATE_CLUSTER': [], |
| 'ACTIONS_CLUSTER': [], |
| 'BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER': [], |
| 'CHANNEL_CLUSTER': [], |
| 'CLIENT_MONITORING_CLUSTER': [], |
| 'COLOR_CONTROL_CLUSTER': [], |
| 'COMMISSIONING_CLUSTER': [], |
| 'CONTENT_LAUNCHER_CLUSTER': [], |
| 'DESCRIPTOR_CLUSTER': [], |
| 'DEVICE_TEMP_CLUSTER': [], |
| 'DIAGNOSTIC_LOGS_CLUSTER': [], |
| 'DOOR_LOCK_CLUSTER': [], |
| 'ELECTRICAL_MEASUREMENT_CLUSTER': [], |
| 'ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER': [], |
| 'FAULT_INJECTION_CLUSTER': [], |
| 'FAN_CONTROL_CLUSTER': [], |
| 'FIXED_LABEL_CLUSTER': [], |
| 'FLOW_MEASUREMENT_CLUSTER': [], |
| 'GENERAL_COMMISSIONING_CLUSTER': [], |
| 'GENERAL_DIAGNOSTICS_CLUSTER': [], |
| 'GROUP_KEY_MANAGEMENT_CLUSTER': [], |
| 'GROUPS_CLUSTER': [], |
| 'IAS_ZONE_CLUSTER': [], |
| 'IDENTIFY_CLUSTER': [], |
| 'ILLUMINANCE_MEASUREMENT_CLUSTER': [], |
| 'KEYPAD_INPUT_CLUSTER': [], |
| 'LEVEL_CONTROL_CLUSTER': [], |
| 'LOCALIZATION_CONFIGURATION_CLUSTER': [], |
| 'LOW_POWER_CLUSTER': [], |
| 'MEDIA_INPUT_CLUSTER': [], |
| 'MEDIA_PLAYBACK_CLUSTER': [], |
| 'MODE_SELECT_CLUSTER': [], |
| 'NETWORK_COMMISSIONING_CLUSTER': [], |
| 'OCCUPANCY_SENSING_CLUSTER': ['occupancy-sensor-server'], |
| 'ON_OFF_CLUSTER': [], |
| 'ON_OFF_SWITCH_CONFIGURATION_CLUSTER': [], |
| 'OPERATIONAL_CREDENTIALS_CLUSTER': [], |
| 'OTA_BOOTLOAD_CLUSTER': [], |
| 'OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER': [], |
| 'OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER': [], |
| 'POLL_CONTROL_CLUSTER': [], |
| 'POWER_CONFIG_CLUSTER': [], |
| 'POWER_PROFILE_CLUSTER': [], |
| 'POWER_SOURCE_CLUSTER': [], |
| 'POWER_SOURCE_CONFIGURATION_CLUSTER': [], |
| 'PRESSURE_MEASUREMENT_CLUSTER': [], |
| 'PROXY_CONFIGURATION_CLUSTER': [], |
| 'PROXY_DISCOVERY_CLUSTER': [], |
| 'PROXY_VALID_CLUSTER': [], |
| 'PUMP_CONFIGURATION_AND_CONTROL_CLUSTER': ['pump-configuration-and-control-client'], |
| 'PWM_CLUSTER': [], |
| 'RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER': [], |
| 'SCENES_CLUSTER': [], |
| 'SOFTWARE_DIAGNOSTICS_CLUSTER': [], |
| 'SWITCH_CLUSTER': [], |
| 'TARGET_NAVIGATOR_CLUSTER': [], |
| 'TEMPERATURE_MEASUREMENT_CLUSTER': [], |
| 'UNIT_TESTING_CLUSTER': [], |
| 'THERMOSTAT_CLUSTER': ['thermostat-client'], |
| 'THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER': [], |
| 'THREAD_NETWORK_DIAGNOSTICS_CLUSTER': [], |
| 'TIME_CLUSTER': [], |
| 'TIME_FORMAT_LOCALIZATION_CLUSTER': [], |
| 'TIME_SYNCHRONIZATION_CLUSTER': [], |
| 'TRUSTED_ROOT_CERTIFICATES_CLUSTER': [], |
| 'UNIT_LOCALIZATION_CLUSTER': [], |
| 'USER_LABEL_CLUSTER': [], |
| 'WAKE_ON_LAN_CLUSTER': [], |
| 'WIFI_NETWORK_DIAGNOSTICS_CLUSTER': [], |
| 'WINDOW_COVERING_CLUSTER': [], |
| 'ZLL_COMMISSIONING_CLUSTER': [] |
| } |
| |
| |
| def get_cluster_sources(clusters: typing.Set[str], |
| source_map: typing.Dict[str, |
| typing.List[str]], side: str): |
| """Returns a list of cluster source directories for the given clusters. |
| |
| Returns: |
| The set of source directories to build. |
| """ |
| |
| cluster_sources: typing.Set[str] = set() |
| |
| for cluster in clusters: |
| if not cluster in source_map: |
| raise ValueError("Unhandled %s cluster: %s" |
| " (hint: add to src/app/zap_cluster_list.py)" % (side, cluster)) |
| |
| cluster_sources.update(source_map[cluster]) |
| |
| return cluster_sources |
| |
| |
| def dump_zapfile_clusters(zap_file_path: pathlib.Path): |
| """Prints all of the source directories to build for a given ZAP file. |
| |
| Arguments: |
| zap_file_path - Path to the ZAP input file. |
| """ |
| |
| client_clusters: typing.Set[str] = set() |
| server_clusters: typing.Set[str] = set() |
| |
| with open(zap_file_path, "r") as zap_file: |
| zap_json = json.loads(zap_file.read()) |
| |
| for endpoint_type in zap_json.get('endpointTypes'): |
| for cluster in endpoint_type.get('clusters'): |
| side: str = cluster.get('side') |
| if side == 'client': |
| clusters_set = client_clusters |
| elif side == 'server': |
| clusters_set = server_clusters |
| else: |
| raise ValueError("Invalid side for cluster: %s" % side) |
| |
| if cluster.get('enabled') == 1: |
| clusters_set.add(cluster.get('define')) |
| |
| cluster_sources: typing.Set[str] = set() |
| |
| cluster_sources.update( |
| get_cluster_sources(server_clusters, SERVER_CLUSTERS, 'server')) |
| |
| cluster_sources.update( |
| get_cluster_sources(client_clusters, CLIENT_CLUSTERS, 'client')) |
| |
| for cluster in sorted(cluster_sources): |
| print(cluster) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--zap_file', |
| help='Path to .zap file', |
| required=True, |
| type=pathlib.Path) |
| |
| args = parser.parse_args() |
| |
| dump_zapfile_clusters(args.zap_file) |
| |
| sys.exit(0) |
| |
| |
| if __name__ == '__main__': |
| main() |