#
# Build
#

if {[have_spec odroid_xu]} {
	puts "Run script does not support this platform."
	exit 0
}

set build_components {
	core init
	drivers/timer
	server/nitpicker app/pointer app/status_bar app/xray_trigger
	server/liquid_framebuffer app/launchpad app/scout
	test/nitpicker server/nitlog
	drivers/framebuffer drivers/input
	server/report_rom server/rom_filter
}

proc gpio_drv { } { if {[have_spec rpi] && [have_spec hw]}  { return hw_gpio_drv }
                    if {[have_spec rpi] && [have_spec foc]} { return foc_gpio_drv }
                    return gpio_drv }

source ${genode_dir}/repos/base/run/platform_drv.inc

lappend_if [need_usb_hid]   build_components drivers/usb
lappend_if [have_spec gpio] build_components drivers/gpio

append_platform_drv_build_components

build $build_components

create_boot_directory

#
# Generate config
#

append 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"/>}

append_if [have_spec sdl] config {
	<start name="fb_sdl">
		<resource name="RAM" quantum="4M"/>
		<provides>
			<service name="Input"/>
			<service name="Framebuffer"/>
		</provides>
	</start>}

append_platform_drv_config

append_if [have_spec framebuffer] config {
	<start name="fb_drv">
		<resource name="RAM" quantum="4M"/>
		<provides><service name="Framebuffer"/></provides>
	</start>}

append_if [have_spec gpio] config "
	<start name=\"[gpio_drv]\">
		<resource name=\"RAM\" quantum=\"4M\"/>
		<provides><service name=\"Gpio\"/></provides>
		<config/>
	</start>"

append_if [have_spec imx53] config {
	<start name="input_drv">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Input"/></provides>
		<config/>
	</start> }

append_if [have_spec ps2] config {
	<start name="ps2_drv">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Input"/></provides>
	</start>}

append_if [need_usb_hid] config {
	<start name="usb_drv">
		<resource name="RAM" quantum="12M"/>
		<provides><service name="Input"/></provides>
		<config ehci="yes" uhci="yes" xhci="no"> <hid/> </config>
	</start> }

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

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

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

			<output node="config">
				<inline>
					<report focus="yes" xray="yes" hover="yes" />
					<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="xray_trigger -> input" />
					<global-key name="KEY_F1"         label="xray_trigger -> input" />
					<global-key name="KEY_F2"         label="xray_trigger -> input" />
				</inline>
			</output>
		</config>
		<route>
			<service name="ROM" label="xray"> <child name="report_rom"/> </service>
			<any-service> <parent/> </any-service>
		</route>
	</start>

	<start name="xray_trigger">
		<resource name="RAM" quantum="1M"/>
		<config>
			<press   name="KEY_F1" xray="on"/>
			<release name="KEY_F1" xray="off"/>
			<press   name="KEY_F2" xray="toggle"/>
			<hover domain="panel"/>
		</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">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Nitpicker"/></provides>
		<configfile name="nitpicker.config"/>
		<route>
			<service name="ROM" label="nitpicker.config">
				<child name="nitpicker_config"/> </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="1M"/>
	</start>

	<start name="status_bar">
		<resource name="RAM" quantum="1M"/>
		<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="64M" />
	</start>
</config>}

install_config $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="1M" caps="50"/>
	<launcher name="liquid_fb" ram_quota="7M" caps="70">
		<config resize_handle="on" />
	</launcher>
	<launcher name="nitpicker" ram_quota="1M" caps="70">
		<config>
			<domain name="" layer="3" conten="client" label="no" focus="click"/>
			<default-policy domain="" />
		</config>
	</launcher>
</config>}
close $launchpad_config_fd


#
# Boot modules
#

# generic modules
set boot_modules {
	core ld.lib.so init
	timer
	nitpicker pointer status_bar report_rom rom_filter xray_trigger
	liquid_fb launchpad scout testnit nitlog
	launchpad.config
}

# platform-specific modules
lappend_if [have_spec linux]       boot_modules fb_sdl
lappend_if [have_spec ps2]         boot_modules ps2_drv
lappend_if [have_spec framebuffer] boot_modules fb_drv
lappend_if [need_usb_hid]          boot_modules usb_drv
lappend_if [have_spec gpio]        boot_modules [gpio_drv]
lappend_if [have_spec imx53]       boot_modules input_drv

append_platform_drv_boot_modules

build_boot_image $boot_modules


run_genode_until forever
