Loading src/read_imu_log.php +225 −58 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,58 @@ * Copyright (C) 2016 Elphel, Inc. * Copyright (C) 2016 Elphel, Inc. */ */ set_time_limit(0); $CLI = (php_sapi_name()=="cli"); if ($CLI){ $_SERVER['REMOTE_ADDR'] = "localhost"; $_SERVER['SERVER_ADDR'] = "localhost"; $_GET['format'] = "csv"; $_GET['nth'] = 1; $_GET['limit'] = -1; $_GET['nogui'] = true; if (isset($argv[1])) $_GET['file'] = $argv[1]; else{ die(<<<TEXT \033[91mERROR: Filename is not set.\033[0m Command line usage examples: * Minimal: \033[1;37m~$ php thisscript.php logfile > logfile.csv\033[0m * With a filter, IMU records only: \033[1;37m~~$ php thisscript.php logfile 0x010 > logfile.csv\033[0m * With a filter, GPS NMEA GPRMC records ony: \033[1;37m~~$ php thisscript.php logfile 0x001 > logfile.csv\033[0m * Filter bits: External trigger source: 0x200 Image records: 0x100 channel 3 0x080 channel 2 0x040 channel 1 0x020 channel 0 IMU: 0x010 GPS records: 0x008 - NMEA GPVTG 0x004 - NMEA GPGSA 0x002 - NMEA GPGGA (have coordinates) 0x001 - NMEA GPRMC (have coordinates) TEXT ); } $_GET['record'] = 0; } $thisname = basename($_SERVER['SCRIPT_NAME']); $remoteaccess = ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']); $hardcodeddir = "logs"; $hardcodeddir = "logs"; if (isset($_GET['format'])){ if (isset($_GET['format'])){ Loading @@ -16,15 +68,30 @@ if (isset($_GET['format'])){ $format = "html"; $format = "html"; } } if (isset($_GET['nth'])){ $nth = $_GET['nth']+0; }else{ $nth = 1; } if (isset($_GET['limit'])){ if (isset($_GET['limit'])){ $limit = $_GET['limit']+0; $limit = $_GET['limit']+0; }else{ }else{ $limit = 0; $limit = -1; } } if (isset($_GET['nogui'])){ if (isset($_GET['nogui'])){ $nogui = true; $nogui = true; if ($format=="csv"){ header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename='.basename($_GET['file']).".".$format); }else{ }else{ header("Content-Type: application/xml"); echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; echo "<Document>\n"; } }else{ //header("Content-Type: text/xml"); $nogui = false; $nogui = false; } } Loading @@ -39,7 +106,7 @@ if (isset($_GET['list'])){ } } if (isset($_GET['file'])){ if (isset($_GET['file'])){ if ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']){ if ($remoteaccess){ $file = $hardcodeddir."/".basename($_GET['file']); $file = $hardcodeddir."/".basename($_GET['file']); }else{ }else{ $file = $_GET['file']; $file = $_GET['file']; Loading @@ -48,7 +115,7 @@ if (isset($_GET['file'])){ if (is_file($file)){ if (is_file($file)){ $numRecordsInFile=filesize($file)/64; $numRecordsInFile=filesize($file)/64; }else{ }else{ //this is for $_SERVER['REMOTE_ADDR']==$_SERVER['SERVER_ADDR'] //for local access also check $hardcodeddir if (is_file($hardcodeddir."/".$file)){ if (is_file($hardcodeddir."/".$file)){ $file = $hardcodeddir."/".$file; $file = $hardcodeddir."/".$file; $numRecordsInFile=filesize($file)/64; $numRecordsInFile=filesize($file)/64; Loading @@ -62,6 +129,11 @@ if (isset($_GET['file'])){ $init = false; $init = false; } } if ($CLI){ $_GET['nrecords'] = $numRecordsInFile; if (isset($argv[2])) $_GET['filter'] = $argv[2]; } if (isset($_GET['record'])) $record = $_GET['record']+0; if (isset($_GET['record'])) $record = $_GET['record']+0; else $record=0; else $record=0; Loading @@ -79,6 +151,11 @@ if ($nRecords>($numRecordsInFile-$record)) $nRecords= $numRecordsInFile-$record; if ($limit>0) $nRecords= $numRecordsInFile; if ($limit>0) $nRecords= $numRecordsInFile; if (isset($_GET['showall'])){ $limit = $numRecordsInFile; $nRecords= $numRecordsInFile; } if (isset($_GET['filter'])) $filter= intval($_GET['filter'],0); if (isset($_GET['filter'])) $filter= intval($_GET['filter'],0); else $filter= 0x3ff; else $filter= 0x3ff; Loading @@ -92,6 +169,8 @@ else $filter= 0x3ff; 64 - ODOMETER (type 3) 64 - ODOMETER (type 3) */ */ if ($limit<0) $limit = $nRecords; if(!$nogui){ if(!$nogui){ //list available files //list available files echo html(); echo html(); Loading @@ -109,9 +188,10 @@ $sindex = $record; $eindex = $record+$nRecords; $eindex = $record+$nRecords; if ($format=="csv"){ if ($format=="csv"){ echo "<pre>Filename,$file\n"; echo "Filename,$file\n"; echo "Found Records,$numRecordsInFile\n"; echo "Found Records,$numRecordsInFile\n"; echo "Record filter,0x$filterhex\n"; echo "Record filter,0x$filterhex\n"; echo "Show limit, $limit\n"; echo "Start index,$sindex\n"; echo "Start index,$sindex\n"; echo "End index,$eindex\n\n"; echo "End index,$eindex\n\n"; }else{ }else{ Loading @@ -120,6 +200,7 @@ if ($format=="csv"){ <tr><td>Filename</td><td>$file</td></tr> <tr><td>Filename</td><td>$file</td></tr> <tr><td>Found records</td><td>$numRecordsInFile</td></tr> <tr><td>Found records</td><td>$numRecordsInFile</td></tr> <tr><td>Filter</td><td>$filterhex</td></tr> <tr><td>Filter</td><td>$filterhex</td></tr> <tr><td>Show limit</td><td>$limit</td></tr> <tr><td>Start index</td><td>$sindex</td></tr> <tr><td>Start index</td><td>$sindex</td></tr> <tr><td>End index</td><td>$eindex</td></tr> <tr><td>End index</td><td>$eindex</td></tr> </table> </table> Loading Loading @@ -164,6 +245,25 @@ imuLogParse($log_file,$record,$nRecords,$filter); die(0); die(0); $gc = array( array(0,0,0,0), array(0,0,0,0), array(0,0,0,0), array(0,0,0,0) ); function global_counters($i,$j){ global $gc, $nth; if (($gc[$i][$j]%$nth)==0) { $gc[$i][$j] = 1; return true; }else{ $gc[$i][$j]++; return false; } } function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ global $timeShift; global $timeShift; Loading @@ -171,16 +271,21 @@ function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ global $imuFieldOrder; global $imuFieldOrder; global $format,$limit; global $format,$limit; $gpsFilter= $filter&0xf; global $gc; $typeFilter=(($gpsFilter!=0)?2:0) | ((($filter&0x10)!=0)?1:0) | ((($filter&0x20)!=0)?4:0) | ((($filter&0x20)!=0)?8:0); $gpsFilter = ($filter)&0xf; //type=1 $imuFilter = ($filter>>4)&0x1; //type=0 $imgFilter = ($filter>>5)&0xf; //type=2 $extFilter = ($filter>>9)&0x1; //type=3 $typeFilter = (($gpsFilter!=0)?2:0) | (($imuFilter!=0)?1:0) | ((($imgFilter)!=0)?4:0) | ((($extFilter)!=0)?8:0); $skip_imu_cols = true; $skip_imu_cols = true; $imu_cols_csv = ""; $imu_cols_csv = ""; $imu_cols_html_header = ""; $imu_cols_html_header = ""; $imu_cols_html = ""; $imu_cols_html = ""; if ((($filter>>4)&0x1)==0x1) { if ($imuFilter==0x1) { $skip_imu_cols = false; $skip_imu_cols = false; $imu_cols_csv_header = implode(",",$imuFieldOrder).","; $imu_cols_csv_header = implode(",",$imuFieldOrder).","; for($i=0;$i<count($imuFieldOrder);$i++){ for($i=0;$i<count($imuFieldOrder);$i++){ Loading Loading @@ -212,22 +317,43 @@ TEXT; echo "</tr>\n"; echo "</tr>\n"; } } $gc = array( array(0,0,0,0), array(0,0,0,0), array(0,0,0,0), array(0,0,0,0) ); for ($nSample=0;$nSample<$nSamples;$nSample++) { for ($nSample=0;$nSample<$nSamples;$nSample++) { $sample=fread($handle,64); $sample=fread($handle,64); $arr32=unpack('L*',$sample); $arr32=unpack('L*',$sample); $time=(($arr32[1]&0xfffff)/1000000)+$arr32[2]; $time=(($arr32[1]&0xfffff)/1000000)+$arr32[2]; $type=$arr32[1]>>24; $gps=($type==1)?($arr32[3]&0x3):0xf; // any if it is not GPS sample if ((((1<<$type)&$typeFilter)!=0) && (($type!=1) || (((1<<$gps)&$gpsFilter)!=0))) { $type=$arr32[1]>>24; $limit--; $show_record = false; if ($limit==-1){ switch($type){ case 0: if ($imuFilter!=0) $show_record = global_counters($type,0); break; case 1: if ((($gpsFilter>>($arr32[3]&0x3))&1)==1) $show_record = global_counters($type,$arr32[3]&0x3); break; case 2: $subchannel = ($arr32[3] >> 24); if ((($imgFilter>>$subchannel)&1)==1) $show_record = global_counters($type,$subchannel); break; case 3: if (($extFilter&1)==1) $show_record = global_counters($type,0); break; break; } } if ($show_record) { $limit--; if ($limit==-1) break; //beginning if ($format=="csv"){ if ($format=="csv"){ printf("%d,%f,$type,",($record+$nSample),$time); printf("%d,%f,$type,",($record+$nSample),$time); }else{ }else{ Loading Loading @@ -284,8 +410,8 @@ TEXT; // Master (Sync) record // Master (Sync) record case 2: case 2: $masterTime=(($arr32[3]&0xfffff)/1000000)+$arr32[4]; $subchannel = ($arr32[3] >> 24); $subchannel = ($arr32[3] >> 24); $masterTime=(($arr32[3]&0xfffff)/1000000)+$arr32[4]; if ($format=="csv"){ if ($format=="csv"){ printf("$imu_cols_csv$subchannel,%f,".(gmdate(DATE_RFC850,$masterTime))."\n",$masterTime); printf("$imu_cols_csv$subchannel,%f,".(gmdate(DATE_RFC850,$masterTime))."\n",$masterTime); Loading @@ -297,8 +423,6 @@ TEXT; printf("<td>%f</td>\n",$masterTime); printf("<td>%f</td>\n",$masterTime); echo "<td>".gmdate(DATE_RFC850,$masterTime)."</td>\n"; echo "<td>".gmdate(DATE_RFC850,$masterTime)."</td>\n"; } } break; break; // Show hex data // Show hex data Loading @@ -323,6 +447,7 @@ TEXT; } } if ($format!="csv"){ if ($format!="csv"){ echo "</table>\n"; echo "</table>\n"; echo "</Document>\n"; } } } } Loading Loading @@ -513,14 +638,14 @@ eg3. $GPVTG,t,T,,,s.ss,N,s.ss,K*hh function showlist(){ function showlist(){ global $hardcodeddir; global $hardcodeddir; global $remoteaccess; $local = true; $local = true; if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['file'])) $file = $_GET['file']; if ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']){ if ($remoteaccess){ $dir = $hardcodeddir; $dir = $hardcodeddir; $local = false; }else{ }else{ if (!isset($file)||($file=="")){ if (!isset($file)||($file=="")){ $dir = "."; $dir = "."; Loading @@ -540,7 +665,7 @@ function showlist(){ $files = scandir($dir); $files = scandir($dir); if ($dir=="."||(!$local)) $dirlink=""; if ($dir=="."||($remoteaccess)) $dirlink=""; else $dirlink="$dir/"; else $dirlink="$dir/"; $res = ""; $res = ""; Loading @@ -562,19 +687,29 @@ function showlist(){ function html(){ function html(){ global $file,$limit,$record,$nRecords; global $file,$limit,$record,$nRecords,$filter,$nth; global $init; global $init; $ins_filter = array(); if ($init) { if ($init) { $ins_file = $file; $ins_file = $file; $ins_limit = $limit; $ins_limit = $limit; $ins_rec = $record; $ins_rec = $record; $ins_nrec = $_GET['nrecords']+$record; $ins_nrec = $_GET['nrecords']+$record; for($i=0;$i<10;$i++){ if (($filter>>$i)&1==1) $ins_filter[$i] = "checked"; } $ins_nth = $nth; }else{ }else{ $ins_file = "imu.log"; $ins_file = "imu.log"; $ins_limit = 5000; $ins_limit = 500; $ins_rec = 0; $ins_rec = 0; $ins_nrec = 5000; $ins_nrec = 5000; for($i=0;$i<10;$i++){ $ins_filter[$i] = "checked"; } $ins_nth = 1; } } $js = js(); $js = js(); Loading Loading @@ -610,22 +745,22 @@ function html(){ <tr> <tr> <td colspan=''>Record filter: <td colspan=''>Record filter: <span title='External device'>EXT <span title='External device'>EXT <input id='filter_9' type='checkbox' checked onchange='getRqStr()'> <input id='filter_9' type='checkbox' {$ins_filter[9]} onchange='getRqStr()' title='External source'> </span> </span> <span title='Image trigger signal'>IMG <span title='Image trigger signal'>IMG <input id='filter_8' type='checkbox' checked onchange='getRqStr()' title='Sensor port 3'> <input id='filter_8' type='checkbox' {$ins_filter[8]} onchange='getRqStr()' title='Sensor port 3'> <input id='filter_7' type='checkbox' checked onchange='getRqStr()' title='Sensor port 2'> <input id='filter_7' type='checkbox' {$ins_filter[7]} onchange='getRqStr()' title='Sensor port 2'> <input id='filter_6' type='checkbox' checked onchange='getRqStr()' title='Sensor port 1'> <input id='filter_6' type='checkbox' {$ins_filter[6]} onchange='getRqStr()' title='Sensor port 1'> <input id='filter_5' type='checkbox' checked onchange='getRqStr()' title='Sensor port 0'> <input id='filter_5' type='checkbox' {$ins_filter[5]} onchange='getRqStr()' title='Sensor port 0'> </span> </span> <span title='IMU'>IMU <span title='IMU'>IMU <input id='filter_4' type='checkbox' checked onchange='getRqStr()'> <input id='filter_4' type='checkbox' {$ins_filter[4]} onchange='getRqStr()'> </span> </span> <span title='GPS'>GPS <span title='GPS'>GPS <input id='filter_3' type='checkbox' checked onchange='getRqStr()' title='NMEA GPVTG'> <input id='filter_3' type='checkbox' {$ins_filter[3]} onchange='getRqStr()' title='NMEA GPVTG'> <input id='filter_2' type='checkbox' checked onchange='getRqStr()' title='NMEA GPGSA'> <input id='filter_2' type='checkbox' {$ins_filter[2]} onchange='getRqStr()' title='NMEA GPGSA'> <input id='filter_1' type='checkbox' checked onchange='getRqStr()' title='NMEA GPGGA'> <input id='filter_1' type='checkbox' {$ins_filter[1]} onchange='getRqStr()' title='NMEA GPGGA'> <input id='filter_0' type='checkbox' checked onchange='getRqStr()' title='NMEA GPRMC'> <input id='filter_0' type='checkbox' {$ins_filter[0]} onchange='getRqStr()' title='NMEA GPRMC'> </span> </span> </td> </td> </tr> </tr> Loading @@ -640,14 +775,19 @@ function html(){ <td></td> <td></td> <td>End</td><td><input id='end' type='text' value='$ins_nrec' style='width:100px;text-align:right;' onchange='getRqStr()'></td> <td>End</td><td><input id='end' type='text' value='$ins_nrec' style='width:100px;text-align:right;' onchange='getRqStr()'></td> </tr> </tr> <tr> <td><input type='checkbox' id='show_limit_toggle' checked onchange='getRqStr()'></td> <td><input type='checkbox' id='show_limit_toggle' checked onchange='getRqStr()'></td> <td>Show limit</td><td><input id='limit' type='text' value='$ins_limit' style='width:100px;text-align:right;' onchange='getRqStr()'></td> <td>Show limit</td><td><input id='limit' type='text' value='$ins_limit' style='width:100px;text-align:right;' onchange='getRqStr()'></td> </tr> </tr> <tr> <td><input type='checkbox' id='show_nth_toggle' checked onchange='getRqStr()'></td> <td>Show every</td><td><input id='nth' type='text' value='$ins_nth' style='width:100px;text-align:right;' onchange='getRqStr()'> <sup>th</sup> record</td> </tr> </table> </table> </td> </td> </tr> </tr> <tr> <tr> <td><button onclick='show()'>Show records</button> <span id='csvlink'></span></td> <td><button onclick='show()'>Show records</button> <span id='csvlink'></span><span id='csvlink2'></span></td> </tr> </tr> </table> </table> </td> </td> Loading @@ -660,6 +800,7 @@ TEXT; } } function js(){ function js(){ global $thisname; global $init; global $init; if ($init) $insert = "show();"; if ($init) $insert = "show();"; Loading @@ -678,8 +819,6 @@ function init(){ function show(){ function show(){ console.log("show"); console.log("show"); report("status: waiting for response"); var rqstr = getRqStr(); var rqstr = getRqStr(); var request = new XMLHttpRequest(); var request = new XMLHttpRequest(); Loading @@ -688,10 +827,8 @@ function show(){ request.onreadystatechange = function() { request.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && this.status == 200) { var resp = this.responseText; var resp = this.responseText; report("status: parsing response"); clearInterval(loading_interval); clearInterval(loading_interval); document.getElementById("results").innerHTML = "<br/>"+resp; document.getElementById("results").innerHTML = "<br/>"+resp; report("<a href='"+rqstr+"'>current view</a>, <a href='"+rqstr+"&nogui"+"&format=csv"+"'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=html"+"'>html</a>"); } } }; }; Loading @@ -706,7 +843,7 @@ function show(){ function getList(){ function getList(){ var filename = document.getElementById("file").value; var filename = document.getElementById("file").value; var rqstr = "read_imu_log.php?list&nogui&file="+filename; var rqstr = "$thisname?list&nogui&file="+filename; var request = new XMLHttpRequest(); var request = new XMLHttpRequest(); request.open('GET', rqstr, true); request.open('GET', rqstr, true); Loading @@ -731,7 +868,7 @@ function getRqStr(){ var filename = document.getElementById("file").value; var filename = document.getElementById("file").value; var filter = 0; var filter = 0; for(var i=0;i<7;i++){ for(var i=0;i<10;i++){ bit = (document.getElementById("filter_"+i).checked)?1:0; bit = (document.getElementById("filter_"+i).checked)?1:0; filter += (bit<<i); filter += (bit<<i); } } Loading @@ -745,6 +882,12 @@ function getRqStr(){ limit = "&limit="+document.getElementById("limit").value; limit = "&limit="+document.getElementById("limit").value; } } var nth = ""; if (document.getElementById("show_nth_toggle").checked){ nth = "&nth="+document.getElementById("nth").value; } var n = end - start; var n = end - start; if (n<0) { if (n<0) { Loading @@ -752,11 +895,11 @@ function getRqStr(){ n = 1; n = 1; } } var rqstr = "read_imu_log.php?file="+filename+"&record="+start+"&nrecords="+n+"&filter="+filter+limit; var rqstr = "$thisname?file="+filename+"&record="+start+"&nrecords="+n+"&filter="+filter+limit+nth; report(""); report(""); setTimeout(function(){ setTimeout(function(){ report("<a href='"+rqstr+"'>current view</a>, <a href='"+rqstr+"&nogui"+"&format=csv"+"'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=html"+"'>html</a>"); report("<a href='"+rqstr+"'>share</a>, Download: <a href='"+rqstr+"&nogui"+"&format=csv'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=csv&showall'>full csv</a>"); },100); },100); return rqstr; return rqstr; Loading Loading @@ -798,22 +941,28 @@ var loading_interval; function loading(){ function loading(){ console.log("loading"); console.log("loading"); var tmp = document.getElementById("csvlink").innerHTML; var tmp = document.getElementById("csvlink2").innerHTML; if (tmp.length<2) tmp += "."; if (tmp.length<2) tmp += "."; else tmp = ""; else tmp = ""; document.getElementById("csvlink").innerHTML = tmp; document.getElementById("csvlink2").innerHTML = tmp; } } TEXT; TEXT; } } function help(){ function help(){ global $thisname; global $nogui; global $nogui; $logslist = showlist(); $logslist = showlist(); $help = <<<TEXT $help = <<<TEXT <span style='font-size:1.2em;'>$logslist</span> <span style='font-size:1.2em;'>$logslist</span> <div style='font-size:1.2em;'>Source: <ul> <li><a href="?source" >This program source</a></li> </ul> </div> <div style='font-size:1.2em;'>Usage: <div style='font-size:1.2em;'>Usage: <ul> <ul> <li>GUI: <li>GUI: Loading @@ -822,39 +971,57 @@ function help(){ <i>remote != server address</i> - http://thisscriptrootpath/logs/filename<br/> <i>remote != server address</i> - http://thisscriptrootpath/logs/filename<br/> <i>remote == server address</i> - any relative/absolute path <i>remote == server address</i> - any relative/absolute path </li> </li> <li><b>Checkboxes</b> - checked = show</li> <li><b>Record filter checkboxes</b> - checked = show</li> <li><b>Begin</b> - offset, record index in log</li> <li><b>Begin</b> - offset, record index in log</li> <li><b>End</b> - offset, record index in log</li> <li><b>End</b> - offset, record index in log</li> <li><b>Show limit</b> - Number of filtered records to show, if enabled overrides <b>End</b></li> <li><b>Show limit</b> - Number of filtered records to show, if enabled overrides <b>End</b></li> <li><b>current view, csv, html</b> - if any parameter changed a link to csv or html data is created/updated</li> <li><button onclick='getList()'>List log files</button> : <ul> <li>remote access - list of files in <b>http://thisscriptrootpath/logs/</b></li> <li>local access - list of files in <b>http://thisscriptrootpath/</b></li> </ul> <button onclick='show()'>Show records</button> - after a file is selected.<br/> If a folder is selected - <button onclick='getList()'>List log files</button> again to scan inside. </li> <li><a href='#'>share</a> - open this page with the same parameters (auto <b>show records</b>)</li> <li><a href='#'>csv</a> - download csv: filter + limit</li> <li><a href='#'>csv full</a> - download csv: filter + no limit</li> </ul> </ul> </li> </li> <br/> <br/> <li>URL (see <b><i>current view, csv, html</i></b>): <li>URL (see <b>share</b>,<b>csv</b>,<b>csv full</b>): <ul> <ul> <li> <li> <b>http://thisscriptrootpath/read_imu_log.php?file=..&record=..&nrecords=..&filter=..&limit=..&format=..</b><br/> <b>http://thisscriptrootpath/$thisname?file=..&record=..&nrecords=..&filter=..&limit=..&format=..</b><br/> <b>file</b> - with path<br/> <b>file</b> - with path<br/> <b>format</b> - accepts 'csv' or 'html'<br/> <b>format</b> - accepts 'csv' or 'html'<br/> <b>limit</b> - limit the displayed records<br/> <b>limit</b> - limit the displayed records<br/> <b>record</b> - starting record index, default = 0<br/> <b>record</b> - starting record index, default = 0<br/> <b>nrecords</b> - number of records to parse, default = 5000<br/> <b>nrecords</b> - number of records to parse, default = 5000<br/> <b>filter</b> - filter out types of displayed records:<br/> <b>filter</b> - filter out types of displayed records:<br/> 0x40 - display external trigger records only<br/> 0x200 - display external trigger records only<br/> 0x20 - display image records only<br/> 0x100 - display image records, channel 3 only<br/> 0x10 - display imu records only<br/> 0x080 - display image records, channel 2 only<br/> 0x040 - display image records, channel 1 only<br/> 0x020 - display image records, channel 0 only<br/> 0x010 - display imu records only<br/> for gps records:<br/> for gps records:<br/> 0x08 - display NMEA GPVTG records,<br/> 0x008 - display NMEA GPVTG records,<br/> 0x04 - display NMEA GPGSA records<br/> 0x004 - display NMEA GPGSA records<br/> 0x02 - display NMEA GPGGA records (have coordinates)<br/> 0x002 - display NMEA GPGGA records (have coordinates)<br/> 0x01 - display NMEA GPRMC records (have coordinates)<br/> 0x001 - display NMEA GPRMC records (have coordinates)<br/> default = 0x7f (display everything)<br/> default = 0x7f (display everything)<br/> </li> </li> </ul> </ul> </li> </li> <li><a href="?source" >PHP source</a></li> <li>Command line: <ul> <li><i>~$ php $thisname logfile filter [filter] > output.csv</i></li> </ul> </li> </ul> </ul> </div> </div> <br/><br/><br/> TEXT; TEXT; if (!$nogui) $help = "`<br/>$help`"; if (!$nogui) $help = "`<br/>$help`"; Loading Loading
src/read_imu_log.php +225 −58 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,58 @@ * Copyright (C) 2016 Elphel, Inc. * Copyright (C) 2016 Elphel, Inc. */ */ set_time_limit(0); $CLI = (php_sapi_name()=="cli"); if ($CLI){ $_SERVER['REMOTE_ADDR'] = "localhost"; $_SERVER['SERVER_ADDR'] = "localhost"; $_GET['format'] = "csv"; $_GET['nth'] = 1; $_GET['limit'] = -1; $_GET['nogui'] = true; if (isset($argv[1])) $_GET['file'] = $argv[1]; else{ die(<<<TEXT \033[91mERROR: Filename is not set.\033[0m Command line usage examples: * Minimal: \033[1;37m~$ php thisscript.php logfile > logfile.csv\033[0m * With a filter, IMU records only: \033[1;37m~~$ php thisscript.php logfile 0x010 > logfile.csv\033[0m * With a filter, GPS NMEA GPRMC records ony: \033[1;37m~~$ php thisscript.php logfile 0x001 > logfile.csv\033[0m * Filter bits: External trigger source: 0x200 Image records: 0x100 channel 3 0x080 channel 2 0x040 channel 1 0x020 channel 0 IMU: 0x010 GPS records: 0x008 - NMEA GPVTG 0x004 - NMEA GPGSA 0x002 - NMEA GPGGA (have coordinates) 0x001 - NMEA GPRMC (have coordinates) TEXT ); } $_GET['record'] = 0; } $thisname = basename($_SERVER['SCRIPT_NAME']); $remoteaccess = ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']); $hardcodeddir = "logs"; $hardcodeddir = "logs"; if (isset($_GET['format'])){ if (isset($_GET['format'])){ Loading @@ -16,15 +68,30 @@ if (isset($_GET['format'])){ $format = "html"; $format = "html"; } } if (isset($_GET['nth'])){ $nth = $_GET['nth']+0; }else{ $nth = 1; } if (isset($_GET['limit'])){ if (isset($_GET['limit'])){ $limit = $_GET['limit']+0; $limit = $_GET['limit']+0; }else{ }else{ $limit = 0; $limit = -1; } } if (isset($_GET['nogui'])){ if (isset($_GET['nogui'])){ $nogui = true; $nogui = true; if ($format=="csv"){ header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename='.basename($_GET['file']).".".$format); }else{ }else{ header("Content-Type: application/xml"); echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; echo "<Document>\n"; } }else{ //header("Content-Type: text/xml"); $nogui = false; $nogui = false; } } Loading @@ -39,7 +106,7 @@ if (isset($_GET['list'])){ } } if (isset($_GET['file'])){ if (isset($_GET['file'])){ if ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']){ if ($remoteaccess){ $file = $hardcodeddir."/".basename($_GET['file']); $file = $hardcodeddir."/".basename($_GET['file']); }else{ }else{ $file = $_GET['file']; $file = $_GET['file']; Loading @@ -48,7 +115,7 @@ if (isset($_GET['file'])){ if (is_file($file)){ if (is_file($file)){ $numRecordsInFile=filesize($file)/64; $numRecordsInFile=filesize($file)/64; }else{ }else{ //this is for $_SERVER['REMOTE_ADDR']==$_SERVER['SERVER_ADDR'] //for local access also check $hardcodeddir if (is_file($hardcodeddir."/".$file)){ if (is_file($hardcodeddir."/".$file)){ $file = $hardcodeddir."/".$file; $file = $hardcodeddir."/".$file; $numRecordsInFile=filesize($file)/64; $numRecordsInFile=filesize($file)/64; Loading @@ -62,6 +129,11 @@ if (isset($_GET['file'])){ $init = false; $init = false; } } if ($CLI){ $_GET['nrecords'] = $numRecordsInFile; if (isset($argv[2])) $_GET['filter'] = $argv[2]; } if (isset($_GET['record'])) $record = $_GET['record']+0; if (isset($_GET['record'])) $record = $_GET['record']+0; else $record=0; else $record=0; Loading @@ -79,6 +151,11 @@ if ($nRecords>($numRecordsInFile-$record)) $nRecords= $numRecordsInFile-$record; if ($limit>0) $nRecords= $numRecordsInFile; if ($limit>0) $nRecords= $numRecordsInFile; if (isset($_GET['showall'])){ $limit = $numRecordsInFile; $nRecords= $numRecordsInFile; } if (isset($_GET['filter'])) $filter= intval($_GET['filter'],0); if (isset($_GET['filter'])) $filter= intval($_GET['filter'],0); else $filter= 0x3ff; else $filter= 0x3ff; Loading @@ -92,6 +169,8 @@ else $filter= 0x3ff; 64 - ODOMETER (type 3) 64 - ODOMETER (type 3) */ */ if ($limit<0) $limit = $nRecords; if(!$nogui){ if(!$nogui){ //list available files //list available files echo html(); echo html(); Loading @@ -109,9 +188,10 @@ $sindex = $record; $eindex = $record+$nRecords; $eindex = $record+$nRecords; if ($format=="csv"){ if ($format=="csv"){ echo "<pre>Filename,$file\n"; echo "Filename,$file\n"; echo "Found Records,$numRecordsInFile\n"; echo "Found Records,$numRecordsInFile\n"; echo "Record filter,0x$filterhex\n"; echo "Record filter,0x$filterhex\n"; echo "Show limit, $limit\n"; echo "Start index,$sindex\n"; echo "Start index,$sindex\n"; echo "End index,$eindex\n\n"; echo "End index,$eindex\n\n"; }else{ }else{ Loading @@ -120,6 +200,7 @@ if ($format=="csv"){ <tr><td>Filename</td><td>$file</td></tr> <tr><td>Filename</td><td>$file</td></tr> <tr><td>Found records</td><td>$numRecordsInFile</td></tr> <tr><td>Found records</td><td>$numRecordsInFile</td></tr> <tr><td>Filter</td><td>$filterhex</td></tr> <tr><td>Filter</td><td>$filterhex</td></tr> <tr><td>Show limit</td><td>$limit</td></tr> <tr><td>Start index</td><td>$sindex</td></tr> <tr><td>Start index</td><td>$sindex</td></tr> <tr><td>End index</td><td>$eindex</td></tr> <tr><td>End index</td><td>$eindex</td></tr> </table> </table> Loading Loading @@ -164,6 +245,25 @@ imuLogParse($log_file,$record,$nRecords,$filter); die(0); die(0); $gc = array( array(0,0,0,0), array(0,0,0,0), array(0,0,0,0), array(0,0,0,0) ); function global_counters($i,$j){ global $gc, $nth; if (($gc[$i][$j]%$nth)==0) { $gc[$i][$j] = 1; return true; }else{ $gc[$i][$j]++; return false; } } function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ global $timeShift; global $timeShift; Loading @@ -171,16 +271,21 @@ function imuLogParse($handle,$record,$nSamples,$filter,$tryNumber=10000){ global $imuFieldOrder; global $imuFieldOrder; global $format,$limit; global $format,$limit; $gpsFilter= $filter&0xf; global $gc; $typeFilter=(($gpsFilter!=0)?2:0) | ((($filter&0x10)!=0)?1:0) | ((($filter&0x20)!=0)?4:0) | ((($filter&0x20)!=0)?8:0); $gpsFilter = ($filter)&0xf; //type=1 $imuFilter = ($filter>>4)&0x1; //type=0 $imgFilter = ($filter>>5)&0xf; //type=2 $extFilter = ($filter>>9)&0x1; //type=3 $typeFilter = (($gpsFilter!=0)?2:0) | (($imuFilter!=0)?1:0) | ((($imgFilter)!=0)?4:0) | ((($extFilter)!=0)?8:0); $skip_imu_cols = true; $skip_imu_cols = true; $imu_cols_csv = ""; $imu_cols_csv = ""; $imu_cols_html_header = ""; $imu_cols_html_header = ""; $imu_cols_html = ""; $imu_cols_html = ""; if ((($filter>>4)&0x1)==0x1) { if ($imuFilter==0x1) { $skip_imu_cols = false; $skip_imu_cols = false; $imu_cols_csv_header = implode(",",$imuFieldOrder).","; $imu_cols_csv_header = implode(",",$imuFieldOrder).","; for($i=0;$i<count($imuFieldOrder);$i++){ for($i=0;$i<count($imuFieldOrder);$i++){ Loading Loading @@ -212,22 +317,43 @@ TEXT; echo "</tr>\n"; echo "</tr>\n"; } } $gc = array( array(0,0,0,0), array(0,0,0,0), array(0,0,0,0), array(0,0,0,0) ); for ($nSample=0;$nSample<$nSamples;$nSample++) { for ($nSample=0;$nSample<$nSamples;$nSample++) { $sample=fread($handle,64); $sample=fread($handle,64); $arr32=unpack('L*',$sample); $arr32=unpack('L*',$sample); $time=(($arr32[1]&0xfffff)/1000000)+$arr32[2]; $time=(($arr32[1]&0xfffff)/1000000)+$arr32[2]; $type=$arr32[1]>>24; $gps=($type==1)?($arr32[3]&0x3):0xf; // any if it is not GPS sample if ((((1<<$type)&$typeFilter)!=0) && (($type!=1) || (((1<<$gps)&$gpsFilter)!=0))) { $type=$arr32[1]>>24; $limit--; $show_record = false; if ($limit==-1){ switch($type){ case 0: if ($imuFilter!=0) $show_record = global_counters($type,0); break; case 1: if ((($gpsFilter>>($arr32[3]&0x3))&1)==1) $show_record = global_counters($type,$arr32[3]&0x3); break; case 2: $subchannel = ($arr32[3] >> 24); if ((($imgFilter>>$subchannel)&1)==1) $show_record = global_counters($type,$subchannel); break; case 3: if (($extFilter&1)==1) $show_record = global_counters($type,0); break; break; } } if ($show_record) { $limit--; if ($limit==-1) break; //beginning if ($format=="csv"){ if ($format=="csv"){ printf("%d,%f,$type,",($record+$nSample),$time); printf("%d,%f,$type,",($record+$nSample),$time); }else{ }else{ Loading Loading @@ -284,8 +410,8 @@ TEXT; // Master (Sync) record // Master (Sync) record case 2: case 2: $masterTime=(($arr32[3]&0xfffff)/1000000)+$arr32[4]; $subchannel = ($arr32[3] >> 24); $subchannel = ($arr32[3] >> 24); $masterTime=(($arr32[3]&0xfffff)/1000000)+$arr32[4]; if ($format=="csv"){ if ($format=="csv"){ printf("$imu_cols_csv$subchannel,%f,".(gmdate(DATE_RFC850,$masterTime))."\n",$masterTime); printf("$imu_cols_csv$subchannel,%f,".(gmdate(DATE_RFC850,$masterTime))."\n",$masterTime); Loading @@ -297,8 +423,6 @@ TEXT; printf("<td>%f</td>\n",$masterTime); printf("<td>%f</td>\n",$masterTime); echo "<td>".gmdate(DATE_RFC850,$masterTime)."</td>\n"; echo "<td>".gmdate(DATE_RFC850,$masterTime)."</td>\n"; } } break; break; // Show hex data // Show hex data Loading @@ -323,6 +447,7 @@ TEXT; } } if ($format!="csv"){ if ($format!="csv"){ echo "</table>\n"; echo "</table>\n"; echo "</Document>\n"; } } } } Loading Loading @@ -513,14 +638,14 @@ eg3. $GPVTG,t,T,,,s.ss,N,s.ss,K*hh function showlist(){ function showlist(){ global $hardcodeddir; global $hardcodeddir; global $remoteaccess; $local = true; $local = true; if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['file'])) $file = $_GET['file']; if ($_SERVER['REMOTE_ADDR']!=$_SERVER['SERVER_ADDR']){ if ($remoteaccess){ $dir = $hardcodeddir; $dir = $hardcodeddir; $local = false; }else{ }else{ if (!isset($file)||($file=="")){ if (!isset($file)||($file=="")){ $dir = "."; $dir = "."; Loading @@ -540,7 +665,7 @@ function showlist(){ $files = scandir($dir); $files = scandir($dir); if ($dir=="."||(!$local)) $dirlink=""; if ($dir=="."||($remoteaccess)) $dirlink=""; else $dirlink="$dir/"; else $dirlink="$dir/"; $res = ""; $res = ""; Loading @@ -562,19 +687,29 @@ function showlist(){ function html(){ function html(){ global $file,$limit,$record,$nRecords; global $file,$limit,$record,$nRecords,$filter,$nth; global $init; global $init; $ins_filter = array(); if ($init) { if ($init) { $ins_file = $file; $ins_file = $file; $ins_limit = $limit; $ins_limit = $limit; $ins_rec = $record; $ins_rec = $record; $ins_nrec = $_GET['nrecords']+$record; $ins_nrec = $_GET['nrecords']+$record; for($i=0;$i<10;$i++){ if (($filter>>$i)&1==1) $ins_filter[$i] = "checked"; } $ins_nth = $nth; }else{ }else{ $ins_file = "imu.log"; $ins_file = "imu.log"; $ins_limit = 5000; $ins_limit = 500; $ins_rec = 0; $ins_rec = 0; $ins_nrec = 5000; $ins_nrec = 5000; for($i=0;$i<10;$i++){ $ins_filter[$i] = "checked"; } $ins_nth = 1; } } $js = js(); $js = js(); Loading Loading @@ -610,22 +745,22 @@ function html(){ <tr> <tr> <td colspan=''>Record filter: <td colspan=''>Record filter: <span title='External device'>EXT <span title='External device'>EXT <input id='filter_9' type='checkbox' checked onchange='getRqStr()'> <input id='filter_9' type='checkbox' {$ins_filter[9]} onchange='getRqStr()' title='External source'> </span> </span> <span title='Image trigger signal'>IMG <span title='Image trigger signal'>IMG <input id='filter_8' type='checkbox' checked onchange='getRqStr()' title='Sensor port 3'> <input id='filter_8' type='checkbox' {$ins_filter[8]} onchange='getRqStr()' title='Sensor port 3'> <input id='filter_7' type='checkbox' checked onchange='getRqStr()' title='Sensor port 2'> <input id='filter_7' type='checkbox' {$ins_filter[7]} onchange='getRqStr()' title='Sensor port 2'> <input id='filter_6' type='checkbox' checked onchange='getRqStr()' title='Sensor port 1'> <input id='filter_6' type='checkbox' {$ins_filter[6]} onchange='getRqStr()' title='Sensor port 1'> <input id='filter_5' type='checkbox' checked onchange='getRqStr()' title='Sensor port 0'> <input id='filter_5' type='checkbox' {$ins_filter[5]} onchange='getRqStr()' title='Sensor port 0'> </span> </span> <span title='IMU'>IMU <span title='IMU'>IMU <input id='filter_4' type='checkbox' checked onchange='getRqStr()'> <input id='filter_4' type='checkbox' {$ins_filter[4]} onchange='getRqStr()'> </span> </span> <span title='GPS'>GPS <span title='GPS'>GPS <input id='filter_3' type='checkbox' checked onchange='getRqStr()' title='NMEA GPVTG'> <input id='filter_3' type='checkbox' {$ins_filter[3]} onchange='getRqStr()' title='NMEA GPVTG'> <input id='filter_2' type='checkbox' checked onchange='getRqStr()' title='NMEA GPGSA'> <input id='filter_2' type='checkbox' {$ins_filter[2]} onchange='getRqStr()' title='NMEA GPGSA'> <input id='filter_1' type='checkbox' checked onchange='getRqStr()' title='NMEA GPGGA'> <input id='filter_1' type='checkbox' {$ins_filter[1]} onchange='getRqStr()' title='NMEA GPGGA'> <input id='filter_0' type='checkbox' checked onchange='getRqStr()' title='NMEA GPRMC'> <input id='filter_0' type='checkbox' {$ins_filter[0]} onchange='getRqStr()' title='NMEA GPRMC'> </span> </span> </td> </td> </tr> </tr> Loading @@ -640,14 +775,19 @@ function html(){ <td></td> <td></td> <td>End</td><td><input id='end' type='text' value='$ins_nrec' style='width:100px;text-align:right;' onchange='getRqStr()'></td> <td>End</td><td><input id='end' type='text' value='$ins_nrec' style='width:100px;text-align:right;' onchange='getRqStr()'></td> </tr> </tr> <tr> <td><input type='checkbox' id='show_limit_toggle' checked onchange='getRqStr()'></td> <td><input type='checkbox' id='show_limit_toggle' checked onchange='getRqStr()'></td> <td>Show limit</td><td><input id='limit' type='text' value='$ins_limit' style='width:100px;text-align:right;' onchange='getRqStr()'></td> <td>Show limit</td><td><input id='limit' type='text' value='$ins_limit' style='width:100px;text-align:right;' onchange='getRqStr()'></td> </tr> </tr> <tr> <td><input type='checkbox' id='show_nth_toggle' checked onchange='getRqStr()'></td> <td>Show every</td><td><input id='nth' type='text' value='$ins_nth' style='width:100px;text-align:right;' onchange='getRqStr()'> <sup>th</sup> record</td> </tr> </table> </table> </td> </td> </tr> </tr> <tr> <tr> <td><button onclick='show()'>Show records</button> <span id='csvlink'></span></td> <td><button onclick='show()'>Show records</button> <span id='csvlink'></span><span id='csvlink2'></span></td> </tr> </tr> </table> </table> </td> </td> Loading @@ -660,6 +800,7 @@ TEXT; } } function js(){ function js(){ global $thisname; global $init; global $init; if ($init) $insert = "show();"; if ($init) $insert = "show();"; Loading @@ -678,8 +819,6 @@ function init(){ function show(){ function show(){ console.log("show"); console.log("show"); report("status: waiting for response"); var rqstr = getRqStr(); var rqstr = getRqStr(); var request = new XMLHttpRequest(); var request = new XMLHttpRequest(); Loading @@ -688,10 +827,8 @@ function show(){ request.onreadystatechange = function() { request.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && this.status == 200) { var resp = this.responseText; var resp = this.responseText; report("status: parsing response"); clearInterval(loading_interval); clearInterval(loading_interval); document.getElementById("results").innerHTML = "<br/>"+resp; document.getElementById("results").innerHTML = "<br/>"+resp; report("<a href='"+rqstr+"'>current view</a>, <a href='"+rqstr+"&nogui"+"&format=csv"+"'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=html"+"'>html</a>"); } } }; }; Loading @@ -706,7 +843,7 @@ function show(){ function getList(){ function getList(){ var filename = document.getElementById("file").value; var filename = document.getElementById("file").value; var rqstr = "read_imu_log.php?list&nogui&file="+filename; var rqstr = "$thisname?list&nogui&file="+filename; var request = new XMLHttpRequest(); var request = new XMLHttpRequest(); request.open('GET', rqstr, true); request.open('GET', rqstr, true); Loading @@ -731,7 +868,7 @@ function getRqStr(){ var filename = document.getElementById("file").value; var filename = document.getElementById("file").value; var filter = 0; var filter = 0; for(var i=0;i<7;i++){ for(var i=0;i<10;i++){ bit = (document.getElementById("filter_"+i).checked)?1:0; bit = (document.getElementById("filter_"+i).checked)?1:0; filter += (bit<<i); filter += (bit<<i); } } Loading @@ -745,6 +882,12 @@ function getRqStr(){ limit = "&limit="+document.getElementById("limit").value; limit = "&limit="+document.getElementById("limit").value; } } var nth = ""; if (document.getElementById("show_nth_toggle").checked){ nth = "&nth="+document.getElementById("nth").value; } var n = end - start; var n = end - start; if (n<0) { if (n<0) { Loading @@ -752,11 +895,11 @@ function getRqStr(){ n = 1; n = 1; } } var rqstr = "read_imu_log.php?file="+filename+"&record="+start+"&nrecords="+n+"&filter="+filter+limit; var rqstr = "$thisname?file="+filename+"&record="+start+"&nrecords="+n+"&filter="+filter+limit+nth; report(""); report(""); setTimeout(function(){ setTimeout(function(){ report("<a href='"+rqstr+"'>current view</a>, <a href='"+rqstr+"&nogui"+"&format=csv"+"'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=html"+"'>html</a>"); report("<a href='"+rqstr+"'>share</a>, Download: <a href='"+rqstr+"&nogui"+"&format=csv'>csv</a>, <a href='"+rqstr+"&nogui"+"&format=csv&showall'>full csv</a>"); },100); },100); return rqstr; return rqstr; Loading Loading @@ -798,22 +941,28 @@ var loading_interval; function loading(){ function loading(){ console.log("loading"); console.log("loading"); var tmp = document.getElementById("csvlink").innerHTML; var tmp = document.getElementById("csvlink2").innerHTML; if (tmp.length<2) tmp += "."; if (tmp.length<2) tmp += "."; else tmp = ""; else tmp = ""; document.getElementById("csvlink").innerHTML = tmp; document.getElementById("csvlink2").innerHTML = tmp; } } TEXT; TEXT; } } function help(){ function help(){ global $thisname; global $nogui; global $nogui; $logslist = showlist(); $logslist = showlist(); $help = <<<TEXT $help = <<<TEXT <span style='font-size:1.2em;'>$logslist</span> <span style='font-size:1.2em;'>$logslist</span> <div style='font-size:1.2em;'>Source: <ul> <li><a href="?source" >This program source</a></li> </ul> </div> <div style='font-size:1.2em;'>Usage: <div style='font-size:1.2em;'>Usage: <ul> <ul> <li>GUI: <li>GUI: Loading @@ -822,39 +971,57 @@ function help(){ <i>remote != server address</i> - http://thisscriptrootpath/logs/filename<br/> <i>remote != server address</i> - http://thisscriptrootpath/logs/filename<br/> <i>remote == server address</i> - any relative/absolute path <i>remote == server address</i> - any relative/absolute path </li> </li> <li><b>Checkboxes</b> - checked = show</li> <li><b>Record filter checkboxes</b> - checked = show</li> <li><b>Begin</b> - offset, record index in log</li> <li><b>Begin</b> - offset, record index in log</li> <li><b>End</b> - offset, record index in log</li> <li><b>End</b> - offset, record index in log</li> <li><b>Show limit</b> - Number of filtered records to show, if enabled overrides <b>End</b></li> <li><b>Show limit</b> - Number of filtered records to show, if enabled overrides <b>End</b></li> <li><b>current view, csv, html</b> - if any parameter changed a link to csv or html data is created/updated</li> <li><button onclick='getList()'>List log files</button> : <ul> <li>remote access - list of files in <b>http://thisscriptrootpath/logs/</b></li> <li>local access - list of files in <b>http://thisscriptrootpath/</b></li> </ul> <button onclick='show()'>Show records</button> - after a file is selected.<br/> If a folder is selected - <button onclick='getList()'>List log files</button> again to scan inside. </li> <li><a href='#'>share</a> - open this page with the same parameters (auto <b>show records</b>)</li> <li><a href='#'>csv</a> - download csv: filter + limit</li> <li><a href='#'>csv full</a> - download csv: filter + no limit</li> </ul> </ul> </li> </li> <br/> <br/> <li>URL (see <b><i>current view, csv, html</i></b>): <li>URL (see <b>share</b>,<b>csv</b>,<b>csv full</b>): <ul> <ul> <li> <li> <b>http://thisscriptrootpath/read_imu_log.php?file=..&record=..&nrecords=..&filter=..&limit=..&format=..</b><br/> <b>http://thisscriptrootpath/$thisname?file=..&record=..&nrecords=..&filter=..&limit=..&format=..</b><br/> <b>file</b> - with path<br/> <b>file</b> - with path<br/> <b>format</b> - accepts 'csv' or 'html'<br/> <b>format</b> - accepts 'csv' or 'html'<br/> <b>limit</b> - limit the displayed records<br/> <b>limit</b> - limit the displayed records<br/> <b>record</b> - starting record index, default = 0<br/> <b>record</b> - starting record index, default = 0<br/> <b>nrecords</b> - number of records to parse, default = 5000<br/> <b>nrecords</b> - number of records to parse, default = 5000<br/> <b>filter</b> - filter out types of displayed records:<br/> <b>filter</b> - filter out types of displayed records:<br/> 0x40 - display external trigger records only<br/> 0x200 - display external trigger records only<br/> 0x20 - display image records only<br/> 0x100 - display image records, channel 3 only<br/> 0x10 - display imu records only<br/> 0x080 - display image records, channel 2 only<br/> 0x040 - display image records, channel 1 only<br/> 0x020 - display image records, channel 0 only<br/> 0x010 - display imu records only<br/> for gps records:<br/> for gps records:<br/> 0x08 - display NMEA GPVTG records,<br/> 0x008 - display NMEA GPVTG records,<br/> 0x04 - display NMEA GPGSA records<br/> 0x004 - display NMEA GPGSA records<br/> 0x02 - display NMEA GPGGA records (have coordinates)<br/> 0x002 - display NMEA GPGGA records (have coordinates)<br/> 0x01 - display NMEA GPRMC records (have coordinates)<br/> 0x001 - display NMEA GPRMC records (have coordinates)<br/> default = 0x7f (display everything)<br/> default = 0x7f (display everything)<br/> </li> </li> </ul> </ul> </li> </li> <li><a href="?source" >PHP source</a></li> <li>Command line: <ul> <li><i>~$ php $thisname logfile filter [filter] > output.csv</i></li> </ul> </li> </ul> </ul> </div> </div> <br/><br/><br/> TEXT; TEXT; if (!$nogui) $help = "`<br/>$help`"; if (!$nogui) $help = "`<br/>$help`"; Loading