#!/bin/bash
set -ueo pipefail

if [[ -n "${DEBUG:-}" ]]; then
    set -x
fi

if [[ ! -d /sys/kernel/config/usb_gadget ]]; then
    echo "ERROR: ConfigFS not found. is libcomposite loaded?"
    exit 1
fi

cd /sys/kernel/config/usb_gadget
[[ -d usb-gadget ]] || mkdir usb-gadget
cd usb-gadget

echo "0x1d6b" > idVendor
echo "0x0104" > idProduct

[[ -d strings/0x409 ]] || mkdir strings/0x409
(
    cd strings/0x409
    echo "Pocketblue" > manufacturer
    echo "Pocketblue" > product
)

[[ -d functions/acm.usb0 ]] || mkdir functions/acm.usb0
[[ -d functions/ncm.usb0 ]] || mkdir functions/ncm.usb0

[[ -d configs/c.1 ]] || mkdir configs/c.1
[[ -d configs/c.1/strings/0x409 ]] || mkdir configs/c.1/strings/0x409

echo "USB network+serial" > configs/c.1/strings/0x409/configuration

[[ -e configs/c.1/acm.usb0 ]] || ln -s "$(pwd)/functions/acm.usb0" configs/c.1/
[[ -e configs/c.1/ncm.usb0 ]] || ln -s "$(pwd)/functions/ncm.usb0" configs/c.1/

UDC="$(ls -1 /sys/class/udc | head -n1)"

while [[ -z "$UDC" ]]; do
    sleep 1
    UDC="$(ls -1 /sys/class/udc | head -n1)"
done

echo binding UDC $UDC
[[ -n "$(cat UDC)" ]] || echo "$UDC" > UDC

# TODO: do this in a udev rule?
ip link set usb0 up
ip addr replace 172.16.42.1/24 dev usb0
