<?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
<?php
	// (C) Copyright 2001
	// Murray Jensen <Murray.Jensen@csiro.au>
	// CSIRO Manufacturing Science and Technology, Preston Lab

	// contains mysql user id and password - keep secret
	require("config.php");

	if (isset($_REQUEST['logout'])) {
		Header("status: 401 Unauthorized");
		Header("HTTP/1.0 401 Unauthorized");
		Header("WWW-authenticate: basic realm=\"$bddb_label\"");

		echo "<html><head><title>" .
			"Access to '$bddb_label' Denied" .
			"</title></head>\n";
		echo "<body bgcolor=#ffffff><br></br><br></br><center><h1>" .
			"You must be an Authorised User " .
			"to access the '$bddb_label'" .
			"</h1>\n</center></body></html>\n";
		exit;
	}

	// contents of the various enumerated types - if first item is
	// empty ('') then the enum is allowed to be null (ie "not null"
	// is not set on the column)

	// all column names in the database table
	$columns = array(
		'serno','ethaddr','date','batch',
		'type','rev','location','comments',
		'sdram0','sdram1','sdram2','sdram3',
		'flash0','flash1','flash2','flash3',
		'zbt0','zbt1','zbt2','zbt3','zbt4','zbt5','zbt6','zbt7',
		'zbt8','zbt9','zbta','zbtb','zbtc','zbtd','zbte','zbtf',
		'xlxtyp0','xlxtyp1','xlxtyp2','xlxtyp3',
		'xlxspd0','xlxspd1','xlxspd2','xlxspd3',
		'xlxtmp0','xlxtmp1','xlxtmp2','xlxtmp3',
		'xlxgrd0','xlxgrd1','xlxgrd2','xlxgrd3',
		'cputyp','cpuspd','cpmspd','busspd',
		'hstype','hschin','hschout'
	);

	// board type
	$type_vals = array('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY');

	// Xilinx fpga types
	$xlxtyp_vals = array('','XCV300E','XCV400E','XCV600E','XC2V2000','XC2V3000','XC2V4000','XC2V6000','XC2VP2','XC2VP4','XC2VP7','XC2VP20','XC2VP30','XC2VP50','XC4VFX20','XC4VFX40','XC4VFX60','XC4VFX100','XC4VFX140');

	// Xilinx fpga speeds
	$xlxspd_vals = array('','6','7','8','4','5','9','10','11','12');

	// Xilinx fpga temperatures (commercial or industrial)
	$xlxtmp_vals = array('','COM','IND');

	// Xilinx fpga grades (normal or engineering sample)
	$xlxgrd_vals = array('','NORMAL','ENGSAMP');

	// CPU types
	$cputyp_vals = array('','MPC8260(HIP3)','MPC8260A(HIP4)','MPC8280(HIP7)','MPC8560');

	// CPU/BUS/CPM clock speeds
	$clk_vals = array('','33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ','233MHZ','266MHZ','300MHZ','333MHZ','366MHZ','400MHZ','433MHZ','466MHZ','500MHZ','533MHZ','566MHZ','600MHZ','633MHZ','666MHZ','700MHZ','733MHZ','766MHZ','800MHZ','833MHZ','866MHZ','900MHZ','933MHZ','966MHZ','1000MHZ','1033MHZ','1066MHZ','1100MHZ','1133MHZ','1166MHZ','1200MHZ','1233MHZ','1266MHZ','1300MHZ','1333MHZ');

	// sdram sizes (nbits array is for eeprom config file)
	$sdram_vals = array('','32M','64M','128M','256M','512M','1G','2G','4G');
	$sdram_nbits = array(0,25,26,27,28,29,30,31,32);

	// flash sizes (nbits array is for eeprom config file)
	$flash_vals = array('','4M','8M','16M','32M','64M','128M','256M','512M','1G');
	$flash_nbits = array(0,22,23,24,25,26,27,28,29,30);

	// zbt ram sizes (nbits array is for write into eeprom config file)
	$zbt_vals = array('','512K','1M','2M','4M','8M','16M');
	$zbt_nbits = array(0,19,20,21,22,23,24);

	// high-speed serial attributes
	$hstype_vals = array('','AMCC-S2064A','Xilinx-Rockets');
	$hschin_vals = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
	$hschout_vals = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');

	// value filters - used when outputting html
	function rev_filter($num) {
		if ($num == 0)
			return "001";
		else
			return sprintf("%03d", $num);
	}

	function text_filter($str) {
		return urldecode($str);
	}

	mt_srand(time() | getmypid());

	// set up MySQL connection
	mysql_connect("", $mysql_user, $mysql_pw) || die("cannot connect");
	mysql_select_db($mysql_db) || die("cannot select db");

	// page header
	function pg_head($title)
	{
		echo "<html>\n<head>\n";
		echo "<link rel=stylesheet href=\"bddb.css\" type=\"text/css\" title=\"style sheet\"></link>\n";
		echo "<title>$title</title>\n";
		echo "</head>\n";
		echo "<body>\n";
		echo "<center><h1>$title</h1></center>\n";
		echo "<hr></hr>\n";
	}

	// page footer
	function pg_foot()
	{
		echo "<hr></hr>\n";
		echo "<table width=\"100%\"><tr><td align=left>\n<address>" .
			"If you have any problems, email " .
			"<a href=\"mailto:Murray.Jensen@csiro.au\">" .
			"Murray Jensen" .
			"</a></address>\n" .
			"</td><td align=right>\n" .
			"<a href=\"index.php?logout=true\">logout</a>\n" .
			"</td></tr></table>\n";
		echo "<p><small><i>Made with " .
		    "<a href=\"http://kyber.dk/phpMyBuilder/\">" .
		    "Kyber phpMyBuilder</a></i></small></p>\n";
		echo "</body>\n";
		echo "</html>\n";
	}

	// some support functions

	if (!function_exists('array_search')) {

		function array_search($needle, $haystack, $strict = false) {

			if (is_array($haystack) && count($haystack)) {

				$ntype = gettype($needle);

				foreach ($haystack as $key => $value) {

					if ($value == $needle && (!$strict ||
					    gettype($value) == $ntype))
						return $key;
				}
			}

			return false;
		}
	}

	if (!function_exists('in_array')) {

		function in_array($needle, $haystack, $strict = false) {

			if (is_array($haystack) && count($haystack)) {

				$ntype = gettype($needle);

				foreach ($haystack as $key => $value) {

					if ($value == $needle && (!$strict ||
					    gettype($value) == $ntype))
						return true;
				}
			}

			return false;
		}
	}

	function key_in_array($key, $array) {
		return in_array($key, array_keys($array), true);
	}

	function enum_to_index($name, $vals) {
		$index = array_search($GLOBALS[$name], $vals);
		if ($vals[0] != '')
		        $index++;
		return $index;
	}

	// fetch a value from an array - return empty string is not present
	function get_key_value($key, $array) {
		if (key_in_array($key, $array))
			return $array[$key];
		else
			return '';
	}

	function fprintf() {
		$n = func_num_args();
		if ($n < 2)
			return FALSE;
		$a = func_get_args();
		$fp = array_shift($a);
		$x = "\$s = sprintf";
		$sep = '(';
		foreach ($a as $z) {
			$x .= "$sep'$z'";
			$sep = ',';
		}
		$x .= ');';
		eval($x);
		$l = strlen($s);
		$r = fwrite($fp, $s, $l);
		if ($r != $l)
			return FALSE;
		else
			return TRUE;
	}

	// functions to display (print) a database table and its columns

	function begin_table($ncols) {
		global $table_ncols;
		$table_ncols = $ncols;
		echo "<table align=center width=\"100%\""
			. " border=1 cellpadding=4 cols=$table_ncols>\n";
	}

	function begin_field($name, $span = 0) {
		global $table_ncols;
		echo "<tr valign=top>\n";
		echo "\t<th align=center>$name</th>\n";
		if ($span <= 0)
			$span = $table_ncols - 1;
		if ($span > 1)
			echo "\t<td colspan=$span>\n";
		else
			echo "\t<td>\n";
	}

	function cont_field($span = 1) {
		echo "\t</td>\n";
		if ($span > 1)
			echo "\t<td colspan=$span>\n";
		else
			echo "\t<td>\n";
	}

	function end_field() {
		echo "\t</td>\n";
		echo "</tr>\n";
	}

	function end_table() {
		echo "</table>\n";
	}

	function print_field($name, $array, $size = 0, $filt='') {

		begin_field($name);

		if (key_in_array($name, $array))
			$value = $array[$name];
		else
			$value = '';

		if ($filt != '')
			$value = $filt($value);

		echo "\t\t<input name=$name value=\"$value\"";
		if ($size > 0)
			echo " size=$size maxlength=$size";
		echo "></input>\n";

		end_field();
	}

	function print_field_multiline($name, $array, $cols, $rows, $filt='') {

		begin_field($name);

		if (key_in_array($name, $array))
			$value = $array[$name];
		else
			$value = '';

		if ($filt != '')
			$value = $filt($value);

		echo "\t\t<textarea name=$name " .
			"cols=$cols rows=$rows wrap=off>\n";
		echo "$value";
		echo "</textarea>\n";

		end_field();
	}

	// print a mysql ENUM as an html RADIO INPUT
	function print_enum($name, $array, $vals, $def = -1) {

		begin_field($name);

		if (key_in_array($name, $array))
			$chk = array_search($array[$name], $vals, FALSE);
		else
			$chk = $def;

		$nval = count($vals);

		for ($i = 0; $i < $nval; $i++) {

			$val = $vals[$i];
			if ($val == '')
				$pval = "none";
			else
				$pval = "$val";

			printf("\t\t<input type=radio name=$name"
				. " value=\"$val\"%s>$pval</input>\n",
				$i == $chk ? " checked" : "");
		}

		end_field();
	}

	// print a mysql ENUM as an html SELECT INPUT
	function print_enum_select($name, $array, $vals, $def = -1) {

		begin_field($name);

		echo "\t\t<select name=$name>\n";

		if (key_in_array($name, $array))
			$chk = array_search($array[$name], $vals, FALSE);
		else
			$chk = $def;

		$nval = count($vals);

		for ($i = 0; $i < $nval; $i++) {

			$val = $vals[$i];
			if ($val == '')
				$pval = "none";
			else
				$pval = "$val";

			printf("\t\t\t<option " .
				"value=\"%s\"%s>%s</option>\n",
				$val, $i == $chk ? " selected" : "", $pval);
		}

		echo "\t\t</select>\n";

		end_field();
	}

	// print a group of mysql ENUMs (e.g. name0,name1,...) as an html SELECT
	function print_enum_multi($base, $array, $vals, $cnt, $defs, $grp = 0) {

		global $table_ncols;

		if ($grp <= 0)
			$grp = $cnt;
		$ncell = $cnt / $grp;
		$span = ($table_ncols - 1) / $ncell;

		begin_field($base, $span);

		$nval = count($vals);

		for ($i = 0; $i < $cnt; $i++) {

			if ($i > 0 && ($i % $grp) == 0)
				cont_field($span);

			$name = sprintf("%s%x", $base, $i);

			echo "\t\t<select name=$name>\n";

			if (key_in_array($name, $array))
				$ai = array_search($array[$name], $vals, FALSE);
			else {
				if (key_in_array($i, $defs))
					$ai = $defs[$i];
				else
					$ai = 0;
			}

			for ($j = 0; $j < $nval; $j++) {

				$val = $vals[$j];
				if ($val == '')
					$pval = "&nbsp;";
				else
					$pval = "$val";

				printf("\t\t\t<option " .
					"value=\"%s\"%s>%s</option>\n",
					$val,
					$j == $ai ? " selected" : "",
					$pval);
			}

			echo "\t\t</select>\n";
		}

		end_field();
	}

	// functions to handle the form input

	// fetch all the parts of an "enum_multi" into a string suitable
	// for a MySQL query
	function gather_enum_multi_query($base, $cnt) {

		$retval = '';

		for ($i = 0; $i < $cnt; $i++) {

			$name = sprintf("%s%x", $base, $i);

			if (isset($_REQUEST[$name])) {
				$retval .= sprintf(", %s='%s'",
					$name, $_REQUEST[$name]);
			}
		}

		return $retval;
	}

	// fetch all the parts of an "enum_multi" into a string suitable
	// for a display e.g. in an html table cell
	function gather_enum_multi_print($base, $cnt, $array) {

		$retval = '';

		for ($i = 0; $i < $cnt; $i++) {

			$name = sprintf("%s%x", $base, $i);

			if ($array[$name] != '') {
				if ($retval != '')
					$retval .= ',';
				$retval .= $array[$name];
			}
		}

		return $retval;
	}

	// fetch all the parts of an "enum_multi" into a string suitable
	// for writing to the eeprom data file
	function gather_enum_multi_write($base, $cnt, $vals, $xfrm = array()) {

		$retval = '';

		for ($i = 0; $i < $cnt; $i++) {

			$name = sprintf("%s%x", $base, $i);

			if ($GLOBALS[$name] != '') {
				if ($retval != '')
					$retval .= ',';
				$index = enum_to_index($name, $vals);
				if ($xfrm != array())
					$retval .= $xfrm[$index];
				else
					$retval .= $index;
			}
		}

		return $retval;
	}

	// count how many parts of an "enum_multi" are actually set
	function count_enum_multi($base, $cnt) {

		$retval = 0;

		for ($i = 0; $i < $cnt; $i++) {

			$name = sprintf("%s%x", $base, $i);

			if (isset($_REQUEST[$name]))
				$retval++;
		}

		return $retval;
	}

	// ethernet address functions

	// generate a (possibly not unique) random vendor ethernet address
	// (setting bit 6 in the ethernet address - motorola wise i.e. bit 0
	// is the most significant bit - means it is not an assigned ethernet
	// address - it is a "locally administered" address). Also, make sure
	// it is NOT a multicast ethernet address (by setting bit 7 to 0).
	// e.g. the first byte of all ethernet addresses generated here will
	// have 2 in the bottom two bits (incidentally, these are the first
	// two bits transmitted on the wire, since the octets in ethernet
	// addresses are transmitted LSB first).

	function gen_eth_addr($serno) {

		$ethaddr_hgh = (mt_rand(0, 65535) & 0xfeff) | 0x0200;
		$ethaddr_mid = mt_rand(0, 65535);
		$ethaddr_low = mt_rand(0, 65535);

		return sprintf("%02lx:%02lx:%02lx:%02lx:%02lx:%02lx",
			$ethaddr_hgh >> 8, $ethaddr_hgh & 0xff,
			$ethaddr_mid >> 8, $ethaddr_mid & 0xff,
			$ethaddr_low >> 8, $ethaddr_low & 0xff);
	}

	// check that an ethernet address is valid
	function eth_addr_is_valid($ethaddr) {

		$ethbytes = split(':', $ethaddr);

		if (count($ethbytes) != 6)
			return FALSE;

		for ($i = 0; $i < 6; $i++) {
			$ethbyte = $ethbytes[$i];
			if (!ereg('^[0-9a-f][0-9a-f]$', $ethbyte))
				return FALSE;
		}

		return TRUE;
	}

	// write a simple eeprom configuration file
	function write_eeprom_cfg_file() {

		global $sernos, $nsernos, $bddb_cfgdir, $numerrs, $cfgerrs;
		global $date, $batch, $type_vals, $rev;
		global $sdram_vals, $sdram_nbits;
		global $flash_vals, $flash_nbits;
		global $zbt_vals, $zbt_nbits;
		global $xlxtyp_vals, $xlxspd_vals, $xlxtmp_vals, $xlxgrd_vals;
		global $cputyp, $cputyp_vals, $clk_vals;
		global $hstype, $hstype_vals, $hschin, $hschout;

		$numerrs = 0;
		$cfgerrs = array();

		for ($i = 0; $i < $nsernos; $i++) {

			$serno = sprintf("%010d", $sernos[$i]);

			$wfp = @fopen($bddb_cfgdir . "/$serno.cfg", "w");
			if (!$wfp) {
				$cfgerrs[$i] = 'file create fail';
				$numerrs++;
				continue;
			}
			set_file_buffer($wfp, 0);

			if (!fprintf($wfp, "serno=%d\n", $sernos[$i])) {
				$cfgerrs[$i] = 'cfg wr fail (serno)';
				fclose($wfp);
				$numerrs++;
				continue;
			}

			if (!fprintf($wfp, "date=%s\n", $date)) {
				$cfgerrs[$i] = 'cfg wr fail (date)';
				fclose($wfp);
				$numerrs++;
				continue;
			}

			if ($batch != '') {
				if (!fprintf($wfp, "batch=%s\n", $batch)) {
					$cfgerrs[$i] = 'cfg wr fail (batch)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$typei = enum_to_index("type", $type_vals);
			if (!fprintf($wfp, "type=%d\n", $typei)) {
				$cfgerrs[$i] = 'cfg wr fail (type)';
				fclose($wfp);
				$numerrs++;
				continue;
			}

			if (!fprintf($wfp, "rev=%d\n", $rev)) {
				$cfgerrs[$i] = 'cfg wr fail (rev)';
				fclose($wfp);
				$numerrs++;
				continue;
			}

			$s = gather_enum_multi_write("sdram", 4,
				$sdram_vals, $sdram_nbits);
			if ($s != '') {
				$b = fprintf($wfp, "sdram=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (sdram)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("flash", 4,
				$flash_vals, $flash_nbits);
			if ($s != '') {
				$b = fprintf($wfp, "flash=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (flash)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("zbt", 16,
				$zbt_vals, $zbt_nbits);
			if ($s != '') {
				$b = fprintf($wfp, "zbt=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (zbt)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("xlxtyp", 4, $xlxtyp_vals);
			if ($s != '') {
				$b = fprintf($wfp, "xlxtyp=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (xlxtyp)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("xlxspd", 4, $xlxspd_vals);
			if ($s != '') {
				$b = fprintf($wfp, "xlxspd=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (xlxspd)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("xlxtmp", 4, $xlxtmp_vals);
			if ($s != '') {
				$b = fprintf($wfp, "xlxtmp=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (xlxtmp)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			$s = gather_enum_multi_write("xlxgrd", 4, $xlxgrd_vals);
			if ($s != '') {
				$b = fprintf($wfp, "xlxgrd=%s\n", $s);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (xlxgrd)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			if ($cputyp != '') {
				$cputypi = enum_to_index("cputyp",$cputyp_vals);
				$cpuspdi = enum_to_index("cpuspd", $clk_vals);
				$busspdi = enum_to_index("busspd", $clk_vals);
				$cpmspdi = enum_to_index("cpmspd", $clk_vals);
				$b = fprintf($wfp, "cputyp=%d\ncpuspd=%d\n" .
					"busspd=%d\ncpmspd=%d\n",
					$cputypi, $cpuspdi, $busspdi, $cpmspdi);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (cputyp)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			if ($hstype != '') {
				$hstypei = enum_to_index("hstype",$hstype_vals);
				$b = fprintf($wfp, "hstype=%d\n" .
					"hschin=%s\nhschout=%s\n",
					$hstypei, $hschin, $hschout);
				if (!$b) {
					$cfgerrs[$i] = 'cfg wr fail (hstype)';
					fclose($wfp);
					$numerrs++;
					continue;
				}
			}

			if (!fclose($wfp)) {
				$cfgerrs[$i] = 'file cls fail';
				$numerrs++;
			}
		}

		return $numerrs;
	}
?>
