#!/bin/bash

TYPE=unconfigured

# Load settings

if [ -f /etc/default/clusterctrl ];then
 source /etc/default/clusterctrl
fi

NUMBER='^[0-9]+$'

# Only setup USB Gadget if TYPE=node/usbboot and the ID number is within bounds (1-252)

if [ "$1" = "start" ] && [[ $ID =~ $NUMBER  ]] && [ $ID -gt 0 ] && [ $ID -lt 253 ] && { [ "$TYPE" = "node" ] || [ "$TYPE" = "usbboot" ]; };then

 if [ "$TYPE" = "node" ];then
  PRODUCT="ClusterCTRL"		# SD boot
 else
  PRODUCT="ClusterCTRL USB"	# usbboot
 fi

 # Convert decimal pX to HEX for MAC address
 printf -v ID_HEX '%02x' $ID

 # Setup composite USB device
 modprobe libcomposite

 cd /sys/kernel/config/usb_gadget/
 mkdir ClusterCTRL && cd ClusterCTRL

 echo "0x3171" > idVendor  	# 8086 Consultancy
 echo "0x0020" > idProduct 	# ClusterCTRL Composite Gadget
 echo "0x0100" > bcdDevice 	# v1.0.0
 echo "0x0200" > bcdUSB    	# USB 2.0

 echo "0xEF" > bDeviceClass
 echo "0x02" > bDeviceSubClass
 echo "0x01" > bDeviceProtocol

 mkdir -p strings/0x409 			# SUBLANG_ENGLISH_US
 echo "$ID" > strings/0x409/serialnumber 	# pX
 echo "8086 Consultancy" > strings/0x409/manufacturer
 echo $PRODUCT > strings/0x409/product		# Boot method

 mkdir -p functions/acm.usb0    # serial (console)
# mkdir -p functions/acm.usb1	# serial (admin)
 mkdir -p functions/rndis.usb0  # network

 echo "00:22:82:ff:fe:$ID_HEX" > functions/rndis.usb0/host_addr
 echo "00:22:82:ff:ff:$ID_HEX" > functions/rndis.usb0/dev_addr

 mkdir -p configs/c.1
 echo "250" > configs/c.1/MaxPower
 ln -s functions/rndis.usb0 configs/c.1/
 ln -s functions/acm.usb0   configs/c.1/
# ln -s functions/acm.usb1   configs/c.1/

 # OS descriptors
 echo "1"	> os_desc/use
 echo "0xcd"	> os_desc/b_vendor_code
 echo "MSFT100"	> os_desc/qw_sign

 echo "RNDIS"	> functions/rndis.usb0/os_desc/interface.rndis/compatible_id
 echo "5162001"	> functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id

 ln -s configs/c.1 os_desc

 udevadm settle -t 5 || :
 ls /sys/class/udc/ > UDC

elif [ "$1" = "stop" ];then
 echo '' > $DEVDIR/UDC
 # TODO - tidyup
fi

