www-thermferm/devices.php

Sat, 25 Apr 2020 20:31:31 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 25 Apr 2020 20:31:31 +0200
changeset 605
e00f8ff4de9a
parent 397
00ca08f5a6f8
permissions
-rw-r--r--

Version 0.9.8. Added extra path to the fonts for Debian buster. Changed the PID to work on Proportional on Measurement. Added loops so that it looks like the PID is running at 100 mSec intervals.

<?php
/*****************************************************************************
 * Copyright (C) 2014-2015
 *   
 * Michiel Broek <mbroek at mbse dot eu>
 *
 * This file is part of ThermFerm
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * ThermFerm is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with ThermFerm; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

require_once('utilities.php');

/*
 * $arr contains the complete reply of the LIST BUS command
 */
$answer = send_cmd("DEVICE LIST");
$arr = explode("\r\n", $answer);


if (isset($_GET['action'])) {
    switch ($_GET['action']) {
	case 'edit':            device_edit();
				break;
	default:                break;
    }
} elseif (isset($_POST['action'])) {
    switch ($_POST['action']) {
	case 'testdata':        testdata();
				break;
	default:                break;
    }
} else {
    device_list();
}

exit;

/****************************************************************************
 *
 */


/*
 * Device add
 *
 * @param string $_POST['Type'] The device type
 * @param string $_POST['key'] The pressed key
 */
function device_add() {
    if ($_POST['key'] == 'Add')
	send_cmd("DEVICE ADD ".$_POST['Type']);                                    
    unset($_POST['UUID']);
    unset($_POST['Name']);
    unset($_POST['key']);
    unset($_POST['command']);
    load('devices.php');
}



/*
 * Device update
 *
 * @param string $_POST['UUID'] The device UUID
 * @param string $_POST['Type'] The device Type
 * @param string $_POST['Direction'] The device IO Direction
 * @param string $_POST['Value'] The device value
 * @param string $_POST['Offset'] The device offset
 * @param string $_POST['Present'] The device Present state
 * @param string $_POST['Address'] The device Address
 * @param string $_POST['Subdevice'] The device Subaddress
 * @param string $_POST['Gpiopin'] The device GPIO pin
 * @param string $_POST['Description'] The device Description
 * @param string $_POST['Comment'] The device Comment
 * @param string $_POST['key'] The button pressed.
 */
function device_update() {
    /*
     * Build the update command
     */
    if ($_POST['key'] == 'Delete') {
	send_cmd("DEVICE DEL ".$_POST['UUID']);
    }

    if ($_POST['key'] == 'Save') {
	$cmd = array("DEVICE PUT ".$_POST['UUID']);
	$cmd[] = "TYPE,".$_POST['Type'];
	$cmd[] = "DIRECTION,".$_POST['Direction'];
	$cmd[] = "VALUE,".$_POST['Value'];
	$cmd[] = "OFFSET,".$_POST['Offset'];
	$cmd[] = "PRESENT,".$_POST['Present'];
	$cmd[] = "ADDRESS,".$_POST['Address'];
	$cmd[] = "SUBDEVICE,".$_POST['Subdevice'];
	$cmd[] = "GPIOPIN,".$_POST['Gpiopin'];
	$cmd[] = "DESCRIPTION,".$_POST['Description'];
	$cmd[] = "COMMENT,".$_POST['Comment'];
	$cmd[] = ".";
	send_array($cmd);
    }

    unset($_POST['UUID']);
    unset($_POST['Type']);
    unset($_POST['Direction']);
    unset($_POST['Value']);
    unset($_POST['Present']);
    unset($_POST['Address']);
    unset($_POST['Subdevice']);
    unset($_POST['Gpiopin']);
    unset($_POST['Description']);
    unset($_POST['Comment']);
    unset($_POST['key']);
    unset($_POST['command']);
    load('devices.php');
}



/*
 * Test input of a modified or new device.
 *
 * @param string $_POST['UUID'] Unique record UUID
 * @param string $_POST['Type'] Device Type
 * @param string $_POST['Direction']
 * @param string $_POST['Value']
 * @param string $_POST['Offset']
 * @param string $_POST['Present']
 * @param string $_POST['Address']
 * @param string $_POST['Subdevice']
 * @param string $_POST['Gpiopin']
 * @param string $_POST['Description']
 * @param string $_POST['Comment']
 * @param string $_POST['key'] Key choice, Save or Cancel
 * @param string $_POST['command'] Command used, 'add' or 'update'
 *
 * Return: 0 = Ok
 *         1 = Missing data
 *         2 = Address field too short
 *         3 = Address/Subdevice already in use
 *         4 = Description field too short
 *         5 = Comment field too short
 *        99 = Cancel key
 */
function test_thedata() {

    global $arr;

    if (isset($_POST['UUID']) && isset($_POST['Type']) && isset($_POST['Direction']) && isset($_POST['Value']) && isset($_POST['Offset']) &&
	isset($_POST['Present']) && isset($_POST['Address']) && isset($_POST['Subdevice']) && isset($_POST['Gpiopin']) &&
	isset($_POST['Description']) && isset($_POST['Comment']) && isset($_POST['key']) && isset($_POST['command'])) {

	if ($_POST['key'] == 'Cancel')
	    return 99;

	if (strlen($_POST['Address']) < 2)
	    return 2;

	if (startsWith($arr[0], "212")) {
	    $j = 1;
	    while (1) {
		if (strcmp($arr[$j], ".") == 0)
		    break;
		$f = explode(",", $arr[$j]);
		if (strcmp($f[0], $_POST['UUID']) && ($f[1] == $_POST['Address']) && ($f[2] == $_POST['Subdevice'])) {
		    return 3;
		}
		$j++;
	    }
	}

	if (strlen($_POST['Description']) < 2)
	    return 4;

	if (strlen($_POST['Comment']) < 2)
	    return 5;

    } else {
	return 1;
    }

    return 0;
}



/*
 * Test result from edit screen and do next action
 */
function testdata() {

    $result = test_thedata();
    $error = '';

    switch ($result) {
	case 0: if ($_POST['command'] == 'add') {
		    device_add();
		    return;
		} else if ($_POST['command'] == 'update') {
		    device_update();
		    return;
		}
		break;
	case 1: $error = 'Missing data';
		break;
	case 2: $error = 'The Address is too short';
		break;
	case 3: $error = 'The Address + Subdevice is already in use, choose another one';
		break;
	case 4:	$error = 'The Description is too short';
		break;
	case 5:	$error = 'The Comment is too short';
		break;
	case 99:        
		load('devices.php');
		break;
    }

    if ($_POST['command'] == 'add') {
	$heading = 'ThermFerm - Add Device';
    } else {
	$heading = 'ThermFerm - Edit Device';
    }

    edit_screen($_POST['UUID'], $_POST['command'], $heading, $error);
}



/*
 * Unit edit screen. Used by unit_edit(), unit_add() and testdata()
 *
 * @param string $UUID The record UUID (fixed).
 * @param string $command 'add' or 'update'
 * @param string $heading Page heading title.
 * @Param string $error_message Blank or previous error.
 */
function edit_screen($UUID, $command, $heading, $error_message) {

    $answer = send_cmd("DEVICE GET ".$UUID);
    $reply = explode("\r\n", $answer);

    $outstr  = build_header($heading);
    $outstr .= '    <div id="errors">'.PHP_EOL;
    $outstr .= '     '.$error_message.PHP_EOL;
    $outstr .= '    </div> <!-- errors -->'.PHP_EOL;
    $outstr .= '    <div id="etable">'.PHP_EOL;
    $outstr .= '     <form method="POST" action="devices.php">'.PHP_EOL;
    $outstr .= '      <table class="editor">'.PHP_EOL;

    if (startsWith($reply[0], "213")) {
	$j = 1;
	while (1) {
	    if (strcmp($reply[$j], ".") == 0)
		break;
	    $f = explode(",", $reply[$j]);
	    if ($f[0] == "TYPE") {
		$type = $f[1];
		/*
		 * Only allow certain types to edit. Auto detected hardware cannot be changed.
		 */
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Device Type</td>'.PHP_EOL;
		if (($type == "W1") || ($type == "GPIO") || ($type == "SIM"))
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Type" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		else
		    $outstr .= '        <td class="editfield"><input type="text" name="Type" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "ADDRESS") {
		$address = $f[1];
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Address</td>'.PHP_EOL;
		if (($type == "W1") || ($type == "GPIO"))
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Address" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		else
		    $outstr .= '        <td class="editfield"><input type="text" name="Address" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "DIRECTION") {
		$direction = $f[1];
		/*
		 * Only devices that cannot auto detect can be changed.
		 */
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">IO Direction and mode</td>'.PHP_EOL;
		if ($type == "W1") {
		    if ((strncmp($address, "29", 2) == 0) || (strncmp($address, "3a", 2) == 0)) {
			$outstr .= '        <td class="editfield"><select name="Direction">'.PHP_EOL;
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
			$se = ($f[1] == "IN_BIN")?" selected":"";
			$outstr .= '         <option value="IN_BIN"'.$se.'>Binary input</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_BIN")?" selected":"";
			$outstr .= '         <option value="OUT_BIN"'.$se.'>Binary output</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_PWM")?" selected":"";
			$outstr .= '         <option value="OUT_PWM"'.$se.'>PWM output</option>'.PHP_EOL;
			$outstr .= '        </select></td>'.PHP_EOL;
		    } else {
			$outstr .= '        <td class="editfield"><input type="hidden" name="Direction" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		    }
		} else {
		    $outstr .= '        <td class="editfield"><select name="Direction">'.PHP_EOL;
		    if ($type == "GPIO") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
			$se = ($f[1] == "IN_BIN")?" selected":"";
			$outstr .= '         <option value="IN_BIN"'.$se.'>Binary input</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_BIN")?" selected":"";
			$outstr .= '         <option value="OUT_BIN"'.$se.'>Binary output</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_PWM")?" selected":"";
			$outstr .= '         <option value="OUT_PWM"'.$se.'>PWM output</option>'.PHP_EOL;
		    }
		    if ($type == "RC433") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_BIN")?" selected":"";
			$outstr .= '         <option value="OUT_BIN"'.$se.'>Binary output</option>'.PHP_EOL;
		    }
		    if ($type == "DHT") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
			$se = ($f[1] == "IN_ANALOG")?" selected":"";
			$outstr .= '         <option value="IN_ANALOG"'.$se.'>Analog input</option>'.PHP_EOL;
		    }
		    if ($type == "I2C") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
		    }
		    if ($type == "SPI") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
		    }
		    if ($type == "SIM") {
			$se = ($f[1] == "UNDEF")?" selected":"";
			$outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
			$se = ($f[1] == "IN_BIN")?" selected":"";
			$outstr .= '         <option value="IN_BIN"'.$se.'>Binary input</option>'.PHP_EOL;
			$se = ($f[1] == "IN_ANALOG")?" selected":"";
			$outstr .= '         <option value="IN_ANALOG"'.$se.'>Analog input</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_BIN")?" selected":"";
			$outstr .= '         <option value="OUT_BIN"'.$se.'>Binary output</option>'.PHP_EOL;
			$se = ($f[1] == "OUT_ANALOG")?" selected":"";
			$outstr .= '         <option value="OUT_ANALOG"'.$se.'>Analog output</option>'.PHP_EOL;
		    }
		    $outstr .= '        </select></td>'.PHP_EOL;
		}
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "VALUE") {
		/*
		 * Only output can be changed
		 */
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Value</td>'.PHP_EOL;
		if (($direction == "OUT_BIN") || ($direction == "OUT_ANALOG") || ($direction == "OUT_PWM"))
		    $outstr .= '        <td class="editfield"><input type="text" name="Value" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		else
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Value" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "OFFSET") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Offset</td>'.PHP_EOL;
		if ($direction == "IN_ANALOG")
		    $outstr .= '        <td class="editfield"><input type="text" name="Offset" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		else
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Offset" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "PRESENT") {
		/*
		 * Only devices that cannot auto detect can be changed.
		 */
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Device Present</td>'.PHP_EOL;
		if (($type == "W1") || ($type == "GPIO"))
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Present" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		else {
		    $outstr .= '        <td class="editfield"><select name="Present">'.PHP_EOL;
		    $se = ($f[1] == "UNDEF")?" selected":"";
		    $outstr .= '         <option value="UNDEF"'.$se.'>Undefined</option>'.PHP_EOL;
		    $se = ($f[1] == "NO")?" selected":"";
		    $outstr .= '         <option value="NO"'.$se.'>Not present</option>'.PHP_EOL;
		    $se = ($f[1] == "YES")?" selected":"";
		    $outstr .= '         <option value="YES"'.$se.'>Present and Ok</option>'.PHP_EOL;
		    $se = ($f[1] == "ERROR")?" selected":"";
		    $outstr .= '         <option value="ERROR"'.$se.'>Present and Error</option>'.PHP_EOL;
		    $outstr .= '        </select></td>'.PHP_EOL;
		}
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "SUBDEVICE") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Subdevice</td>'.PHP_EOL;
		if (($type == "W1") || ($type == "GPIO"))
		    $outstr .= '        <td class="editfield"><input type="hidden" name="Subdevice" value="'.$f[1].'">'.$f[1].'</td>'.PHP_EOL;
		else
		    $outstr .= '        <td class="editfield"><input type="text" name="Subdevice" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "GPIOPIN") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">GPIO pin</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="Gpiopin" size="5" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;                  
	    }
	    if ($f[0] == "DESCRIPTION") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Description</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="Description" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	    }
	    if ($f[0] == "COMMENT") {
		$outstr .= '       <tr class="editor">'.PHP_EOL;
		$outstr .= '        <td class="editname">Comment</td>'.PHP_EOL;
		$outstr .= '        <td class="editfield"><input type="text" name="Comment" size="50" value="'.$f[1].'"></td>'.PHP_EOL;
		$outstr .= '       </tr>'.PHP_EOL;
	     }
	    $j++;
	}
    }

    $outstr .= '       <tr class="editor">'.PHP_EOL;
    $outstr .= '        <td class="editname"><input type="submit" value="Save" name="key"></td>'.PHP_EOL;
    $outstr .= '        <td class="editfield"><input type="submit" value="Cancel" name="key">';
    $outstr .= '<input type="submit" value="Delete" name="key" style="margin-left: 100px;">';
    $outstr .= '<input type="hidden" value="testdata" name="action">';
    $outstr .= '<input type="hidden" value="'.$command.'" name="command">';
    $outstr .= '<input type="hidden" value="'.$UUID.'" name="UUID"></td>'.PHP_EOL;
    $outstr .= '       </tr>'.PHP_EOL;
    $outstr .= '      </table>'.PHP_EOL;
    $outstr .= '     </form>'.PHP_EOL;
    $outstr .= '    </div> <!-- etable -->'.PHP_EOL;
    $outstr .= '    <script type="text/javascript">'.PHP_EOL;
    $outstr .= '     $(document).ready(function () {'.PHP_EOL;
    $outstr .= '      $("#maintenance").jqxButton({ width: 150, height: 25, theme: \'ui-redmond\' });'.PHP_EOL;
    $outstr .= '     });'.PHP_EOL;
    $outstr .= '    </script>'.PHP_EOL;
    $outstr .= build_footer();
    echo $outstr;
}



/*
 * Edit a Device. Fetches the record data and shows the edit screen.
 *
 * @param string $_GET['action'] Must be 'edit'.
 * @param string $_GET['UUID'] The UUID of the Unit.
 */
function device_edit() {
    if ($_GET['action'] == 'edit') {
	edit_screen($_GET['UUID'], 'update', 'ThermFerm - Edit Device', '');
	return;
    } else {
	load('devices.php');
    }
}



/*
 * @link edit device
 * @link add device
 */
function device_list() {
    global $arr;

    $outstr  = build_header("ThermFerm - Devices Setup");
    $outstr .= '    <div id="errors">'.PHP_EOL;
    $outstr .= '    </div> <!-- errors -->'.PHP_EOL;
    $outstr .= '    <div id="etable">'.PHP_EOL;
    $outstr .= '     <table class="setup">'.PHP_EOL;
    $outstr .= '      <tr class="trhead">'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 300px;">UUID</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 120px;">Address</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 25px;">Sub</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 25px;">Ref</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 200px;">Cmt</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 70px;">Dir</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 70px;">Val</td>'.PHP_EOL;
    $outstr .= '       <td class="setup" style="width: 35px;">Edit</td>'.PHP_EOL;
    $outstr .= '      </tr>'.PHP_EOL;

    if (startsWith($arr[0], "212")) {
    	$j = 1;
    	while (1) {
	    if (strcmp($arr[$j], ".") == 0)
	    	break;
	    $f = explode(",", $arr[$j]);
	    $outstr .= '      <tr class="setup">'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[0].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[1].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[2].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[3].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[4].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[5].'</td>'.PHP_EOL;
	    $outstr .= '       <td class="setup">'.$f[6].'</td>'.PHP_EOL;
	    if ($f[3] == 0)
		$outstr .= '       <td class="setup"><a href="devices.php?action=edit&amp;UUID='.$f[0].'">Edit</a></td>'.PHP_EOL;
	    else
		$outstr .= '       <td class="setup">Busy</td>'.PHP_EOL;
	    $outstr .= '      </tr>'.PHP_EOL;
	    $j++;
    	}
    }

    $outstr .= '     </table>'.PHP_EOL;
    $outstr .= '    </div> <!-- etable -->'.PHP_EOL;

    $outstr .= '    <div id="atable">'.PHP_EOL;
    $outstr .= '     <form method="POST" action="devices.php">'.PHP_EOL;
    $outstr .= '      <table class="editor">'.PHP_EOL;
    $outstr .= '      <tr class="trhead"><td colspan="3">Add new Device</td></tr>'.PHP_EOL;
    $outstr .= '       <tr class="editor">'.PHP_EOL;
    $outstr .= '        <td class="editname">Select Device type</td>'.PHP_EOL;
    $outstr .= '        <td class="editfield">'.PHP_EOL;
    $outstr .= '         <select name="Type">'.PHP_EOL;
    $outstr .= '          <option value="NA">Not Available</option>'.PHP_EOL;
    $outstr .= '          <option value="RC433">433 Mhz Radio Controller</option>'.PHP_EOL;
    $outstr .= '          <option value="DHT">DHTnn type sensor</option>'.PHP_EOL;
    $outstr .= '          <option value="I2C">I2C bus device</option>'.PHP_EOL;
    $outstr .= '          <option value="SPI">SPI bus device</option>'.PHP_EOL;
    $outstr .= '         </select>'.PHP_EOL;
    $outstr .= '        </td>'.PHP_EOL;
    $outstr .= '        <td class="editsub"><input type="submit" value="Add" name="key"></td>'.PHP_EOL;
    $outstr .= '<input type="hidden" value="testdata" name="action">';
    $outstr .= '<input type="hidden" value="add" name="command">';
    $outstr .= '<input type="hidden" value="00000000-0000-0000-0000-000000000000" name="UUID">';
    $outstr .= '<input type="hidden" value="UNDEF" name="Direction">';
    $outstr .= '<input type="hidden" value="0" name="Value">';
    $outstr .= '<input type="hidden" value="0" name="Offset">';
    $outstr .= '<input type="hidden" value="UNDEF" name="Present">';
    $outstr .= '<input type="hidden" value="address unknown" name="Address">';
    $outstr .= '<input type="hidden" value="0" name="Subdevice">';
    $outstr .= '<input type="hidden" value="-1" name="Gpiopin">';
    $outstr .= '<input type="hidden" value="Describe me" name="Description">';
    $outstr .= '<input type="hidden" value="Comment me" name="Comment">';
    $outstr .= '       </tr>'.PHP_EOL;
    $outstr .= '      </table>'.PHP_EOL;
    $outstr .= '     </form>'.PHP_EOL;
    $outstr .= '    </div> <!-- atable -->'.PHP_EOL;

    $outstr .= '    <script type="text/javascript">'.PHP_EOL;
    $outstr .= '     $(document).ready(function () {'.PHP_EOL;
    $outstr .= '      $("#maintenance").jqxButton({ width: 150, height: 25, theme: \'ui-redmond\' });'.PHP_EOL;
    $outstr .= '     });'.PHP_EOL;
    $outstr .= '    </script>'.PHP_EOL;
    $outstr .= build_footer();

    echo $outstr;
}

mercurial