src.dualinventive.com/mtinfo/dist/webroot/support/debugreport.php

1447 lines
77 KiB
PHP
Raw Blame History

<?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'] . " &ndash; 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>" .
"&micro;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&amp;trace" ),
array( 'mask' => 0x0010, 'val' => 0x0010, 'text' => "gps co&ouml;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&ndash;\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>