blob: 93feaee78f6b99490b102c5a9033506e903f9c74 [file] [log] [blame]
# Copyright (c) 2021 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from enum import Enum, auto
from typing import Optional
from .builder import BuilderOutput
from .gn import GnBuilder
class QpgApp(Enum):
LIGHT = auto()
LOCK = auto()
SHELL = auto()
PERSISTENT_STORAGE = auto()
LIGHT_SWITCH = auto()
THERMOSTAT = auto()
def ExampleName(self):
if self == QpgApp.LIGHT:
return 'lighting-app'
elif self == QpgApp.LOCK:
return 'lock-app'
elif self == QpgApp.SHELL:
return 'shell'
elif self == QpgApp.PERSISTENT_STORAGE:
return 'persistent-storage'
elif self == QpgApp.LIGHT_SWITCH:
return 'light-switch-app'
elif self == QpgApp.THERMOSTAT:
return 'thermostat'
else:
raise Exception('Unknown app type: %r' % self)
def AppNamePrefix(self):
if self == QpgApp.LIGHT:
return 'chip-qpg6105-lighting-example'
elif self == QpgApp.LOCK:
return 'chip-qpg6105-lock-example'
elif self == QpgApp.SHELL:
return 'chip-qpg6105-shell-example'
elif self == QpgApp.PERSISTENT_STORAGE:
return 'chip-qpg6105-persistent_storage-example'
elif self == QpgApp.LIGHT_SWITCH:
return 'chip-qpg6105-light-switch-example'
elif self == QpgApp.THERMOSTAT:
return 'chip-qpg6105-thermostat-example'
else:
raise Exception('Unknown app type: %r' % self)
def FlashBundleName(self):
if self == QpgApp.LIGHT:
return 'lighting_app.out.flashbundle.txt'
elif self == QpgApp.LOCK:
return 'lock_app.out.flashbundle.txt'
elif self == QpgApp.SHELL:
return 'shell_app.out.flashbundle.txt'
elif self == QpgApp.PERSISTENT_STORAGE:
return 'persistent_storage_app.out.flashbundle.txt'
elif self == QpgApp.LIGHT_SWITCH:
return 'light_switch_app.out.flashbundle.txt'
elif self == QpgApp.THERMOSTAT:
return 'thermostat.out.flashbundle.txt'
else:
raise Exception('Unknown app type: %r' % self)
def BuildRoot(self, root):
return os.path.join(root, 'examples', self.ExampleName(), 'qpg')
class QpgBoard(Enum):
QPG6105 = 1
def GnArgName(self):
if self == QpgBoard.QPG6105:
return 'qpg6105'
else:
raise Exception('Unknown board #: %r' % self)
class QpgFlavour(Enum):
EXT_FLASH = 1
def GnFlavourName(self):
if self == QpgFlavour.EXT_FLASH:
return '_ext_flash'
else:
raise Exception('Unknown flavour #: %r' % self)
class QpgBuilder(GnBuilder):
def __init__(self,
root,
runner,
app: QpgApp = QpgApp.LIGHT,
board: QpgBoard = QpgBoard.QPG6105,
flavour: QpgFlavour = QpgFlavour.EXT_FLASH,
enable_rpcs: bool = False,
update_image: bool = False,
data_model_interface: Optional[str] = None,
):
super(QpgBuilder, self).__init__(
root=app.BuildRoot(root),
runner=runner)
self.app = app
self.board = board
self.flavour = flavour
self.enable_rpcs = enable_rpcs
self.update_image = update_image
self.data_model_interface = data_model_interface
def GnBuildArgs(self):
args = ['qpg_target_ic=\"%s\" qpg_flavour=\"%s\"' % (self.board.GnArgName(), self.flavour.GnFlavourName())]
if self.enable_rpcs:
args.append('import("//with_pw_rpc.gni")')
if self.update_image:
args.append('matter_ota_test_image=true')
if self.data_model_interface:
args.append(f'chip_use_data_model_interface="{self.data_model_interface}"')
return args
def build_outputs(self):
extensions = ["out", "out.hex"]
if self.options.enable_link_map_file:
extensions.append("out.map")
for ext in extensions:
name = f"{self.app.AppNamePrefix()}.{ext}"
yield BuilderOutput(os.path.join(self.output_dir, name), name)
# Figure out flash bundle files and build accordingly
with open(os.path.join(self.output_dir, self.app.FlashBundleName())) as f:
for name in filter(None, [x.strip() for x in f.readlines()]):
yield BuilderOutput(
os.path.join(self.output_dir, name),
os.path.join('flashbundle', name))