1447 lines
77 KiB
PHP
1447 lines
77 KiB
PHP
<?php
|
||
/*
|
||
************************************************************************
|
||
**
|
||
** Copyright (c) 2009..2012 by
|
||
** Core|Vision B.V.
|
||
** Hambakenwetering 1
|
||
** 5231 DD 's-Hertogenbosch
|
||
** The Netherlands
|
||
**
|
||
** All Rights Reserved
|
||
**
|
||
************************************************************************
|
||
*/
|
||
/*
|
||
************************************************************************
|
||
**
|
||
** Project name: Dual Inventive: MTinfo Support Scripts
|
||
** Filename: debugreport.php
|
||
** Author: Jack Weeland
|
||
** Date: September 21, 2012
|
||
** September 25, 2012 (full decoding of the fields)
|
||
** File version: $Revision: 1.8 $
|
||
** $Date: 2013/10/30 17:24:48 $
|
||
**
|
||
************************************************************************
|
||
*/
|
||
/*
|
||
************************************************************************
|
||
**
|
||
** Display debug data for a device.
|
||
**
|
||
************************************************************************
|
||
*/
|
||
|
||
define('DEBUGREPORT_VER_STR', '1.1.0');
|
||
define('DEBUGREPORT_DATECODE', '20121024');
|
||
|
||
require_once("../include/i18n.php");
|
||
require_once("../include/cp3000-tcpclient.php");
|
||
require_once("support.inc.php");
|
||
|
||
set_time_limit(0);
|
||
|
||
if( isset($argc) && $argc > 1 ) {
|
||
// called from the command-line
|
||
parse_str($argv[1], $_GET);
|
||
}
|
||
else {
|
||
// live data: do not cache
|
||
header('Pragma: no-cache');
|
||
header('Expires: ' . date("r", strtotime("+1 year")));
|
||
|
||
//
|
||
// Check inputs for SQL statement injection and such.
|
||
// Items not tested below are not vulnerable for SQL statement injection, e.g.
|
||
// a time is always converted using 'strtotime()' and other items are only
|
||
// used in the PHP but never in the composition of an SQL statement
|
||
// [security audit 2013-10-23]
|
||
//
|
||
if(
|
||
(isset($_GET['zkl']) && !is_numeric($_GET['zkl'])) ||
|
||
(isset($_GET['db']) && dirname($_GET['db']) != ".")
|
||
) {
|
||
// don't do anything fancy or interruptive as fiddling with the GET parameters
|
||
// is intended by the author
|
||
die("Parameter error");
|
||
}
|
||
|
||
?>
|
||
<html>
|
||
<title>Debug Report <?php
|
||
echo DEBUGREPORT_VER_STR . "-" . DEBUGREPORT_DATECODE;
|
||
if( isset($_GET['zkl']) ) {
|
||
echo " - ";
|
||
echo $_GET['zkl'];
|
||
}
|
||
?></title>
|
||
</html>
|
||
<body>
|
||
<style type="text/css">
|
||
|
||
TABLE.DB_TABLE {
|
||
border: 1px solid black;
|
||
table-layout: auto;
|
||
border-collapse: collapse;
|
||
empty-cells: show;
|
||
}
|
||
|
||
TABLE.DB_TABLE TD {
|
||
border: 1px solid rgb(192,192,192);
|
||
padding: 2px;
|
||
vertical-align: top;
|
||
}
|
||
|
||
TH.DB_TABLE {
|
||
border: 1px solid black;
|
||
border-bottom: 2px solid black;
|
||
}
|
||
|
||
TABLE.SELECT {
|
||
border: none;
|
||
table-layout: auto;
|
||
border-collapse: collapse;
|
||
empty-cells: show;
|
||
}
|
||
|
||
TABLE.SELECT TD {
|
||
border: none;
|
||
padding: 0px 4px;
|
||
vertical-align: top;
|
||
}
|
||
|
||
</style>
|
||
<?php
|
||
}
|
||
|
||
// read the database information
|
||
if( isset($_GET['db']) ) $db_info = read_database(DBCONFIG_DIR, $_GET['db']);
|
||
else $db_info = array();
|
||
if( !isset($db_info['host']) ) $db_info['host'] = "localhost";
|
||
if( !isset($db_info['user']) ) $db_info['user'] = "root";
|
||
if( !isset($db_info['passwd']) ) $db_info['passwd'] = "";
|
||
if( !isset($db_info['db']) ) $db_info['db'] = "di_zkl";
|
||
|
||
// open the database
|
||
$db_data_handle = mysql_connect($db_info['host'], $db_info['user'], $db_info['passwd']);
|
||
if( $db_data_handle === FALSE ) {
|
||
echo mysql_error();
|
||
exit(1);
|
||
}
|
||
mysql_select_db($db_info['database'], $db_data_handle);
|
||
if( $db_info['main'] ) {
|
||
$db_main_info = read_database(DBCONFIG_DIR, $db_info['main']);
|
||
$db_main_handle = mysql_connect($db_main_info['host'], $db_main_info['user'], $db_main_info['passwd'], true);
|
||
if( $db_main_handle === FALSE ) {
|
||
echo mysql_error();
|
||
exit(1);
|
||
}
|
||
mysql_select_db($db_main_info['database'], $db_main_handle);
|
||
}
|
||
else {
|
||
$db_main_handle = $db_data_handle;
|
||
$db_main_info = $db_info;
|
||
}
|
||
|
||
// get information about the device
|
||
$query = "SELECT zkl.*,IFNULL(zkl.gebruiker,zkl.eigenaar) AS gebruiker,server.adres AS tcp_server,server.adres_ssl AS stcp_server ";
|
||
$query .= "FROM zkl,server ";
|
||
$query .= "WHERE ";
|
||
$query .= " zkl.id=" . $_GET['zkl'] . " AND ";
|
||
$query .= " server.id=zkl.tcp_server";
|
||
$result = mysql_run($query, $db_main_handle);
|
||
$zkl_info = mysql_fetch_assoc($result);
|
||
if( $zkl_info['gebruiker'] ) {
|
||
$query = "SELECT tz,i18n FROM klant WHERE id=" . $zkl_info['gebruiker'];
|
||
$result = mysql_run($query, $db_main_handle);
|
||
$tz_info = mysql_fetch_assoc($result);
|
||
}
|
||
else {
|
||
$tz_info = array( 'tz' => date("e"), 'i18n' => "nl" );
|
||
}
|
||
if( $_GET['tz'] ) $tz_info['tz'] = $_GET['tz'];
|
||
if( $_GET['lc'] ) $tz_info['i18n'] = $_GET['lc'];
|
||
$zkl_info['tz'] = $tz_info['tz'];
|
||
$zkl_info['i18n'] = $tz_info['i18n'];
|
||
$zkl_info['firmware']['mcu'] = zkl_get_fw_version($zkl_info['mcu_versie']);
|
||
$zkl_info['firmware']['wcpu'] = zkl_get_fw_version($zkl_info['wcpu_versie']);
|
||
|
||
if( $_GET['use_tz'] ) {
|
||
putenv("TZ=" . $zkl_info['tz']);
|
||
}
|
||
else putenv("TZ=" . date("e"));
|
||
|
||
if( isset($_GET['lc']) ) {
|
||
i18n_settext_language($_GET['lc']);
|
||
setlocale(LC_ALL, $_GET['lc']);
|
||
}
|
||
else {
|
||
i18n_settext_language('nl');
|
||
setlocale(LC_ALL, "nl");
|
||
}
|
||
|
||
// show device name
|
||
echo "<h1>" . $zkl_info['idcode'] . " – Debugrapportage</h1>\n";
|
||
echo "<h2>Device informatie</h2>\n";
|
||
echo "<table>";
|
||
echo "<tr valign=\"top\"><td>Database:</td><td>" . $zkl_info['id'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>Serienr:</td><td>" . $zkl_info['serienr'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>ID-code:</td><td>" . $zkl_info['idcode'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>IMEI:</td><td>" . $zkl_info['imei'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>IMSI:</td><td>" . $zkl_info['imsi'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>SIM-card:</td><td>" . $zkl_info['sim'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>Telefoonnr:</td><td>" . $zkl_info['telefoonnr'] . "</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>Firmware:</td><td>" .
|
||
"MCU: " . $zkl_info['mcu_versie'] . "<br>" .
|
||
"WCPU: " . $zkl_info['wcpu_versie'] . "<br>" .
|
||
($zkl_info['sw3000_dversie'] ? ("Switch3000, drive: " . $zkl_info['sw3000_dversie'] . "<br>") : "") .
|
||
($zkl_info['sw3000_mversie'] ? ("Switch3000, measure: " . $zkl_info['sw3000_mversie'] . "<br>") : "") .
|
||
"</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>Hardware:</td><td>" .
|
||
"ZKL: pcb-versie " . $zkl_info['pcb_versie'] . ", revisie " . $zkl_info['pcb_revisie'] . ", productienr " . $zkl_info['fabrieksnr'] . "<br>" .
|
||
"Wavecom: firmware " . $zkl_info['wavecom_versie'] . ", hardware-revisie " . $zkl_info['wavecom_revisie'] . ", serienr " . $zkl_info['wavecom_serienr'] . "<br>" .
|
||
"µALFAT: " . $zkl_info['ualfat_versie'] .
|
||
"</td></tr>\n";
|
||
echo "<tr valign=\"top\"><td>Timezone:</td><td>" . $zkl_info['tz'] . "</td></tr>\n";
|
||
echo "</table>\n";
|
||
|
||
echo "<h2>Debug-informatie</h2>\n";
|
||
echo "<p>Beweeg de muis over de velden en tussenkopjes om de ruwe data te zien.</p>\n";
|
||
|
||
// login with the TCP-server
|
||
if( FALSE ) {//isset($zkl_info['stcp_server']) ) {
|
||
$server = $zkl_info['stcp_server'];
|
||
zkl_set_private_key(
|
||
"cert/private/mtinfo.key",
|
||
"cert/private/passphrase"
|
||
);
|
||
zkl_set_public_key(
|
||
"cert/public/mtinfo.crt",
|
||
"cert/public/di-ca.crt"
|
||
);
|
||
}
|
||
else $server = $zkl_info['tcp_server'];
|
||
|
||
if(
|
||
($tcp_channel = zkl_tcplogin($_GET['zkl'], $server)) === FALSE
|
||
) {
|
||
global $error_str;
|
||
if( !$_GET['zkl'] || !$server )
|
||
$error_str = "Invalid parameters";
|
||
else
|
||
$error_str = sprintf("%02X: %s", $zkl_status, $zkl_error);
|
||
error_log("debugreport: log-in with " . $server . " failed: " . $error_str);
|
||
echo "<p style=\"color: red;\">Error: " . $error_str . "</p>\n";
|
||
goto debugreport_exit;
|
||
}
|
||
|
||
$keys = array(
|
||
array(
|
||
'key' => "DEBUG[MCU]",
|
||
'title' => "MCU interne status",
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "actions",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "ACTION_START_MEASUREMENT" ), // measurement cycle requested
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "ACTION_START_SINEGEN" ), // start sine wave generator
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "ACTION_AD_START" ), // start the sine wave A/D conversion
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "ACTION_AD_COMPLETE" ), // measurement done; determine result
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "ACTION_AD_DEINIT" ), // measurement done; release A/D
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "ACTION_START_SWEEP" ), // start frequency sweep
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "ACTION_TEMPERATURE" ), // do a temperature reading
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "ACTION_TEMPERATURE_DONE" ), // temperature measurement done
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "ACTION_BATTERY" ), // battery measurement requested
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "ACTION_BATTERY_DONE" ), // battery measurement done
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "ACTION_BATTERY_CHANGED" ), // battery state changed
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "ACTION_SWITCH" ), // Swith 3000 and Power Management 3000 actions (ACTIONDEP_xxx)
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "ACTION_START_SIGNALING1" ), // start sine wave generator to signal a short circuit on the rail
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "ACTION_START_SIGNALING2" ), // start sine wave generator to signal a short circuit on the rail
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "ACTION_STOP_SIGNALING" ), // stop the sine wave generator
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "ACTION_GPSPOWER" ), // enable GPS for trace&trace
|
||
array( 'mask' => 0xFFFF, 'val' => 0x0000, 'text' => "ACTION_NONE" )
|
||
)
|
||
),
|
||
1 => array(
|
||
'key' => "log actions",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "LOGACTION_COMMIT_LOG" ), // flush the log file to media
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "LOGACTION_FLUSH_ISR_LOG" ), // write ISR log data
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "LOGACTION_LOG_RESET_TIMEOUT" ), // restart log flush time-out
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "LOGACTION_LOG_SET_TIME" ), // new clock data; set the time for the log file
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "LOGACTION_RESET" ), // reset and restart the <20>ALFAT after a fatal error
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "LOGACTION_INIT_DONE" ), // initialization complete
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "LOGACTION_SYSINFO_CHANGED" ), // new version (product id) received
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "LOGACTION_GPS_RECEIVED" ), // new GPS co-ordinates received
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "LOGACTION_GPS_TIMEOUT" ), // no new GPS co-ordinates received witin time-out
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "LOGACTION_GPS_ENABLE" ), // enable GPS receiver
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "LOGACTION_TIMESTAMP" ), // force a timestamp to be logged
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "LOGACTION_ERROR" ) // internal state: in error routine
|
||
)
|
||
),
|
||
2 => array(
|
||
'key' => "dependent actions",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "ACTIONDEP_BATTERY1_ALARM" ), // set battery alarm level
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "ACTIONDEP_BATTERY2_ALARM" ), // set battery alarm level
|
||
// if ACTION_SWITCH is set
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "ACTIONDEP_SWITCH_ON" ), // turn the Switch 3000 on
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "ACTIONDEP_SWITCH_OFF" ), // turn the Switch 3000 off
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "ACTIONDEP_SWITCH_GET_STATUS" ), // read status info from the Switch 3000
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "ACTIONDEP_SWITCH_READY" ), // communication with Switch 3000 ready
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "ACTIONDEP_MEASUREMENT_ON" ), // turn the measurements on
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "ACTIONDEP_MEASUREMENT_OFF" ), // turn the measurements off
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "ACTIONDEP_SWITCH_DONE" ), // communication with Switch 3000 done (okay to power off)
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "ACTIONDEP_SW1W_EVENT" ) // software 1-Wire bus event
|
||
)
|
||
),
|
||
3 => array(
|
||
'key' => "gsm actions",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "GSMACTION_ACTIVATE_GSM" ), // activate GSM subsystem
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "GSMACTION_POWEROFF" ), // GSM has powered off
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "GSMACTION_WATCHDOG_RESET" ), // restart GSM watchdog
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "GSMACTION_AFT_DONE" ), // AFT tests done (test mode only)
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "GSMACTION_SMS_DEVICE_ON" ), // MSG_DEVICE_ON
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "GSMACTION_SMS_DEVICE_OFF" ), // MSG_DEVICE_OFF
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "GSMACTION_DETECT_TRAIN" ), // MSG_DETECT_TRAIN
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "GSMACTION_SMS_BATTERY" ), // MSG_BATTERY_LOW
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "GSMACTION_SMS_RELAY" ), // MSG_RELAY_OPEN
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "GSMACTION_SHORT_FAIL" ), // MSG_SHORTCUT_FAIL
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "GSMACTION_MEASURE_FAIL" ), // MSG_MEASURE_FAIL
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "GSMACTION_DISK_FULL" ), // MSG_DISK_FULL
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "GSMACTION_DISK_ERROR" ), // MSG_DISK_ERROR
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "GSMACTION_STATUS_UPDATE" ), // request WCPU to send a status update
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "GSMACTION_SMS_STATUS" ) // status requested
|
||
)
|
||
),
|
||
4 => array(
|
||
'key' => "t1"
|
||
),
|
||
5 => array(
|
||
'key' => "t1[measurement_button]"
|
||
),
|
||
6 => array(
|
||
'key' => "t1[short_okay]"
|
||
),
|
||
7 => array(
|
||
'key' => "t1[sweep_timeout]"
|
||
),
|
||
8 => array(
|
||
'key' => "t1[flush_log]"
|
||
),
|
||
9 => array(
|
||
'key' => "t1[gsm_timeout]"
|
||
),
|
||
10 => array(
|
||
'key' => "t1[gsm_activate]"
|
||
),
|
||
11 => array(
|
||
'key' => "t1[enable_gps]"
|
||
),
|
||
12 => array(
|
||
'key' => "t1[gps_timeout]"
|
||
),
|
||
13 => array(
|
||
'key' => "t1[power_save]"
|
||
),
|
||
14 => array(
|
||
'key' => "t1[generator]"
|
||
),
|
||
15 => array(
|
||
'key' => "log[state][mcu]",
|
||
'base' => 16,
|
||
'values' => array(
|
||
// MCU log file state (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "LFS_WROPEN" ), // log file is open for writing
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "LFS_RDOPEN" ), // log file is open for reading
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "LFS_HIBERNATE" ), // uALFAT is hibernating
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "LFS_uALFAT_OK" ), // uALFAT is accessible and SD-card present
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "LFS_HAS_DATA" ), // data written to uALFAT; flush needed
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "LFS_READREQ" ), // read request posted by WCPU
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "LFS_READNEW" ), // read request posted for new log file (close old one)
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "LFS_BUSY" ), // command to the uALFAT; waiting for reply
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "LFS_SDCARD_ERROR" ), // SD-card cannot be mounted
|
||
// asynchronous commands (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "LFS_ASYNC_BUSY" ), // any of the asynchronous commands below is busy
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "LFS_DIR_BUSY" ), // directory listing is busy
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "LFS_OPEN_BUSY" ), // opening logfile for reading
|
||
// other commands (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "LFS_ASYNC_INT" ), // timer expired (not necessarily a time-out)
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "LFS_RDCLOSE" ), // close the read handle to abort the replay
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "LFS_DIRINIT" ), // start reading the directory listing
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "LFS_DIR" ) // read the next directory entry
|
||
)
|
||
),
|
||
16 => array(
|
||
'key' => "log[state][async]",
|
||
'base' => 10,
|
||
'values' => array(
|
||
array( 'val' => 0, 'text' => "LFS_IDLE" ),
|
||
array( 'val' => 1, 'text' => "LFS_FLUSH" ), // asynchronous flush is busy
|
||
array( 'val' => 2, 'text' => "LFS_SEEK" ), // asynchronous seek is busy
|
||
array( 'val' => 3, 'text' => "LFS_RDCMD" ), // asynchronous read (command phase) is busy
|
||
array( 'val' => 4, 'text' => "LFS_RDDATA" ), // asynchronous read (data phase) is busy
|
||
array( 'val' => 5, 'text' => "LFS_RDOPENFILE" ), // asynchrounous file open
|
||
array( 'val' => 6, 'text' => "LFS_INIT_WELCOME" ), // initialization: wait for welcome message
|
||
array( 'val' => 7, 'text' => "LFS_INIT_MOUNT" ), // mount SD-card
|
||
array( 'val' => 8, 'text' => "LFS_INIT_WROPEN" ) // open the log file for writing
|
||
)
|
||
),
|
||
17 => array(
|
||
'key' => "log[count]"
|
||
),
|
||
18 => array(
|
||
'key' => "log[state][replay]<sub>7..0</sub>",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x01, 'val' => 0x01, 'text' => "LFS_STALLED" ), // MCU read back is waiting for new data
|
||
array( 'mask' => 0x02, 'val' => 0x02, 'text' => "LFS_READY" ), // MCU read buffer is ready to be transferred to WCPU
|
||
array( 'mask' => 0x04, 'val' => 0x04, 'text' => "LFS_ABORTED" ) // Log replay is aborted
|
||
)
|
||
),
|
||
19 => array(
|
||
'key' => "log[error]",
|
||
'base' => 10,
|
||
'values' => array(
|
||
// I2C, SPI or SD-card errors
|
||
array( 'val' => 0, 'text' => "I2CSTAT_OK" ),
|
||
array( 'val' => -1, 'text' => "I2CSTAT_BUSY" ), // (not a real error)
|
||
array( 'val' => -2, 'text' => "I2CERROR_BUS" ), // generic bus error
|
||
array( 'val' => -3, 'text' => "I2CERROR_BUS_TIMEOUT" ), // time-out while accessing the I2C bus
|
||
array( 'val' => -4, 'text' => "I2CERROR_MASTER" ), // generic failure of the master
|
||
array( 'val' => -5, 'text' => "I2CERROR_MASTER_TIMEOUT" ), // master s/m or transfer timed out
|
||
array( 'val' => -6, 'text' => "I2CERROR_SLAVE" ), // generic failure of the slave or SD-card
|
||
array( 'val' => -7, 'text' => "I2CERROR_SLAVE_TIMEOUT" ), // time-out accessing or waiting for a slave
|
||
array( 'val' => -8, 'text' => "I2CERROR_DATA" ), // generic data error (not enough bytes)
|
||
array( 'val' => -9, 'text' => "I2CERROR_CRC" ), // parity or CRC error (SD-card access)
|
||
// software errors
|
||
array( 'val' => -12, 'text' => "I2CERROR_BUSY" ), // (software) busy while this was not expected
|
||
array( 'val' => -13, 'text' => "I2CERROR_BUFFER_OVERRUN" ), // (software) buffer overrun
|
||
array( 'val' => -14, 'text' => "I2CERROR_BUFFER_UNDERRUN" ), // (software) buffer contains too little data
|
||
array( 'val' => -15, 'text' => "I2CERROR_WRONG_STATE" ), // (software) state machine is not idle or in the
|
||
// wrong state in general (e.g. hibernating)
|
||
|
||
array( 'val' => -30, 'text' => "I2CERROR_RETRY" ), // action is retried
|
||
array( 'val' => -31, 'text' => "I2CERROR_INIT_TIMEOUT" ), // initialization timed out
|
||
array( 'val' => -32, 'text' => "I2CERROR_ERROR" ), // unspecified error
|
||
array( 'val' => -33, 'text' => "I2CERROR_STATE" ), // invalid/unknown/unexpected state
|
||
array( 'val' => -34, 'text' => "I2CERROR_INVAL" ), // invalid parameter
|
||
array( 'val' => -35, 'text' => "I2CERROR_NOSUPP" ), // operation not supported
|
||
array( 'val' => -36, 'text' => "I2CERROR_NO_DEVICE" ), // slave does not respond and is probably not
|
||
// present or defective
|
||
array( 'val' => -37, 'text' => "I2CERROR_WRONG_VERSION" ), // wrong software or log version
|
||
array( 'val' => -38, 'text' => "I2CERROR_BAD_TIME" ), // date/time is invalid
|
||
// SPI or SD-card errors
|
||
array( 'val' => -10, 'text' => "SDERROR_BUS_BUSY" ), // SPI bus or SPI state machine is busy
|
||
array( 'val' => -11, 'text' => "SDERROR_WRITE" ), // SD-card write error
|
||
// SD-card specific errors
|
||
array( 'val' => -16, 'text' => "SDERROR_NO_CARD" ), // No card detected
|
||
array( 'val' => -17, 'text' => "SDERROR_INVALID_CARD" ), // Card is not usable (wrong voltage range or other error)
|
||
array( 'val' => -18, 'text' => "SDERROR_INVALID_CMD" ), // invalid command
|
||
// Config file errors
|
||
array( 'val' => -64, 'text' => "FILEERROR_INVAL" ), // Invalid argument
|
||
array( 'val' => -65, 'text' => "FILEERROR_PARAM" ), // Invalid parameter name
|
||
array( 'val' => -66, 'text' => "FILEERROR_SECTION" ), // Invalid section name
|
||
array( 'val' => -67, 'text' => "FILEERROR_EOF" ), // Unexpected end of file
|
||
array( 'val' => -68, 'text' => "FILEERROR_INCORRECT_FORMAT" ), // File has incorrect format or is invalid
|
||
|
||
// uALFAT errors
|
||
// Hardware Error codes
|
||
array( 'val' => 0x01, 'text' => "ERROR_READ_SECTOR" ),
|
||
array( 'val' => 0x02, 'text' => "ERROR_WRITE_SECTOR" ),
|
||
array( 'val' => 0x03, 'text' => "ERROR_ERASE_SECTOR" ),
|
||
array( 'val' => 0x04, 'text' => "ERROR_SD_UNEXPECTED_VALUE" ),
|
||
array( 'val' => 0x05, 'text' => "ERROR_MMC_INIT_TIMEOUT" ),
|
||
array( 'val' => 0x06, 'text' => "ERROR_SET_BLOCK_SIZE_FAIL" ),
|
||
array( 'val' => 0x07, 'text' => "ERROR_MMC_SEND_COMMAND_FAIL" ),
|
||
// FAT_mount Error codes
|
||
array( 'val' => 0x11, 'text' => "ERROR_MBR_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x12, 'text' => "ERROR_BS_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x13, 'text' => "ERROR_SECTOR_SIZE_NOT_512" ),
|
||
array( 'val' => 0x14, 'text' => "ERROR_FSINFO_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x15, 'text' => "ERROR_FAT12_NOT_SUPPORTED" ),
|
||
array( 'val' => 0x16, 'text' => "ERROR_FAT16_NOT_SUPPORTED" ),
|
||
// FAT functions
|
||
array( 'val' => 0x21, 'text' => "ERROR_CLUSTER_OVER_RANGE" ),
|
||
array( 'val' => 0x22, 'text' => "ERROR_CLUSTER_UNDER_RANGE" ),
|
||
array( 'val' => 0x23, 'text' => "ERROR_NEXT_CLUSTER_VALUE_OVER_RANGE" ),
|
||
array( 'val' => 0x24, 'text' => "ERROR_NEXT_CLUSTER_VALUE_UNDER_RANGE" ),
|
||
array( 'val' => 0x25, 'text' => "ERROR_NO_FREE_CLUSTERS" ),
|
||
// FAT filename error codes
|
||
array( 'val' => 0x31, 'text' => "ERROR_FILE_NAME_FORBIDDEN_CHAR" ),
|
||
array( 'val' => 0x32, 'text' => "ERROR_FILE_NAME_DIR_NAME_OVER_8" ),
|
||
array( 'val' => 0x33, 'text' => "ERROR_FILE_NAME_DIR_EXTENSION_OVER_3" ),
|
||
array( 'val' => 0x34, 'text' => "ERROR_FILE_NAME_FIRST_CHAR_ZERO" ),
|
||
array( 'val' => 0x35, 'text' => "ERROR_MEDIA_FULL" ),
|
||
// FAT main functions Error Codes
|
||
array( 'val' => 0x40, 'text' => "DIR_ENT_FOUND" ),
|
||
array( 'val' => 0x41, 'text' => "DIR_ENT_NOT_FOUND" ),
|
||
array( 'val' => 0x42, 'text' => "ERROR_FOLDER_IS_CORRUPTED_FIRST_CLUSTER" ),
|
||
array( 'val' => 0x43, 'text' => "ERROR_FOLDER_IS_CORRUPTED_DIR_DOT_NOT_FOUND" ),
|
||
array( 'val' => 0x44, 'text' => "ERROR_FOLDER_IS_CORRUPTED_DIR_DOTDOT_NOT_FOUND" ),
|
||
array( 'val' => 0x45, 'text' => "ERROR_ROOT_DIRECTORY_IS_FULL" ),
|
||
array( 'val' => 0x46, 'text' => "ERROR_OPEN_FOLDER_FILE" ),
|
||
array( 'val' => 0x47, 'text' => "ERROR_WRTIE_TO_READ_MODE_FILE" ),
|
||
array( 'val' => 0x48, 'text' => "ERROR_SEEK_REQUIER_READ_MODE" ),
|
||
array( 'val' => 0x49, 'text' => "ERROR_INVALID_SEEK_POINTER" ),
|
||
array( 'val' => 0x4A, 'text' => "ERROR_FOLDER_NOT_EMPTY" ),
|
||
array( 'val' => 0x4B, 'text' => "ERROR_IS_NOT_FOLDER" ),
|
||
array( 'val' => 0x4C, 'text' => "ERROR_READ_MODE_REQUIRED" ),
|
||
array( 'val' => 0x4D, 'text' => "ERROR_END_OF_DIR_LIST" ),
|
||
array( 'val' => 0x4E, 'text' => "ERROR_FILE_PARAMETERS" ),
|
||
array( 'val' => 0x4F, 'text' => "ERROR_HANDLE_IN_USE" ),
|
||
array( 'val' => 0X4F, 'text' => "ERROR_INVALID_HANDLE" ),
|
||
array( 'val' => 0x50, 'text' => "ERROR_ZERO_SIZE_FILE" ),
|
||
array( 'val' => 0x51, 'text' => "ERROR_FILE_MODE_INVALID" ),
|
||
array( 'val' => 0x52, 'text' => "ERROR_FILE_CORRUPTED" ),
|
||
array( 'val' => 0x53, 'text' => "ERROR_FILE_POINTER_OUT_OF_BOUNDS" ),
|
||
// FAT Driver
|
||
array( 'val' => 0x54, 'text' => "ERROR_ATTACH_IDE_DEVICE_RESET_TIMEOUT" ),
|
||
array( 'val' => 0x55, 'text' => "ERROR_ATTACH_IDE_DEVICE_IDENTIFY_TIMEOUT" ),
|
||
array( 'val' => 0x56, 'text' => "ERROR_READ_IDE_SECTOR_TIMEOUT" ),
|
||
array( 'val' => 0x57, 'text' => "FILE_UNKNOWN_DRIVE_LETTER" ),
|
||
// Commander Error Code
|
||
array( 'val' => 0x61, 'text' => "ERROR_COMMANDER_BAD_COMMAND" ),
|
||
array( 'val' => 0x62, 'text' => "ERROR_COMMANDER_STR_LEN_TOO_LONG" ), // or string is not null terminated
|
||
array( 'val' => 0x63, 'text' => "ERROR_COMMANDER_NAME_NOT_VALID" ),
|
||
array( 'val' => 0x64, 'text' => "ERROR_COMMANDER_NUMBER_INVALID" ),
|
||
array( 'val' => 0x65, 'text' => "ERROR_COMMANDER_WRITE_PARTIAL_FAILURE" ),
|
||
array( 'val' => 0x66, 'text' => "ERROR_COMMANDER_UNKNOWN_MEDIA_LETTER" ),
|
||
array( 'val' => 0x67, 'text' => "ERROR_COMMANDER_FAILED_TO_OPEN_MEDIA" ),
|
||
array( 'val' => 0x68, 'text' => "ERROR_COMMANDER_INCORRECT_CMD_PARAMETER" ),
|
||
array( 'val' => 0x69, 'text' => "ERROR_CHECK_SUM" ),
|
||
|
||
array( 'val' => 0xFD, 'text' => "ERROR_COMMANDER_UNKNOWN_ERROR" ),
|
||
array( 'val' => 0xFE, 'text' => "COMMANDER_RUN_FRAMED_MODE" ),
|
||
array( 'val' => 0xFF, 'text' => "COMMANDER_RETURN_IN_STRING" ),
|
||
|
||
array( 'val' => 0x70, 'text' => "USBD" ),
|
||
array( 'val' => 0x71, 'text' => "ERROR_USBD_NO_ENOUGH_PIPES" ),
|
||
array( 'val' => 0x72, 'text' => "ERROR_USBD_HANDLE_INUSE" ),
|
||
array( 'val' => 0x73, 'text' => "ERROR_USBD_INCORRECT_DESCRIPTOR" ),
|
||
array( 'val' => 0x74, 'text' => "ERROR_USBD_NONCONTROL_TRANSFER_FUNCTION" ),
|
||
array( 'val' => 0x75, 'text' => "ERROR_USBD_DATA_SIZE_IS_BIG_FOR_ENDPOINT" ),
|
||
array( 'val' => 0x76, 'text' => "ERROR_USBD_TIMEOUT" ),
|
||
array( 'val' => 0x77, 'text' => "ERROR_USBD_CONTROL_TRANSFER_REQUIERED" ),
|
||
array( 'val' => 0x78, 'text' => "ERROR_USBD_NACK" ),
|
||
array( 'val' => 0x79, 'text' => "ERROR_USBD_HANDLE_CORRUPTED" ),
|
||
array( 'val' => 0x7A, 'text' => "ERROR_USBD_DESCRIPTOR_CORRUPTED" ),
|
||
array( 'val' => 0x7B, 'text' => "ERROR_DESCRIPTOR_NOT_FOUND" ),
|
||
array( 'val' => 0x7C, 'text' => "ERROR_USB_HUB_NOT_FOUND" ),
|
||
array( 'val' => 0x7D, 'text' => "ERROR_HCD_USB_DEVICE_NOT_CONNECTED" ),
|
||
|
||
// MassStorage driver
|
||
array( 'val' => 0x80, 'text' => "ERROR_BOMS" ),
|
||
array( 'val' => 0x81, 'text' => "ERROR_BOMS_CSW_COMMAND_FAILD" ),
|
||
array( 'val' => 0x82, 'text' => "ERROR_BOMS_CSW_STATUS_PHASE_ERROR" ),
|
||
array( 'val' => 0x83, 'text' => "ERROR_BOMS_CSW" ),
|
||
array( 'val' => 0x84, 'text' => "ERROR_BOMS_WORNG_LUN_NUMBER" ),
|
||
array( 'val' => 0x85, 'text' => "ERROR_BOMS_WORNG_CSW_SIGNATURE" ),
|
||
array( 'val' => 0x86, 'text' => "ERROR_BOMS_WORNG_TAG_MISSMATCHED" ),
|
||
array( 'val' => 0x81, 'text' => "ERROR_USB_MASSSTORAGE_COMMAD_FAILED" ),
|
||
|
||
array( 'val' => 0xA0, 'text' => "ERROR_USB_MASS_STORAGE_DEVICE_NOT_READY" ),
|
||
array( 'val' => 0xA1, 'text' => "ERROR_USB_MASSSTORAGE_PROTOCOL_NOT_SUPPORTED" ),
|
||
array( 'val' => 0xA2, 'text' => "ERROR_USB_MASSSTORAGE_SUBCLASS_NOT_SUPPORTED" ),
|
||
array( 'val' => 0xA3, 'text' => "ERROR_SPC_INVALID_SENSE" ),
|
||
array( 'val' => 0xA4, 'text' => "ERROR_SPC_NO_ASC_ASCQ" ),
|
||
array( 'val' => 0xA5, 'text' => "ERROR_USB_MASSSTORAGE_NOT_FOUND" ),
|
||
|
||
array( 'val' => 0x90, 'text' => "ERROR_HCD_INIT_FAIL" ),
|
||
array( 'val' => 0x91, 'text' => "ERROR_HCD_UNDEFINED_CASE" ),
|
||
|
||
// Host error result codes, the 4 LSB's in the HRSL register.
|
||
array( 'val' => 0xB1, 'text' => "ERROR_HCD_BUSY" ),
|
||
array( 'val' => 0xB2, 'text' => "ERROR_HCD_BADREQ" ),
|
||
array( 'val' => 0xB3, 'text' => "ERROR_HCD_UNDEF" ),
|
||
array( 'val' => 0xB4, 'text' => "ERROR_HCD_NAK" ),
|
||
array( 'val' => 0xB5, 'text' => "ERROR_HCD_STALL" ),
|
||
array( 'val' => 0xB6, 'text' => "ERROR_HCD_TOGERR" ),
|
||
array( 'val' => 0xB7, 'text' => "ERROR_HCD_WRONGPID" ),
|
||
array( 'val' => 0xB8, 'text' => "ERROR_HCD_BADBC" ),
|
||
array( 'val' => 0xB9, 'text' => "ERROR_HCD_PIDERR" ),
|
||
array( 'val' => 0xBA, 'text' => "ERROR_HCD_PKTERR" ),
|
||
array( 'val' => 0xBB, 'text' => "ERROR_HCD_CRCERR" ),
|
||
array( 'val' => 0xBC, 'text' => "ERROR_HCD_KERR" ),
|
||
array( 'val' => 0xBD, 'text' => "ERROR_HCD_JERR" ),
|
||
array( 'val' => 0xBE, 'text' => "ERROR_HCD_TIMEOUT" ),
|
||
array( 'val' => 0xBF, 'text' => "ERROR_HCD_BABBLE" ),
|
||
|
||
// FLASH driver
|
||
array( 'val' => 0xD0, 'text' => "ERROR_ADDRESS_RANGE" ),
|
||
array( 'val' => 0xD1, 'text' => "ERROR_FLASH_NOT_BLANK" ),
|
||
array( 'val' => 0xD2, 'text' => "ERROR_VERIFY" ),
|
||
array( 'val' => 0xD3, 'text' => "ERROR_INTERNAL" ),
|
||
array( 'val' => 0xD4, 'text' => "ERROR_CHECKSUM" ),
|
||
array( 'val' => 0xD5, 'text' => "ERROR_ERASE_COMMAND" ),
|
||
array( 'val' => 0xD6, 'text' => "ERROR_BROKEN_ACTIVATE_SEQUENCE" ),
|
||
array( 'val' => 0xD7, 'text' => "ERROR_INVALID_FIRMWARE" ),
|
||
array( 'val' => 0xD8, 'text' => "ERROR_BR_COMMAND" ),
|
||
array( 'val' => 0xDA, 'text' => "ERROR_FILE_IS_EMPTY" ),
|
||
array( 'val' => 0xDB, 'text' => "ERROR_FILE_NOT_FOUND" ),
|
||
array( 'val' => 0xDE, 'text' => "ERROR_UNKNOWN_COMMAND" ),
|
||
|
||
array( 'val' => 0xF0, 'text' => "ERROR_UNEXPECTED_VALUE" ),
|
||
array( 'val' => 0xFD, 'text' => "ERROR_UNEXPECTED_COMMAND" ),
|
||
)
|
||
)
|
||
)
|
||
),
|
||
array(
|
||
'key' => "STAT[FLAGS]",
|
||
'title' => "Systeemstatus",
|
||
'fields' => array(
|
||
'mcu[status]' => array(
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "[mcu]",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "meting 'aan'" ),
|
||
array( 'mask' => 0x0001, 'val' => 0x0000, 'text' => "meting 'uit'" ),
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "detectie 'ok'" ),
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "meetfout geconstateerd" ),
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "relais open" ),
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "i2c fout" ),
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "logfile fout" ),
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "gsm/wcpu fout" ),
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "sms fout" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0000, 'text' => "batterij 1 'ok'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0100, 'text' => "batterij 1 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0300, 'text' => "batterij 1 'leeg'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0700, 'text' => "batterij 1 'verwijderd'" ),
|
||
array( 'mask' => 0xF000, 'val' => 0x0000, 'text' => "batterij 2 'ok'" ),
|
||
array( 'mask' => 0xF000, 'val' => 0x1000, 'text' => "batterij 2 'alarm'" ),
|
||
array( 'mask' => 0xF000, 'val' => 0x3000, 'text' => "batterij 2 'leeg'" ),
|
||
array( 'mask' => 0xF000, 'val' => 0x7000, 'text' => "batterij 2 'verwijderd'" ),
|
||
)
|
||
),
|
||
1 => array(
|
||
'key' => "[local_state]",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "auto-calibratie bezig" ),
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "auto-calibratie gefaald" ),
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "meting gedaan" ),
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "frequentie-sweep" ),
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "amplitude-sweep" ),
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "gps aan voor track&trace" ),
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "gps coördinaten ontvangen" ),
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "gps tijd ontvangen" ),
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "leds 'hoog'" ),
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "lantaarn 'aan'" ),
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "extern contact 'aan'" ),
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "relais-aansturing 'aan'" ),
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "gsm: geregistreerd" ),
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "tcp: ingelogd" ),
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "in service" ),
|
||
array( 'mask' => 0x8000, 'val' => 0x0000, 'text' => "initialisatie bezig" )
|
||
)
|
||
),
|
||
2 => array(
|
||
'key' => "[flags]",
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x00000001, 'val' => 0x00000001, 'text' => "gecalibreerd" ),
|
||
array( 'mask' => 0x00000002, 'val' => 0x00000002, 'text' => "oplader 'uit'" ),
|
||
array( 'mask' => 0x00000040, 'val' => 0x00000040, 'text' => "gsm-status altijd tonen" ),
|
||
array( 'mask' => 0x00000004, 'val' => 0x00000004, 'text' => "switch3000 gedetecteerd" ),
|
||
array( 'mask' => 0x00000008, 'val' => 0x00000008, 'text' => "pm3000 gedetecteerd" ),
|
||
array( 'mask' => 0x00100000, 'val' => 0x00100000, 'text' => "td3000 gedetecteerd" ),
|
||
array( 'mask' => 0x00200000, 'val' => 0x00200000, 'text' => "powercycle gedetecteerd" ),
|
||
array( 'mask' => 0x00000010, 'val' => 0x00000010, 'text' => "meting 'aan'" ),
|
||
array( 'mask' => 0x00000020, 'val' => 0x00000020, 'text' => "meting 'aan' vanuit mtinfo" ),
|
||
array( 'mask' => 0x00000080, 'val' => 0x00000080, 'text' => "vrijgegeven voor schakelen" ),
|
||
array( 'mask' => 0x00000080, 'val' => 0x00000000, 'text' => "niet vrijgegeven" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000000, 'text' => "batterij 1: 12V NiMH" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000100, 'text' => "batterij 1: 6V NiMH" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000200, 'text' => "batterij 1: 3V NiMH" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000300, 'text' => "batterij 1: 24V NiMH" ),
|
||
array( 'mask' => 0x00000C00, 'val' => 0x00000400, 'text' => "batterij 1: vaste voeding" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000800, 'text' => "batterij 1: 6.4V LiFePO4" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000900, 'text' => "batterij 1: 9.6V LiFePO4" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000A00, 'text' => "batterij 1: 12.8V LiFePO4" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000B00, 'text' => "batterij 1: 3.2V LiFePO4" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000C00, 'text' => "batterij 1: 12V Alkaline" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000D00, 'text' => "batterij 1: 6V Alkaline" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000E00, 'text' => "batterij 1: 3V Alkaline" ),
|
||
array( 'mask' => 0x00000F00, 'val' => 0x00000F00, 'text' => "batterij 1: 24V Alkaline" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00000000, 'text' => "batterij 2: 12V NiMH" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00001000, 'text' => "batterij 2: 6V NiMH" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00002000, 'text' => "batterij 2: 3V NiMH" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00003000, 'text' => "batterij 2: 24V NiMH" ),
|
||
array( 'mask' => 0x0000C000, 'val' => 0x00004000, 'text' => "batterij 2: vaste voeding" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00008000, 'text' => "batterij 2: 6.4V LiFePO4" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x00009000, 'text' => "batterij 2: 9.6V LiFePO4" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000A000, 'text' => "batterij 2: 12.8V LiFePO4" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000B000, 'text' => "batterij 2: 3.2V LiFePO4" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000C000, 'text' => "batterij 2: 12V Alkaline" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000D000, 'text' => "batterij 2: 6V Alkaline" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000E000, 'text' => "batterij 2: 3V Alkaline" ),
|
||
array( 'mask' => 0x0000F000, 'val' => 0x0000F000, 'text' => "batterij 2: 24V Alkaline" ),
|
||
)
|
||
)
|
||
)
|
||
),
|
||
'wcpu[status]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x00008000, 'val' => 0x00008000, 'text' => "gps fix" ),
|
||
array( 'mask' => 0x00040000, 'val' => 0x00040000, 'text' => "gps tijd" ),
|
||
array( 'mask' => 0x00080000, 'val' => 0x00080000, 'text' => "binnen geofence" ),
|
||
array( 'mask' => 0x00000001, 'val' => 0x00000001, 'text' => "programmeer-interface geblokkeerd" ),
|
||
array( 'mask' => 0x00000002, 'val' => 0x00000002, 'text' => "gprs/tcp fout" ),
|
||
array( 'mask' => 0x00000004, 'val' => 0x00000004, 'text' => "sms fout" ),
|
||
array( 'mask' => 0x00000008, 'val' => 0x00000008, 'text' => "sim fout" ),
|
||
array( 'mask' => 0x00000010, 'val' => 0x00000010, 'text' => "uart #1 (mcu) fout" ),
|
||
array( 'mask' => 0x00000020, 'val' => 0x00000020, 'text' => "uart #2 (gps) fout" ),
|
||
array( 'mask' => 0x00000040, 'val' => 0x00000040, 'text' => "i2c fout" ),
|
||
array( 'mask' => 0x00000080, 'val' => 0x00000080, 'text' => "mcu fout" ),
|
||
array( 'mask' => 0x00000100, 'val' => 0x00000100, 'text' => "gsm 'ok'" ),
|
||
array( 'mask' => 0x00000200, 'val' => 0x00000200, 'text' => "sim 'ok'" ),
|
||
array( 'mask' => 0x00000400, 'val' => 0x00000400, 'text' => "gprs 'ok'" ),
|
||
array( 'mask' => 0x00000800, 'val' => 0x00000800, 'text' => "tcp 'ok'" ),
|
||
array( 'mask' => 0x00001000, 'val' => 0x00001000, 'text' => "gps 'ok'" ),
|
||
array( 'mask' => 0x00002000, 'val' => 0x00002000, 'text' => "sms 'ok'" ),
|
||
array( 'mask' => 0x00004000, 'val' => 0x00004000, 'text' => "ssl 'ok'" ),
|
||
array( 'mask' => 0x00100000, 'val' => 0x00100000, 'text' => "temp on-board boven drempel" ),
|
||
array( 'mask' => 0x00200000, 'val' => 0x00200000, 'text' => "temp extern boven drempel" ),
|
||
array( 'mask' => 0x00400000, 'val' => 0x00400000, 'text' => "temp <gereserveerd> boven drempel" ),
|
||
array( 'mask' => 0x00800000, 'val' => 0x00800000, 'text' => "temp switch3000 boven drempel" ),
|
||
array( 'mask' => 0x00010000, 'val' => 0x00010000, 'text' => "log replay 'aan'" ),
|
||
array( 'mask' => 0x00020000, 'val' => 0x00020000, 'text' => "log replay 'stalled'" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x01000000, 'text' => "log replay 'starting/wait'" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x02000000, 'text' => "log replay 'busy/wait'" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x03000000, 'text' => "log replay 'abort'" ),
|
||
array( 'mask' => 0x04000000, 'val' => 0x04000000, 'text' => "log replay 'retry'" ),
|
||
array( 'mask' => 0x08000000, 'val' => 0x08000000, 'text' => "log replay fout" )
|
||
)
|
||
),
|
||
'rc[status]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "meting 'aan' (rc)" ),
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "detectie 'ok' (rc)" ),
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "sleutel 'aan'" ),
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "sleutel 'uit'" ),
|
||
array( 'mask' => 0x000C, 'val' => 0x0000, 'text' => "sleutel 'operationeel'" ),
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "i2c fout (s/w bus)" ),
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "1-wire fout (s/w bus)" ),
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "pm3000 fout" ),
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "switch3000: spanning 'aan'" ),
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "pm3000: switch 1 (switch3000) 'aan'" ),
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "pm3000: switch 2 'aan'" ),
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "pm3000: lader 'aan'" ),
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "pm3000: 9V analoge spanning 'aan'" ),
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "gps: spanning 'aan'" ),
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "pm3000: lader handmatig" ),
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "switch3000: one-shot meting" ),
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "switch3000: status geldig" ),
|
||
)
|
||
),
|
||
'switch[status]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x000F, 'val' => 0x0000, 'text' => "switch3000 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0001, 'text' => "switch3000 'uit', sectie 1 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0002, 'text' => "switch3000 'uit', sectie 2 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0003, 'text' => "switch3000 'uit', secties 1,2 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0004, 'text' => "switch3000 'uit', sectie 3 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0005, 'text' => "switch3000 'uit', secties 1,3 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0006, 'text' => "switch3000 'aan', secties 1,4 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0007, 'text' => "switch3000 'aan', sectie 4 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0008, 'text' => "switch3000 'uit', sectie 4 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x0009, 'text' => "switch3000 'aan', secties 2,3 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000A, 'text' => "switch3000 'uit', secties 2,4 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000B, 'text' => "switch3000 'aan', sectie 3 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000C, 'text' => "switch3000 'uit', secties 3,4 'aan'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000D, 'text' => "switch3000 'aan', sectie 2 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000E, 'text' => "switch3000 'aan', sectie 1 'uit'" ),
|
||
array( 'mask' => 0x000F, 'val' => 0x000F, 'text' => "switch3000 'aan'" ),
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "switch3000 time-out" ),
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "switch3000 fout" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0000, 'text' => "batterijen secties 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0100, 'text' => "batterijen sectie 1 'ok', secties 2,3,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0200, 'text' => "batterijen sectie 2 'ok', secties 1,3,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0300, 'text' => "batterijen secties 1,2 'ok', secties 3,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0400, 'text' => "batterijen sectie 3 'ok', sectie 1,2,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0500, 'text' => "batterijen secties 1,3 'ok', secties 2,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0600, 'text' => "batterijen secties 2,3 'ok', secties 1,4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0700, 'text' => "batterijen secties 1,2,3 'ok', sectie 4 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0800, 'text' => "batterijen secties 4 'ok', secties 1,2,3 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0900, 'text' => "batterijen secties 1,4 'ok', secties 2,3 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0A00, 'text' => "batterijen secties 2,4 'ok', secties 1,3 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0B00, 'text' => "batterijen secties 1,2,4 'ok', sectie 3 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0C00, 'text' => "batterijen secties 3,4 'ok', sectie 1,2 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0D00, 'text' => "batterijen secties 1,3,4 'ok', sectie 2 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0E00, 'text' => "batterijen secties 2,3,4 'ok', sectie 1 'alarm'" ),
|
||
array( 'mask' => 0x0F00, 'val' => 0x0F00, 'text' => "batterijen secties 'ok'" ),
|
||
array( 'mask' => 0x8000, 'val' => 0x0000, 'text' => "batterij noodschakelaar 'alarm'" ),
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "batterij noodschakelaar 'ok'" ),
|
||
)
|
||
)
|
||
)
|
||
),
|
||
array(
|
||
'key' => "STAT[MEASUREMENT]",
|
||
'title' => "Meting"
|
||
),
|
||
array(
|
||
'key' => "STAT[BATTERY]",
|
||
'title' => "Voeding en batterijen"
|
||
),
|
||
array(
|
||
'key' => "STAT[TEMP]",
|
||
'title' => "Temperatuur"
|
||
),
|
||
array(
|
||
'key' => "STAT[LOG]",
|
||
'title' => "Status van oversturen log",
|
||
'fields' => array(
|
||
// log[state][replay] is the name of log[state][wcpu] prior to 20121018
|
||
'log[state][replay]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x00000001, 'val' => 0x00000001, 'text' => "mcu: stalled" ),
|
||
array( 'mask' => 0x00000002, 'val' => 0x00000002, 'text' => "mcu: data ready" ),
|
||
array( 'mask' => 0x00000004, 'val' => 0x00000004, 'text' => "mcu: aborted" ),
|
||
array( 'mask' => 0x00010000, 'val' => 0x00010000, 'text' => "wcpu: log replay active" ),
|
||
array( 'mask' => 0x00020000, 'val' => 0x00020000, 'text' => "wcpu: stalled" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x01000000, 'text' => "wcpu: starting/wait" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x02000000, 'text' => "wcpu: busy/wait" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x03000000, 'text' => "wcpu: abort" ),
|
||
array( 'mask' => 0x04000000, 'val' => 0x04000000, 'text' => "wcpu: retry" ),
|
||
array( 'mask' => 0x08000000, 'val' => 0x08000000, 'text' => "wcpu: error" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x10000000, 'text' => "wcpu: ack" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x20000000, 'text' => "wcpu: reading" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x30000000, 'text' => "wcpu: processing" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x40000000, 'text' => "wcpu: next" ),
|
||
array( 'mask' => 0xF0000000, 'val' => 0x80000000, 'text' => "wcpu: directory listing" ),
|
||
array( 'mask' => 0xF0000000, 'val' => 0xF0000000, 'text' => "wcpu: done" ),
|
||
)
|
||
),
|
||
'log[state][wcpu]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
array( 'mask' => 0x00000001, 'val' => 0x00000001, 'text' => "mcu: stalled" ),
|
||
array( 'mask' => 0x00000002, 'val' => 0x00000002, 'text' => "mcu: data ready" ),
|
||
array( 'mask' => 0x00000004, 'val' => 0x00000004, 'text' => "mcu: aborted" ),
|
||
array( 'mask' => 0x00010000, 'val' => 0x00010000, 'text' => "wcpu: log replay active" ),
|
||
array( 'mask' => 0x00020000, 'val' => 0x00020000, 'text' => "wcpu: stalled" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x01000000, 'text' => "wcpu: starting/wait" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x02000000, 'text' => "wcpu: busy/wait" ),
|
||
array( 'mask' => 0x03000000, 'val' => 0x03000000, 'text' => "wcpu: abort" ),
|
||
array( 'mask' => 0x04000000, 'val' => 0x04000000, 'text' => "wcpu: retry" ),
|
||
array( 'mask' => 0x08000000, 'val' => 0x08000000, 'text' => "wcpu: error" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x10000000, 'text' => "wcpu: ack" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x20000000, 'text' => "wcpu: reading" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x30000000, 'text' => "wcpu: processing" ),
|
||
array( 'mask' => 0x70000000, 'val' => 0x40000000, 'text' => "wcpu: next" ),
|
||
array( 'mask' => 0xF0000000, 'val' => 0x80000000, 'text' => "wcpu: directory listing" ),
|
||
array( 'mask' => 0xF0000000, 'val' => 0xF0000000, 'text' => "wcpu: done" ),
|
||
)
|
||
),
|
||
'log[state][mcu]' => array(
|
||
'base' => 16,
|
||
'values' => array(
|
||
// MCU log file state (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x0001, 'val' => 0x0001, 'text' => "LFS_WROPEN" ), // log file is open for writing
|
||
array( 'mask' => 0x0002, 'val' => 0x0002, 'text' => "LFS_RDOPEN" ), // log file is open for reading
|
||
array( 'mask' => 0x0004, 'val' => 0x0004, 'text' => "LFS_HIBERNATE" ), // uALFAT is hibernating
|
||
array( 'mask' => 0x0008, 'val' => 0x0008, 'text' => "LFS_uALFAT_OK" ), // uALFAT is accessible and SD-card present
|
||
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "LFS_HAS_DATA" ), // data written to uALFAT; flush needed
|
||
array( 'mask' => 0x0020, 'val' => 0x0020, 'text' => "LFS_READREQ" ), // read request posted by WCPU
|
||
array( 'mask' => 0x0040, 'val' => 0x0040, 'text' => "LFS_READNEW" ), // read request posted for new log file (close old one)
|
||
array( 'mask' => 0x0080, 'val' => 0x0080, 'text' => "LFS_BUSY" ), // command to the uALFAT; waiting for reply
|
||
array( 'mask' => 0x0800, 'val' => 0x0800, 'text' => "LFS_SDCARD_ERROR" ), // SD-card cannot be mounted
|
||
// asynchronous commands (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x0100, 'val' => 0x0100, 'text' => "LFS_ASYNC_BUSY" ), // any of the asynchronous commands below is busy
|
||
array( 'mask' => 0x0200, 'val' => 0x0200, 'text' => "LFS_DIR_BUSY" ), // directory listing is busy
|
||
array( 'mask' => 0x0400, 'val' => 0x0400, 'text' => "LFS_OPEN_BUSY" ), // opening logfile for reading
|
||
// other commands (MCURD_ES_LOGFILE_STATE)
|
||
array( 'mask' => 0x1000, 'val' => 0x1000, 'text' => "LFS_ASYNC_INT" ), // timer expired (not necessarily a time-out)
|
||
array( 'mask' => 0x2000, 'val' => 0x2000, 'text' => "LFS_RDCLOSE" ), // close the read handle to abort the replay
|
||
array( 'mask' => 0x4000, 'val' => 0x4000, 'text' => "LFS_DIRINIT" ), // start reading the directory listing
|
||
array( 'mask' => 0x8000, 'val' => 0x8000, 'text' => "LFS_DIR" ) // read the next directory entry
|
||
)
|
||
),
|
||
'log[state][async]' => array(
|
||
'base' => 10,
|
||
'values' => array(
|
||
array( 'val' => 0, 'text' => "LFS_IDLE" ),
|
||
array( 'val' => 1, 'text' => "LFS_FLUSH" ), // asynchronous flush is busy
|
||
array( 'val' => 2, 'text' => "LFS_SEEK" ), // asynchronous seek is busy
|
||
array( 'val' => 3, 'text' => "LFS_RDCMD" ), // asynchronous read (command phase) is busy
|
||
array( 'val' => 4, 'text' => "LFS_RDDATA" ), // asynchronous read (data phase) is busy
|
||
array( 'val' => 5, 'text' => "LFS_RDOPENFILE" ), // asynchrounous file open
|
||
array( 'val' => 6, 'text' => "LFS_INIT_WELCOME" ), // initialization: wait for welcome message
|
||
array( 'val' => 7, 'text' => "LFS_INIT_MOUNT" ), // mount SD-card
|
||
array( 'val' => 8, 'text' => "LFS_INIT_WROPEN" ) // open the log file for writing
|
||
)
|
||
),
|
||
'log[state][error]' => array(
|
||
'base' => 10,
|
||
'values' => array(
|
||
// I2C, SPI or SD-card errors
|
||
array( 'val' => 0, 'text' => "I2CSTAT_OK" ),
|
||
array( 'val' => -1, 'text' => "I2CSTAT_BUSY" ), // (not a real error)
|
||
array( 'val' => -2, 'text' => "I2CERROR_BUS" ), // generic bus error
|
||
array( 'val' => -3, 'text' => "I2CERROR_BUS_TIMEOUT" ), // time-out while accessing the I2C bus
|
||
array( 'val' => -4, 'text' => "I2CERROR_MASTER" ), // generic failure of the master
|
||
array( 'val' => -5, 'text' => "I2CERROR_MASTER_TIMEOUT" ), // master s/m or transfer timed out
|
||
array( 'val' => -6, 'text' => "I2CERROR_SLAVE" ), // generic failure of the slave or SD-card
|
||
array( 'val' => -7, 'text' => "I2CERROR_SLAVE_TIMEOUT" ), // time-out accessing or waiting for a slave
|
||
array( 'val' => -8, 'text' => "I2CERROR_DATA" ), // generic data error (not enough bytes)
|
||
array( 'val' => -9, 'text' => "I2CERROR_CRC" ), // parity or CRC error (SD-card access)
|
||
// software errors
|
||
array( 'val' => -12, 'text' => "I2CERROR_BUSY" ), // (software) busy while this was not expected
|
||
array( 'val' => -13, 'text' => "I2CERROR_BUFFER_OVERRUN" ), // (software) buffer overrun
|
||
array( 'val' => -14, 'text' => "I2CERROR_BUFFER_UNDERRUN" ), // (software) buffer contains too little data
|
||
array( 'val' => -15, 'text' => "I2CERROR_WRONG_STATE" ), // (software) state machine is not idle or in the
|
||
// wrong state in general (e.g. hibernating)
|
||
|
||
array( 'val' => -30, 'text' => "I2CERROR_RETRY" ), // action is retried
|
||
array( 'val' => -31, 'text' => "I2CERROR_INIT_TIMEOUT" ), // initialization timed out
|
||
array( 'val' => -32, 'text' => "I2CERROR_ERROR" ), // unspecified error
|
||
array( 'val' => -33, 'text' => "I2CERROR_STATE" ), // invalid/unknown/unexpected state
|
||
array( 'val' => -34, 'text' => "I2CERROR_INVAL" ), // invalid parameter
|
||
array( 'val' => -35, 'text' => "I2CERROR_NOSUPP" ), // operation not supported
|
||
array( 'val' => -36, 'text' => "I2CERROR_NO_DEVICE" ), // slave does not respond and is probably not
|
||
// present or defective
|
||
array( 'val' => -37, 'text' => "I2CERROR_WRONG_VERSION" ), // wrong software or log version
|
||
array( 'val' => -38, 'text' => "I2CERROR_BAD_TIME" ), // date/time is invalid
|
||
// SPI or SD-card errors
|
||
array( 'val' => -10, 'text' => "SDERROR_BUS_BUSY" ), // SPI bus or SPI state machine is busy
|
||
array( 'val' => -11, 'text' => "SDERROR_WRITE" ), // SD-card write error
|
||
// SD-card specific errors
|
||
array( 'val' => -16, 'text' => "SDERROR_NO_CARD" ), // No card detected
|
||
array( 'val' => -17, 'text' => "SDERROR_INVALID_CARD" ), // Card is not usable (wrong voltage range or other error)
|
||
array( 'val' => -18, 'text' => "SDERROR_INVALID_CMD" ), // invalid command
|
||
// Config file errors
|
||
array( 'val' => -64, 'text' => "FILEERROR_INVAL" ), // Invalid argument
|
||
array( 'val' => -65, 'text' => "FILEERROR_PARAM" ), // Invalid parameter name
|
||
array( 'val' => -66, 'text' => "FILEERROR_SECTION" ), // Invalid section name
|
||
array( 'val' => -67, 'text' => "FILEERROR_EOF" ), // Unexpected end of file
|
||
array( 'val' => -68, 'text' => "FILEERROR_INCORRECT_FORMAT" ), // File has incorrect format or is invalid
|
||
|
||
// uALFAT errors
|
||
// Hardware Error codes
|
||
array( 'val' => 0x01, 'text' => "ERROR_READ_SECTOR" ),
|
||
array( 'val' => 0x02, 'text' => "ERROR_WRITE_SECTOR" ),
|
||
array( 'val' => 0x03, 'text' => "ERROR_ERASE_SECTOR" ),
|
||
array( 'val' => 0x04, 'text' => "ERROR_SD_UNEXPECTED_VALUE" ),
|
||
array( 'val' => 0x05, 'text' => "ERROR_MMC_INIT_TIMEOUT" ),
|
||
array( 'val' => 0x06, 'text' => "ERROR_SET_BLOCK_SIZE_FAIL" ),
|
||
array( 'val' => 0x07, 'text' => "ERROR_MMC_SEND_COMMAND_FAIL" ),
|
||
// FAT_mount Error codes
|
||
array( 'val' => 0x11, 'text' => "ERROR_MBR_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x12, 'text' => "ERROR_BS_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x13, 'text' => "ERROR_SECTOR_SIZE_NOT_512" ),
|
||
array( 'val' => 0x14, 'text' => "ERROR_FSINFO_SIGNATURE_MISSMATCH" ),
|
||
array( 'val' => 0x15, 'text' => "ERROR_FAT12_NOT_SUPPORTED" ),
|
||
array( 'val' => 0x16, 'text' => "ERROR_FAT16_NOT_SUPPORTED" ),
|
||
// FAT functions
|
||
array( 'val' => 0x21, 'text' => "ERROR_CLUSTER_OVER_RANGE" ),
|
||
array( 'val' => 0x22, 'text' => "ERROR_CLUSTER_UNDER_RANGE" ),
|
||
array( 'val' => 0x23, 'text' => "ERROR_NEXT_CLUSTER_VALUE_OVER_RANGE" ),
|
||
array( 'val' => 0x24, 'text' => "ERROR_NEXT_CLUSTER_VALUE_UNDER_RANGE" ),
|
||
array( 'val' => 0x25, 'text' => "ERROR_NO_FREE_CLUSTERS" ),
|
||
// FAT filename error codes
|
||
array( 'val' => 0x31, 'text' => "ERROR_FILE_NAME_FORBIDDEN_CHAR" ),
|
||
array( 'val' => 0x32, 'text' => "ERROR_FILE_NAME_DIR_NAME_OVER_8" ),
|
||
array( 'val' => 0x33, 'text' => "ERROR_FILE_NAME_DIR_EXTENSION_OVER_3" ),
|
||
array( 'val' => 0x34, 'text' => "ERROR_FILE_NAME_FIRST_CHAR_ZERO" ),
|
||
array( 'val' => 0x35, 'text' => "ERROR_MEDIA_FULL" ),
|
||
// FAT main functions Error Codes
|
||
array( 'val' => 0x40, 'text' => "DIR_ENT_FOUND" ),
|
||
array( 'val' => 0x41, 'text' => "DIR_ENT_NOT_FOUND" ),
|
||
array( 'val' => 0x42, 'text' => "ERROR_FOLDER_IS_CORRUPTED_FIRST_CLUSTER" ),
|
||
array( 'val' => 0x43, 'text' => "ERROR_FOLDER_IS_CORRUPTED_DIR_DOT_NOT_FOUND" ),
|
||
array( 'val' => 0x44, 'text' => "ERROR_FOLDER_IS_CORRUPTED_DIR_DOTDOT_NOT_FOUND" ),
|
||
array( 'val' => 0x45, 'text' => "ERROR_ROOT_DIRECTORY_IS_FULL" ),
|
||
array( 'val' => 0x46, 'text' => "ERROR_OPEN_FOLDER_FILE" ),
|
||
array( 'val' => 0x47, 'text' => "ERROR_WRTIE_TO_READ_MODE_FILE" ),
|
||
array( 'val' => 0x48, 'text' => "ERROR_SEEK_REQUIER_READ_MODE" ),
|
||
array( 'val' => 0x49, 'text' => "ERROR_INVALID_SEEK_POINTER" ),
|
||
array( 'val' => 0x4A, 'text' => "ERROR_FOLDER_NOT_EMPTY" ),
|
||
array( 'val' => 0x4B, 'text' => "ERROR_IS_NOT_FOLDER" ),
|
||
array( 'val' => 0x4C, 'text' => "ERROR_READ_MODE_REQUIRED" ),
|
||
array( 'val' => 0x4D, 'text' => "ERROR_END_OF_DIR_LIST" ),
|
||
array( 'val' => 0x4E, 'text' => "ERROR_FILE_PARAMETERS" ),
|
||
array( 'val' => 0x4F, 'text' => "ERROR_HANDLE_IN_USE" ),
|
||
array( 'val' => 0X4F, 'text' => "ERROR_INVALID_HANDLE" ),
|
||
array( 'val' => 0x50, 'text' => "ERROR_ZERO_SIZE_FILE" ),
|
||
array( 'val' => 0x51, 'text' => "ERROR_FILE_MODE_INVALID" ),
|
||
array( 'val' => 0x52, 'text' => "ERROR_FILE_CORRUPTED" ),
|
||
array( 'val' => 0x53, 'text' => "ERROR_FILE_POINTER_OUT_OF_BOUNDS" ),
|
||
// FAT Driver
|
||
array( 'val' => 0x54, 'text' => "ERROR_ATTACH_IDE_DEVICE_RESET_TIMEOUT" ),
|
||
array( 'val' => 0x55, 'text' => "ERROR_ATTACH_IDE_DEVICE_IDENTIFY_TIMEOUT" ),
|
||
array( 'val' => 0x56, 'text' => "ERROR_READ_IDE_SECTOR_TIMEOUT" ),
|
||
array( 'val' => 0x57, 'text' => "FILE_UNKNOWN_DRIVE_LETTER" ),
|
||
// Commander Error Code
|
||
array( 'val' => 0x61, 'text' => "ERROR_COMMANDER_BAD_COMMAND" ),
|
||
array( 'val' => 0x62, 'text' => "ERROR_COMMANDER_STR_LEN_TOO_LONG" ), // or string is not null terminated
|
||
array( 'val' => 0x63, 'text' => "ERROR_COMMANDER_NAME_NOT_VALID" ),
|
||
array( 'val' => 0x64, 'text' => "ERROR_COMMANDER_NUMBER_INVALID" ),
|
||
array( 'val' => 0x65, 'text' => "ERROR_COMMANDER_WRITE_PARTIAL_FAILURE" ),
|
||
array( 'val' => 0x66, 'text' => "ERROR_COMMANDER_UNKNOWN_MEDIA_LETTER" ),
|
||
array( 'val' => 0x67, 'text' => "ERROR_COMMANDER_FAILED_TO_OPEN_MEDIA" ),
|
||
array( 'val' => 0x68, 'text' => "ERROR_COMMANDER_INCORRECT_CMD_PARAMETER" ),
|
||
array( 'val' => 0x69, 'text' => "ERROR_CHECK_SUM" ),
|
||
|
||
array( 'val' => 0xFD, 'text' => "ERROR_COMMANDER_UNKNOWN_ERROR" ),
|
||
array( 'val' => 0xFE, 'text' => "COMMANDER_RUN_FRAMED_MODE" ),
|
||
array( 'val' => 0xFF, 'text' => "COMMANDER_RETURN_IN_STRING" ),
|
||
|
||
array( 'val' => 0x70, 'text' => "USBD" ),
|
||
array( 'val' => 0x71, 'text' => "ERROR_USBD_NO_ENOUGH_PIPES" ),
|
||
array( 'val' => 0x72, 'text' => "ERROR_USBD_HANDLE_INUSE" ),
|
||
array( 'val' => 0x73, 'text' => "ERROR_USBD_INCORRECT_DESCRIPTOR" ),
|
||
array( 'val' => 0x74, 'text' => "ERROR_USBD_NONCONTROL_TRANSFER_FUNCTION" ),
|
||
array( 'val' => 0x75, 'text' => "ERROR_USBD_DATA_SIZE_IS_BIG_FOR_ENDPOINT" ),
|
||
array( 'val' => 0x76, 'text' => "ERROR_USBD_TIMEOUT" ),
|
||
array( 'val' => 0x77, 'text' => "ERROR_USBD_CONTROL_TRANSFER_REQUIERED" ),
|
||
array( 'val' => 0x78, 'text' => "ERROR_USBD_NACK" ),
|
||
array( 'val' => 0x79, 'text' => "ERROR_USBD_HANDLE_CORRUPTED" ),
|
||
array( 'val' => 0x7A, 'text' => "ERROR_USBD_DESCRIPTOR_CORRUPTED" ),
|
||
array( 'val' => 0x7B, 'text' => "ERROR_DESCRIPTOR_NOT_FOUND" ),
|
||
array( 'val' => 0x7C, 'text' => "ERROR_USB_HUB_NOT_FOUND" ),
|
||
array( 'val' => 0x7D, 'text' => "ERROR_HCD_USB_DEVICE_NOT_CONNECTED" ),
|
||
|
||
// MassStorage driver
|
||
array( 'val' => 0x80, 'text' => "ERROR_BOMS" ),
|
||
array( 'val' => 0x81, 'text' => "ERROR_BOMS_CSW_COMMAND_FAILD" ),
|
||
array( 'val' => 0x82, 'text' => "ERROR_BOMS_CSW_STATUS_PHASE_ERROR" ),
|
||
array( 'val' => 0x83, 'text' => "ERROR_BOMS_CSW" ),
|
||
array( 'val' => 0x84, 'text' => "ERROR_BOMS_WORNG_LUN_NUMBER" ),
|
||
array( 'val' => 0x85, 'text' => "ERROR_BOMS_WORNG_CSW_SIGNATURE" ),
|
||
array( 'val' => 0x86, 'text' => "ERROR_BOMS_WORNG_TAG_MISSMATCHED" ),
|
||
array( 'val' => 0x81, 'text' => "ERROR_USB_MASSSTORAGE_COMMAD_FAILED" ),
|
||
|
||
array( 'val' => 0xA0, 'text' => "ERROR_USB_MASS_STORAGE_DEVICE_NOT_READY" ),
|
||
array( 'val' => 0xA1, 'text' => "ERROR_USB_MASSSTORAGE_PROTOCOL_NOT_SUPPORTED" ),
|
||
array( 'val' => 0xA2, 'text' => "ERROR_USB_MASSSTORAGE_SUBCLASS_NOT_SUPPORTED" ),
|
||
array( 'val' => 0xA3, 'text' => "ERROR_SPC_INVALID_SENSE" ),
|
||
array( 'val' => 0xA4, 'text' => "ERROR_SPC_NO_ASC_ASCQ" ),
|
||
array( 'val' => 0xA5, 'text' => "ERROR_USB_MASSSTORAGE_NOT_FOUND" ),
|
||
|
||
array( 'val' => 0x90, 'text' => "ERROR_HCD_INIT_FAIL" ),
|
||
array( 'val' => 0x91, 'text' => "ERROR_HCD_UNDEFINED_CASE" ),
|
||
|
||
// Host error result codes, the 4 LSB's in the HRSL register.
|
||
array( 'val' => 0xB1, 'text' => "ERROR_HCD_BUSY" ),
|
||
array( 'val' => 0xB2, 'text' => "ERROR_HCD_BADREQ" ),
|
||
array( 'val' => 0xB3, 'text' => "ERROR_HCD_UNDEF" ),
|
||
array( 'val' => 0xB4, 'text' => "ERROR_HCD_NAK" ),
|
||
array( 'val' => 0xB5, 'text' => "ERROR_HCD_STALL" ),
|
||
array( 'val' => 0xB6, 'text' => "ERROR_HCD_TOGERR" ),
|
||
array( 'val' => 0xB7, 'text' => "ERROR_HCD_WRONGPID" ),
|
||
array( 'val' => 0xB8, 'text' => "ERROR_HCD_BADBC" ),
|
||
array( 'val' => 0xB9, 'text' => "ERROR_HCD_PIDERR" ),
|
||
array( 'val' => 0xBA, 'text' => "ERROR_HCD_PKTERR" ),
|
||
array( 'val' => 0xBB, 'text' => "ERROR_HCD_CRCERR" ),
|
||
array( 'val' => 0xBC, 'text' => "ERROR_HCD_KERR" ),
|
||
array( 'val' => 0xBD, 'text' => "ERROR_HCD_JERR" ),
|
||
array( 'val' => 0xBE, 'text' => "ERROR_HCD_TIMEOUT" ),
|
||
array( 'val' => 0xBF, 'text' => "ERROR_HCD_BABBLE" ),
|
||
|
||
// FLASH driver
|
||
array( 'val' => 0xD0, 'text' => "ERROR_ADDRESS_RANGE" ),
|
||
array( 'val' => 0xD1, 'text' => "ERROR_FLASH_NOT_BLANK" ),
|
||
array( 'val' => 0xD2, 'text' => "ERROR_VERIFY" ),
|
||
array( 'val' => 0xD3, 'text' => "ERROR_INTERNAL" ),
|
||
array( 'val' => 0xD4, 'text' => "ERROR_CHECKSUM" ),
|
||
array( 'val' => 0xD5, 'text' => "ERROR_ERASE_COMMAND" ),
|
||
array( 'val' => 0xD6, 'text' => "ERROR_BROKEN_ACTIVATE_SEQUENCE" ),
|
||
array( 'val' => 0xD7, 'text' => "ERROR_INVALID_FIRMWARE" ),
|
||
array( 'val' => 0xD8, 'text' => "ERROR_BR_COMMAND" ),
|
||
array( 'val' => 0xDA, 'text' => "ERROR_FILE_IS_EMPTY" ),
|
||
array( 'val' => 0xDB, 'text' => "ERROR_FILE_NOT_FOUND" ),
|
||
array( 'val' => 0xDE, 'text' => "ERROR_UNKNOWN_COMMAND" ),
|
||
|
||
array( 'val' => 0xF0, 'text' => "ERROR_UNEXPECTED_VALUE" ),
|
||
array( 'val' => 0xFD, 'text' => "ERROR_UNEXPECTED_COMMAND" )
|
||
)
|
||
)
|
||
),
|
||
),
|
||
array(
|
||
'key' => "STAT[GSM]",
|
||
'title' => "GSM-status"
|
||
),
|
||
array(
|
||
'key' => "STAT[GSM-CCED]",
|
||
'title' => "GSM cell environment"
|
||
),
|
||
array(
|
||
'key' => "STAT[GPRS]",
|
||
'title' => "GPRS-status",
|
||
'fields' => array(
|
||
'gprs[error]' => array(
|
||
'values' => array(
|
||
array( 'val' => 0, 'text' => "OK" ),
|
||
array( 'val' => -20, 'text' => "WIP_BERR_NO_DEV" ),
|
||
array( 'val' => -21, 'text' => "WIP_BERR_ALREADY" ),
|
||
array( 'val' => -22, 'text' => "WIP_BERR_NO_IF" ),
|
||
array( 'val' => -23, 'text' => "WIP_BERR_NO_HDL" ),
|
||
array( 'val' => -24, 'text' => "WIP_BERR_BAD_HDL" ),
|
||
array( 'val' => -25, 'text' => "WIP_BERR_OPTION" ),
|
||
array( 'val' => -26, 'text' => "WIP_BERR_PARAM" ),
|
||
array( 'val' => -27, 'text' => "WIP_BERR_OK_INPROGRESS" ),
|
||
array( 'val' => -28, 'text' => "WIP_BERR_BAD_STATE" ),
|
||
array( 'val' => -29, 'text' => "WIP_BERR_DEV" ),
|
||
array( 'val' => -30, 'text' => "WIP_BERR_NOT_SUPPORTED" ),
|
||
array( 'val' => -31, 'text' => "WIP_BERR_LINE_BUSY" ),
|
||
array( 'val' => -32, 'text' => "WIP_BERR_NO_ANSWER" ),
|
||
array( 'val' => -33, 'text' => "WIP_BERR_NO_CARRIER" ),
|
||
array( 'val' => -34, 'text' => "WIP_BERR_NO_SIM" ),
|
||
array( 'val' => -35, 'text' => "WIP_BERR_PIN_NOT_READY" ),
|
||
array( 'val' => -36, 'text' => "WIP_BERR_GPRS_FAILED" ),
|
||
array( 'val' => -37, 'text' => "WIP_BERR_PPP_LCP_FAILED" ),
|
||
array( 'val' => -38, 'text' => "WIP_BERR_PPP_AUTH_FAILED" ),
|
||
array( 'val' => -39, 'text' => "WIP_BERR_PPP_IPCP_FAILED" ),
|
||
array( 'val' => -40, 'text' => "WIP_BERR_PPP_LINK_FAILED" ),
|
||
array( 'val' => -41, 'text' => "WIP_BERR_PPP_TERM_REQ" ),
|
||
array( 'val' => -42, 'text' => "WIP_BERR_CALL_REFUSED" ),
|
||
array( 'val' => -43, 'text' => "WIP_BERR_NO_MEM" ),
|
||
)
|
||
)
|
||
)
|
||
),
|
||
array(
|
||
'key' => "STAT[TCP]", // DEBUG[TCP] returns mostly the same data
|
||
'title' => "TCP-status",
|
||
'fields' => array(
|
||
'tcp[status]' => array(
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "connection#"
|
||
),
|
||
1 => array(
|
||
'key' => "status",
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "internal id"
|
||
),
|
||
1 => array(
|
||
'key' => "type"
|
||
),
|
||
2 => array(
|
||
'key' => "status"
|
||
),
|
||
3 => array(
|
||
'key' => "status"
|
||
),
|
||
4 => array(
|
||
'key' => "server"
|
||
),
|
||
'w' => array(
|
||
'text' => "write (socket bytes waiting + #queued items)"
|
||
),
|
||
'r' => array(
|
||
'text' => "read (socket available bytes/size + bytes in buffer)"
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
),
|
||
//array(
|
||
// 'key' => "DEBUG[SECURE]",
|
||
// 'title' => "Parameters van de secure handshake"
|
||
//),
|
||
array(
|
||
'key' => "DEBUG[SMS]",
|
||
'title' => "SMS-status",
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "send",
|
||
'fields' => array(
|
||
0 => array( 'key' => "requests" ),
|
||
1 => array( 'key' => "messages waiting" ),
|
||
2 => array(
|
||
'key' => "sent via service centre",
|
||
'fields' => array(
|
||
0 => array( 'key' => "success" ),
|
||
1 => array( 'key' => "errors" )
|
||
)
|
||
),
|
||
3 => array(
|
||
'key' => "sent via sms-server",
|
||
'fields' => array(
|
||
0 => array( 'key' => "success" ),
|
||
1 => array( 'key' => "errors" )
|
||
)
|
||
),
|
||
)
|
||
),
|
||
1 => array(
|
||
'key' => "received",
|
||
'fields' => array(
|
||
0 => array( 'key' => "total" ),
|
||
1 => array( 'key' => "valid" )
|
||
)
|
||
)
|
||
)
|
||
),
|
||
array(
|
||
'key' => "STAT[GPS]",
|
||
'title' => "GPS-status",
|
||
'fields' => array(
|
||
'gps[mode]' => array(
|
||
'values' => array(
|
||
array( 'val' => 'A', 'text' => "autonomous" ),
|
||
array( 'val' => 'S', 'text' => "stationary" ),
|
||
array( 'val' => 'D', 'text' => "differential" ),
|
||
array( 'val' => 'E', 'text' => "estimated" ),
|
||
array( 'val' => 'I', 'text' => "init from mcu" ),
|
||
array( 'val' => 'N', 'text' => "invalid" ),
|
||
array( 'val' => 'U', 'text' => "uninitialized" )
|
||
)
|
||
),
|
||
'gps[time]' => array(
|
||
'base' => "time_t"
|
||
),
|
||
'gps[timesrc]' => array(
|
||
'values' => array(
|
||
array( 'val' => 'U', 'text' => "uninitialized" ),
|
||
array( 'val' => 'G', 'text' => "gps" ),
|
||
array( 'val' => 'M', 'text' => "init from mcu" ),
|
||
array( 'val' => 'N', 'text' => "nitz" )
|
||
)
|
||
)
|
||
)
|
||
),
|
||
array(
|
||
'key' => "STAT[GEOFENCE]",
|
||
'title' => "Geofence-status",
|
||
'fields' => array(
|
||
0 => array(
|
||
'key' => "current location inside these designs",
|
||
'callback' => "get_geofences"
|
||
)
|
||
)
|
||
)
|
||
);
|
||
|
||
// send read command
|
||
foreach( $keys as $key ) zkl_queue_retrieval($tcp_channel, $key['key']);
|
||
// fetch the data
|
||
foreach( $keys as $key ) {
|
||
$result = zkl_read_result($tcp_channel, $data, 10.0);
|
||
echo "<h3 title=\"" . htmlentities($data) . "\">" . $key['title'] . "</h3>\n";
|
||
if( $result == 0 ) {
|
||
print_item($data, $key);
|
||
}
|
||
else {
|
||
echo "<p style=\"color: red;\">Error " . $result . ": " . cp3000_error_string($tcp_channel, $result) . "</p>\n";
|
||
}
|
||
}
|
||
|
||
// close connection to TCP server
|
||
zkl_tcplogout($tcp_channel);
|
||
|
||
function tokenize($data, $metainfo)
|
||
{
|
||
$info = array();
|
||
$i = 0;
|
||
$start = 0;
|
||
$key = null;
|
||
$level = 0;
|
||
$field = 0;
|
||
|
||
while( $i < strlen($data) ) {
|
||
if( $level == 0 ) {
|
||
if( substr($data, $i, 1) == "," || substr($data, $i, 1) == ";" ) {
|
||
if( substr($data, $start, 1) == "\"" || substr($data, $start, 1) == "(" ) {
|
||
$n = $i - (++$start) - 1; // end quote or closing bracket assumed present...
|
||
}
|
||
else $n = $i - $start;
|
||
|
||
if( $key ) {
|
||
$info[$key] = array(
|
||
'data' => substr($data, $start, $n),
|
||
'info' => $metainfo[$key]
|
||
);
|
||
}
|
||
else if( $metainfo && ($key = $metainfo[$field]['key']) ) {
|
||
$info[$metainfo[$field]['key']] = array(
|
||
'data' => substr($data, $start, $n),
|
||
'info' => $metainfo[$field]
|
||
);
|
||
}
|
||
else {
|
||
$info[] = array( 'data' => substr($data, $start, $n) );
|
||
}
|
||
$start = ++$i;
|
||
$field++;
|
||
$key = null;
|
||
continue;
|
||
}
|
||
else if( substr($data, $i, 1) == "=" ) {
|
||
$key = substr($data, $start, $i - $start);
|
||
$start = ++$i;
|
||
continue;
|
||
}
|
||
}
|
||
// quoted string
|
||
if( substr($data, $i, 1) == "\"" ) {
|
||
do {
|
||
$i++;
|
||
if( substr($data, $i, 1) == "\\" ) $i++;
|
||
} while( substr($data, $i, 1) != "\"" && $i < strlen($data) );
|
||
$i++;
|
||
continue;
|
||
}
|
||
// item group
|
||
if( substr($data, $i, 1) == "(" ) {
|
||
$level++;
|
||
$i++;
|
||
continue;
|
||
}
|
||
if( substr($data, $i, 1) == ")" ) {
|
||
$level--;
|
||
$i++;
|
||
continue;
|
||
}
|
||
|
||
// default: normal char
|
||
$i++;
|
||
}
|
||
|
||
// last item
|
||
if( substr($data, $start, 1) == "\"" || substr($data, $start, 1) == "(" ) {
|
||
$n = $i - (++$start) - 1; // end quote or closing bracket assumed present...
|
||
}
|
||
else $n = $i - $start;
|
||
|
||
if( $key ) {
|
||
$info[$key] = array(
|
||
'data' => substr($data, $start, $n),
|
||
'info' => $metainfo[$key]
|
||
);
|
||
}
|
||
else if( $metainfo && ($key = $metainfo[$field]['key']) ) {
|
||
$info[$metainfo[$field]['key']] = array(
|
||
'data' => substr($data, $start, $n),
|
||
'info' => $metainfo[$field]
|
||
);
|
||
}
|
||
else {
|
||
$info[] = array( 'data' => substr($data, $start, $n) );
|
||
}
|
||
|
||
return $info;
|
||
}
|
||
|
||
function print_item($item_data, $key)
|
||
{
|
||
echo "<table class=\"DB_TABLE\">\n";
|
||
// split the raw data into tokens
|
||
$item_data = tokenize($item_data, $key['fields']);
|
||
// and print or process the tokens
|
||
foreach( $item_data as $item_key => $item ) {
|
||
echo "<tr>";
|
||
echo "<td title=\"" . htmlentities($item['data']) . "\">";
|
||
if( $item['info']['text'] ) echo $item['info']['text'];
|
||
else echo $item_key;
|
||
echo "</td>";
|
||
echo "<td title=\"" . htmlentities($item['data']) . "\">";
|
||
if( $item['info'] ) {
|
||
switch( $item['info']['base'] ) {
|
||
case 2: $item_value = intval($item['data'], 2); break;
|
||
case 8: $item_value = intval($item['data'], 8); break;
|
||
case 10: $item_value = intval($item['data'], 10); break;
|
||
case 16: $item_value = intval($item['data'], 16); break;
|
||
case 'time_t': $item_value = date("Y-m-d H:i:s", $item['data']); break;
|
||
default: $item_value = $item['data']; break;
|
||
}
|
||
|
||
$sep = "";
|
||
if( $item['info']['fields'] ) {
|
||
print_item($item['data'], $item['info']);
|
||
}
|
||
else if( $item['info']['values'] ) {
|
||
foreach( $item['info']['values'] as $values ) {
|
||
if( $values['mask'] ) {
|
||
if( ($item_value & $values['mask']) == $values['val'] ) {
|
||
echo $sep . $values['text'];
|
||
$sep = "<br>\n";
|
||
}
|
||
}
|
||
else if( $item_value == $values['val'] ) {
|
||
echo $sep . $values['text'];
|
||
$sep = "<br>\n";
|
||
}
|
||
}
|
||
}
|
||
else if( $item['info']['callback'] ) {
|
||
$data = call_user_func($item['info']['callback'], $item_value);
|
||
|
||
if( is_array($data) ) foreach( $data as $row ) {
|
||
echo $sep . $row;
|
||
$sep = "<br>\n";
|
||
}
|
||
else {
|
||
echo $sep . $data;
|
||
$sep = "<br>\n";
|
||
}
|
||
}
|
||
else {
|
||
echo $sep . $item_value;
|
||
$sep = "<br>\n";
|
||
}
|
||
}
|
||
else {
|
||
echo htmlentities($item['data']);
|
||
}
|
||
echo "</td>";
|
||
echo "</tr>\n";
|
||
}
|
||
echo "</table>\n";
|
||
}
|
||
|
||
debugreport_exit:
|
||
|
||
echo "<div align=\"right\">";
|
||
echo $zkl_info['idcode'] . "/" . $zkl_info['serienr'] . "/" . $zkl_info['id'] . "\n–\n";
|
||
echo date("Y-m-d H:i:s") . "\n";
|
||
if( $_GET['use_tz'] ) echo date("T") . "\n";
|
||
echo "</div>\n";
|
||
|
||
// Support functions
|
||
function get_geofences($designs)
|
||
{
|
||
global $db_handle;
|
||
global $zkl_info;
|
||
|
||
$result = array();
|
||
|
||
if( $designs ) {
|
||
$query = "SELECT naam ";
|
||
$query .= "FROM geofence ";
|
||
$query .= "WHERE ";
|
||
$query .= "id IN (" . $designs . ") ";
|
||
$query .= "ORDER BY id";
|
||
$mysql_result = mysql_run($query, $db_main_handle);
|
||
while( $row = mysql_fetch_assoc($mysql_result) ) array_push($result, $row['naam']);
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
// clean-up
|
||
if( $db_main_info['file'] != $db_info['file'] ) mysql_close($db_main_handle);
|
||
mysql_close($db_data_handle);
|
||
|
||
?>
|
||
</body>
|
||
</html>
|