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"); } ?> Debug Report <?php echo DEBUGREPORT_VER_STR . "-" . DEBUGREPORT_DATECODE; if( isset($_GET['zkl']) ) { echo " - "; echo $_GET['zkl']; } ?> 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 "

" . $zkl_info['idcode'] . " – Debugrapportage

\n"; echo "

Device informatie

\n"; echo ""; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
Database:" . $zkl_info['id'] . "
Serienr:" . $zkl_info['serienr'] . "
ID-code:" . $zkl_info['idcode'] . "
IMEI:" . $zkl_info['imei'] . "
IMSI:" . $zkl_info['imsi'] . "
SIM-card:" . $zkl_info['sim'] . "
Telefoonnr:" . $zkl_info['telefoonnr'] . "
Firmware:" . "MCU: " . $zkl_info['mcu_versie'] . "
" . "WCPU: " . $zkl_info['wcpu_versie'] . "
" . ($zkl_info['sw3000_dversie'] ? ("Switch3000, drive: " . $zkl_info['sw3000_dversie'] . "
") : "") . ($zkl_info['sw3000_mversie'] ? ("Switch3000, measure: " . $zkl_info['sw3000_mversie'] . "
") : "") . "
Hardware:" . "ZKL: pcb-versie " . $zkl_info['pcb_versie'] . ", revisie " . $zkl_info['pcb_revisie'] . ", productienr " . $zkl_info['fabrieksnr'] . "
" . "Wavecom: firmware " . $zkl_info['wavecom_versie'] . ", hardware-revisie " . $zkl_info['wavecom_revisie'] . ", serienr " . $zkl_info['wavecom_serienr'] . "
" . "µALFAT: " . $zkl_info['ualfat_versie'] . "
Timezone:" . $zkl_info['tz'] . "
\n"; echo "

Debug-informatie

\n"; echo "

Beweeg de muis over de velden en tussenkopjes om de ruwe data te zien.

\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 "

Error: " . $error_str . "

\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 µ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]7..0", '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 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 "

" . $key['title'] . "

\n"; if( $result == 0 ) { print_item($data, $key); } else { echo "

Error " . $result . ": " . cp3000_error_string($tcp_channel, $result) . "

\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 "\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 ""; echo ""; echo ""; echo "\n"; } echo "
"; if( $item['info']['text'] ) echo $item['info']['text']; else echo $item_key; echo ""; 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 = "
\n"; } } else if( $item_value == $values['val'] ) { echo $sep . $values['text']; $sep = "
\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 = "
\n"; } else { echo $sep . $data; $sep = "
\n"; } } else { echo $sep . $item_value; $sep = "
\n"; } } else { echo htmlentities($item['data']); } echo "
\n"; } debugreport_exit: echo "
"; 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 "
\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); ?>