--- a/www-thermferm/devices.php Fri Aug 01 22:53:58 2014 +0200 +++ b/www-thermferm/devices.php Sat Aug 02 22:33:15 2014 +0200 @@ -30,7 +30,7 @@ return; } -socket_write($sock, "LIST BUS", 4096); +socket_write($sock, "DEVICE LIST", 4096); $answer = ""; while (1) { $line = socket_read($sock, 4096); @@ -39,44 +39,544 @@ $answer .= $line; } socket_close($sock); + +/* + * $arr contains the complete reply of the LIST BUS command + */ $arr = explode("\r\n", $answer); -$outstr = build_header("ThermFerm - Devices Setup"); +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['Name'] The rpofile name + */ +function device_add() { + + if ($_POST['key'] == 'Add') { + + $cmd = "DEVICE ADD ".$_POST['Type']; -$outstr .= ' <div id="errors">'.PHP_EOL; -$outstr .= ' </div> <!-- errors -->'.PHP_EOL; -$outstr .= ' <div id="etable">'.PHP_EOL; + $sock = open_socket(); + if ($sock != false) { + /* + * Send command and absorb the result. + */ + socket_write($sock, $cmd, 4096); + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + } + + 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['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') { + $sock = open_socket(); + if ($sock != false) { + socket_write($sock, "DEVICE DEL ".$_POST['UUID'], 4096); + /* Absorb response */ + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + } -$outstr .= ' <table class="setup">'.PHP_EOL; -$outstr .= ' <tr class="trhead">'.PHP_EOL; -$outstr .= ' <td class="setup">UUID</td>'.PHP_EOL; -$outstr .= ' <td class="setup">Address</td>'.PHP_EOL; -$outstr .= ' <td class="setup">Subdev</td>'.PHP_EOL; -$outstr .= ' <td class="setup">Refcnt</td>'.PHP_EOL; -$outstr .= ' <td class="setup">Comment</td>'.PHP_EOL; -$outstr .= ' </tr>'.PHP_EOL; + if ($_POST['key'] == 'Save') { + $sock = open_socket(); + if ($sock != false) { + /* + * Send command and absorb the result. + */ + socket_write($sock, "DEVICE PUT ".$_POST['UUID'], 4096); + usleep(20000); + socket_write($sock, "TYPE,".$_POST['Type'], 4096); + usleep(20000); + socket_write($sock, "DIRECTION,".$_POST['Direction'], 4096); + usleep(20000); + socket_write($sock, "VALUE,".$_POST['Value'], 4096); + usleep(20000); + socket_write($sock, "PRESENT,".$_POST['Present'], 4096); + usleep(20000); + socket_write($sock, "ADDRESS,".$_POST['Address'], 4096); + usleep(20000); + socket_write($sock, "SUBDEVICE,".$_POST['Subdevice'], 4096); + usleep(20000); + socket_write($sock, "GPIOPIN,".$_POST['Gpiopin'], 4096); + usleep(20000); + socket_write($sock, "DESCRIPTION,".$_POST['Description'], 4096); + usleep(20000); + socket_write($sock, "COMMENT,".$_POST['Comment'], 4096); + usleep(20000); + socket_write($sock, '.', 4096); + /* Absorb response */ + while (1) { + $line = socket_read($sock, 4096); + if ($line === '') + break; + } + socket_close($sock); + } + } + + 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['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['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 = ''; -if (startsWith($arr[0], "212")) { - $j = 1; + 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) { + + $sock = open_socket(); + if ($sock == false) { + load('devices.php'); + } + + socket_write($sock, "DEVICE GET ".$UUID, 4096); + $answer = ""; while (1) { - if (strcmp($arr[$j], ".") == 0) + $line = socket_read($sock, 4096); + if ($line === '') 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 .= ' </tr>'.PHP_EOL; - $j++; + $answer .= $line; + } + socket_close($sock); + $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")) + $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] == "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") + $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; + } + $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] == "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] == "ADDRESS") { + $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] == "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 .= 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'); } } -$outstr .= ' </table>'.PHP_EOL; -$outstr .= ' </div> <!-- etable -->'.PHP_EOL; -$outstr .= build_footer(); + + +/* + * @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: 30px;">Sub</td>'.PHP_EOL; + $outstr .= ' <td class="setup" style="width: 30px;">Ref</td>'.PHP_EOL; + $outstr .= ' <td class="setup" style="width: 300px;">Cmt</td>'.PHP_EOL; + $outstr .= ' <td class="setup" style="width: 35px;">Edit</td>'.PHP_EOL; + $outstr .= ' </tr>'.PHP_EOL; -echo $outstr; + 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; + if ($f[3] == 0) + $outstr .= ' <td class="setup"><a href="devices.php?action=edit&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="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 .= build_footer(); + + echo $outstr; +} +