if {[have_board imx6q_sabrelite] ||
    [have_board imx7d_sabre] ||
    [have_board zynq_usrp_e31x] ||
    ([get_cmd_switch --autopilot] && [have_board linux]) ||
    ([get_cmd_switch --autopilot] && [have_include "power_on/qemu"])} {
	puts "Run script does not support this platform."
	exit 0
}

create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
                  [depot_user]/pkg/[drivers_interactive_pkg] \
                  [depot_user]/src/rom_filter \
                  [depot_user]/src/report_rom \
                  [depot_user]/src/global_keys_handler \
                  [depot_user]/src/nitpicker \
                  [depot_user]/src/nit_focus \
                  [depot_user]/src/demo \
                  [depot_user]/src/init

build { app/status_bar test/nitpicker }

install_config {
<config>
	<parent-provides>
		<service name="ROM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
	</parent-provides>
	<default-route>
		<any-service> <parent/> <any-child/> </any-service>
	</default-route>
	<default caps="100"/>

	<start name="timer">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Timer"/></provides>
	</start>

	<start name="drivers" caps="1500" managing_system="yes">
		<resource name="RAM" quantum="64M"/>
		<binary name="init"/>
		<route>
			<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
			<service name="Timer">   <child name="timer"/> </service>
			<service name="Capture"> <child name="nitpicker"/> </service>
			<service name="Event">   <child name="nitpicker"/> </service>
			<any-service> <parent/> </any-service>
		</route>
	</start>

	<start name="report_rom">
		<resource name="RAM" quantum="1M"/>
		<provides> <service name="Report"/> <service name="ROM"/> </provides>
		<config verbose="no">
			<policy label="status_bar -> focus"          report="nitpicker -> focus"/>
			<policy label="nitpicker_config -> xray"     report="global_keys_handler -> xray"/>
			<policy label="global_keys_handler -> hover" report="nitpicker -> hover"/>
			<policy label="nit_focus -> clicked"         report="nitpicker -> clicked"/>
			<policy label="nitpicker -> focus"           report="nit_focus -> focus"/>
		</config>
	</start>

	<start name="nitpicker_config">
		<binary name="rom_filter"/>
		<resource name="RAM" quantum="1096K"/>
		<provides> <service name="ROM"/> </provides>
		<config>
			<input name="xray_enabled" rom="xray" node="xray">
				<attribute name="enabled" /> </input>

			<output node="config">
				<attribute name="focus" value="rom"/>
				<inline>
					<report focus="yes" xray="yes" hover="yes" keystate="yes"
					        clicked="yes"/>
					<capture/> <event/>
					<domain name="pointer" layer="1" origin="pointer"
					        content="client" label="no"/>
					<domain name="panel" layer="2"
					        content="client" label="no" hover="always"/>
				</inline>
				<if>
					<has_value input="xray_enabled" value="no" />
					<then>
						<inline>
							<domain name="launchpad" layer="3"
							        content="client" label="no" hover="always" focus="click"
							        ypos="18" height="-18" />
							<domain name="" layer="3"
							        content="client" label="no" hover="always" focus="click"
							        ypos="18" height="-18" />
						</inline>
					</then>
					<else>
						<inline>
							<domain name="launchpad" layer="3" color="#dd0000"
							        content="tinted" label="yes" hover="focused" focus="click"
							        ypos="18" height="-18" />
							<domain name="" layer="3" color="#55dd34"
							        content="tinted" label="yes" hover="focused" focus="click"
							        ypos="18" height="-18" />
						</inline>
					</else>
				</if>
				<inline>
					<policy label_prefix="pointer"            domain="pointer"/>
					<policy label_prefix="status_bar"         domain="panel"/>
					<policy label_prefix="scout -> launchpad" domain="launchpad"/>
					<default-policy                           domain=""/>

					<global-key name="KEY_SCROLLLOCK" label="global_keys_handler -> input" />
					<global-key name="KEY_F1"         label="global_keys_handler -> input" />
					<global-key name="KEY_F2"         label="global_keys_handler -> input" />
				</inline>
			</output>
		</config>
		<route>
			<service name="ROM" label="xray"> <child name="report_rom"/> </service>
			<any-service> <parent/> </any-service>
		</route>
	</start>

	<start name="global_keys_handler">
		<resource name="RAM" quantum="1096K"/>
		<config>
			<bool name="xray" initial="no"/>

			<press   name="KEY_SCROLLLOCK" bool="xray" change="toggle"/>
			<press   name="KEY_F1"         bool="xray" change="on"/>
			<release name="KEY_F1"         bool="xray" change="off"/>
			<press   name="KEY_F2"         bool="xray" change="toggle"/>

			<report name="xray" delay_ms="125">
				<hovered domain="panel"/>
				<bool name="xray"/>
			</report>
		</config>
		<route>
			<service name="Report"> <child name="report_rom"/> </service>
			<service name="ROM" label="hover"> <child name="report_rom"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</route>
	</start>

	<start name="nitpicker" caps="120">
		<resource name="RAM" quantum="1216K"/>
		<provides>
			<service name="Gui"/> <service name="Capture"/> <service name="Event"/>
		</provides>
		<route>
			<service name="ROM" label="config">
				<child name="nitpicker_config"/> </service>
			<service name="ROM" label="focus">
				<child name="report_rom"/> </service>
			<service name="Report">
				<child name="report_rom"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</route>
	</start>

	<start name="pointer">
		<resource name="RAM" quantum="1096K"/>
		<config/>
	</start>

	<start name="nit_focus">
		<resource name="RAM" quantum="1M"/>
		<config> <default-policy focus="yes"/> </config>
		<route>
			<service name="ROM" label="clicked"> <child name="report_rom"/> </service>
			<service name="Report"> <child name="report_rom"/> </service>
			<any-service> <parent/> </any-service>
		</route>
	</start>

	<start name="status_bar">
		<resource name="RAM" quantum="1096K"/>
		<route>
			<service name="ROM" label="focus"> <child name="report_rom"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</route>
	</start>

	<start name="scout" caps="10000">
		<resource name="RAM" quantum="80M" />
	</start>
</config>}

#
# Create launchpad configuration
#
set launchpad_config_fd [open "bin/launchpad.config" w]
puts $launchpad_config_fd {<config>
	<launcher name="testnit"   ram_quota="768K" caps="50"/>
	<launcher name="scout"     ram_quota="41M"  caps="200"/>
	<launcher name="launchpad" ram_quota="6M"   caps="1000">
		<configfile name="launchpad.config" />
	</launcher>
	<launcher name="nitlog"    ram_quota="1500K" caps="100"/>
	<launcher name="liquid_fb" ram_quota="9M" caps="100">
		<config resize_handle="on" />
	</launcher>
	<launcher name="nitpicker" ram_quota="1M" caps="100">
		<config request_input="yes" request_framebuffer="yes">
			<domain name="" layer="3" conten="client" label="no" focus="click"/>
			<default-policy domain="" />
		</config>
	</launcher>
</config>}
close $launchpad_config_fd

build_boot_image [list {*}[build_artifacts] launchpad.config]

if {[get_cmd_switch --autopilot]} {
	run_genode_until {\[init -> scout\] png is.*\n} 40

	grep_output {(requests resources: )|(Error)}

	# remove Error messages which are not fatal, mostly
	unify_output {(?n)^.*platform] Error:.*ACPI table information is wrong.*$} ""
	unify_output {(?n)^.*platform] Error:  adjust size from.*$} ""
	unify_output {(?n)^.*ps2] Error: no data available.*$} ""
	unify_output {(?n)^.*ps2] Error: failed to read from port.*$} ""
	unify_output {(?n)^.*] Error: RAM preservation exceeds available memory.*$} ""

	compare_output_to {}

} else {
	run_genode_until forever
}
