00001 #!/usr/local/sbin/php -q
00002 <?php
00090
00092 $autocampars='/usr/html/autocampars.php';
00093 $descriptions=getParDescriptions($autocampars);
00094 $default_ahead=3;
00095 $maxahead=6;
00096 $minahead=4;
00097 $brief=true;
00098 $ahead_separator='*';
00099 $refreshSig="refresh";
00100 $testMode=-1;
00101 $showSeqMode=-1;
00102 $testBefore=2;
00103 $testAfter=2;
00104 $framesBeforeStart=2;
00105 $imgsrv="http://".$_SERVER['SERVER_ADDR'].":8081";
00106 $defaultImgScale=0.2;
00107 $defaultImagesPerRow=3;
00108 $defaultImagesNumber=9;
00109 $isPost=$_SERVER["REQUEST_METHOD"]=="POST";
00110 $ignoreVals=$isPost;
00111 $imagesNumber=$defaultImagesNumber;
00112 $imagesPerRow=$defaultImagesPerRow;
00113 $imgScale=$defaultImgScale;
00114 $embedImageScale=0;
00115 $defaultEmbedImageScale=0.3;
00116 $encoded_todo="";
00117 if ($isPost) {
00118 $todo=parsePost();
00119 }
00120
00121 $page_title="Default control/test page for the NC353L camera";
00122 if (count($_GET)==0) {
00123 startPage($page_title, "");
00124 printDefaultPage();
00125 endPage();
00126 exit (0);
00127 }
00128 $elp_const=get_defined_constants(true);
00129 $elp_const=$elp_const["elphel"];
00130 parseGetNames();
00131
00132 startPage($page_title, mainJavascript($refreshSig));
00133
00134 if ($isPost) {
00135 if ($showSeqMode>0) showSequence($todo,0);
00136 addGammas($todo);
00137 applyPost($todo);
00138 if ($showSeqMode>0) showSequence($todo,$frame_zero);
00139 $encoded_todo=encodeTodo($todo,$frame_zero);
00140
00141 }
00142 readCurrentParameterValues();
00143
00144
00145
00146
00147
00148
00149 printPage($encoded_todo);
00150 endPage();
00151
00152 exit (0);
00157 function printDefaultPage() {
00158
00159 $url_init= "embed&test&showseq&title=Camera+initialization+parameters"
00160 ."TASKLET_CTL=0*0"
00161 ."&MAXAHEAD=2"
00162 ."&FPGA_XTRA=1000"
00163 ."&EARLY_TIMESTAMP=1"
00164
00165 ."&BITS=8"
00166 ."&QUALITY=80"
00167 ."&COLOR=1"
00168 ."&COLOR_SATURATION_BLUE=200"
00169 ."&COLOR_SATURATION_RED=200"
00170 ."&BAYER=0"
00171 ."&SENSOR_RUN=". ELPHEL_CONST_SENSOR_RUN_CONT
00172 ."&COMPRESSOR_RUN=".ELPHEL_CONST_COMPRESSOR_RUN_CONT
00173 .">AB_R=0x0a390400"
00174 .">AB_G=0x0a390400"
00175 .">AB_GB=0x0a390400"
00176 .">AB_B=0x0a390400"
00177 ."&SENSOR=0*0"
00178 ;
00179 $url_debug= "test&showseq&title=Debug control"
00180 ."&DEBUG=0x3fc"
00181 ."&TASKLET_CTL"
00182 ."&PROFILING_EN"
00183 ."&HISTMODE_C"
00184 ."&HISTMODE_Y"
00185 ."&HIST_LAST_INDEX=@"
00186 ."&THIS_FRAME=@"
00187 ."&HIST_Y_FRAME=@"
00188 ."&HIST_C_FRAME=@"
00189 ."&CIRCBUFWP=@"
00190 ;
00191 $url_woi_control= "embed&test&showseq&title=Camera+WOI+Controls".
00192 "&SENSOR_RUN&COMPRESSOR_RUN&WOI_LEFT&WOI_TOP&WOI_WIDTH&WOI_HEIGHT&FLIPH&FLIPV&THIS_FRAME=@&CIRCBUFWP=@";
00193 $url_woi_control_test="embed=.4&test=1&showseq=1&title=Camera+WOI+Controls+(test+mode)".
00194 "&SENSOR_RUN&COMPRESSOR_RUN&WOI_LEFT&WOI_TOP&WOI_WIDTH&WOI_HEIGHT&FLIPH=1*3&FLIPV=1*5&THIS_FRAME=@&CIRCBUFWP=@";
00195 $url_images= "images=9:3:.2";
00196 $url_aexp_all= "embed=0.1&title=Autoexposure/White+Balance/HDR+controls+(full)"
00197 ."&COMPRESSOR_RUN=".ELPHEL_CONST_COMPRESSOR_RUN_CONT
00198 ."&DAEMON_EN=1"
00199 ."&AUTOEXP_ON=1"
00200 ."&AEXP_FRACPIX=0xff80"
00201 ."&AEXP_LEVEL=0xf800"
00202 ."&AE_PERIOD=4"
00203 ."&AE_THRESH=500"
00204 ."&THIS_FRAME=@"
00205 ."&NEXT_AE_FRAME=@"
00206 ."&NEXT_WB_FRAME=@"
00207 ."&VEXPOS"
00208 ."&EXPOS"
00209 ."&NEXT_WB_FRAME=@"
00210 ."&HIST_DIM_01=0x0a000a00"
00211
00212 ."&HIST_DIM_23=0x0a000a00"
00213
00214 ."&WB_MASK=0xd"
00215 ."&WB_PERIOD=16"
00216 ."&WB_WHITELEV=0xfae1"
00217 ."&WB_WHITEFRAC=0x028f"
00218
00219
00220 ."&WB_SCALE_R=0x10000"
00221 ."&WB_SCALE_GB=0x10000"
00222 ."&WB_SCALE_B=0x10000"
00223 ."&WB_THRESH=0"
00224
00225 .">AB_R"
00226 .">AB_G"
00227 .">AB_GB"
00228 .">AB_B"
00229 ."&HDR_DUR=0"
00230 ."&HDR_VEXPOS=0x40000"
00231 ."&EXP_AHEAD=3"
00232 ."&AE_INTEGERR=@"
00233 ."&HISTWND_RWIDTH"
00234 ."&HISTWND_RHEIGHT"
00235 ."&HISTWND_RLEFT"
00236 ."&HISTWND_RTOP"
00237 ."&HISTWND_WIDTH=@"
00238 ."&HISTWND_HEIGHT=@"
00239 ."&HISTWND_LEFT=@"
00240 ."&HISTWND_TOP=@"
00241 ;
00242
00243 $url_aexp_only= "embed=0.1&title=Autoexposure+controls"
00244 ."&COMPRESSOR_RUN=".ELPHEL_CONST_COMPRESSOR_RUN_CONT
00245 ."&DAEMON_EN=1"
00246 ."&AUTOEXP_ON=1"
00247 ."&AEXP_FRACPIX=0xff80"
00248 ."&AEXP_LEVEL=0xf800"
00249 ."&AE_PERIOD=4"
00250 ."&AE_THRESH=500"
00251 ."&THIS_FRAME=@"
00252 ."&NEXT_AE_FRAME=@"
00253 ."&VEXPOS"
00254 ."&EXPOS"
00255 ."&HIST_DIM_01=0x0a000a00"
00256
00257 ."&HIST_DIM_23=0x0a000a00"
00258 ."&EXP_AHEAD=3"
00259 ."&HISTWND_RWIDTH"
00260 ."&HISTWND_RHEIGHT"
00261 ."&HISTWND_RLEFT"
00262 ."&HISTWND_RTOP"
00263 ."&HISTWND_WIDTH=@"
00264 ."&HISTWND_HEIGHT=@"
00265 ."&HISTWND_LEFT=@"
00266 ."&HISTWND_TOP=@"
00267 ."&AE_INTEGERR=@"
00268 ;
00269 $url_wb_only= "embed=0.1&title=White+Balance+controls"
00270 ."&COMPRESSOR_RUN=".ELPHEL_CONST_COMPRESSOR_RUN_CONT
00271 ."&DAEMON_EN=1"
00272 ."&THIS_FRAME=@"
00273 ."&NEXT_WB_FRAME=@"
00274 ."&NEXT_WB_FRAME=@"
00275 ."&WB_MASK=0xd"
00276 ."&WB_PERIOD=16"
00277 ."&WB_WHITELEV=0xfae1"
00278 ."&WB_WHITEFRAC=0x028f"
00279
00280 ."&WB_SCALE_R=0x10000"
00281 ."&WB_SCALE_GB=0x10000"
00282 ."&WB_SCALE_B=0x10000"
00283 ."&WB_THRESH=500"
00284 ."&GAIN_MIN=0x100"
00285 ."&GAIN_MAX=0xfc00"
00286 ."&GAIN_STEP=0x20"
00287
00288 ."&GAIN_ENABLE=1"
00289 .">AB_R"
00290 .">AB_G"
00291 .">AB_GB"
00292 .">AB_B"
00293
00294 ."&GAINR=0x100"
00295 ."&GAING=0x100"
00296 ."&GAINGB=0x100"
00297 ."&GAINB=0x100"
00298 ."&SENSOR_REGS45=@"
00299 ."&SENSOR_REGS43=@"
00300 ."&SENSOR_REGS46=@"
00301 ."&SENSOR_REGS44=@"
00302 ."&WB_INTEGERR=@"
00303 ;
00304
00305 #define P_GAINR 137 //R channel gain (mono gain) 8.8 0x100 - 1.0
00306 #define P_GAING 138 //G channel gain ("red line")
00307 #define P_GAINGB 139 // G channel gain ("blue line")
00308 #define P_GAINB 140 // B channel gain
00309
00310 $url_hdr_exp= "embed=0.1&title=HDR+exposure+controls"
00311 ."&COMPRESSOR_RUN=".ELPHEL_CONST_COMPRESSOR_RUN_CONT
00312 ."&DAEMON_EN=1"
00313 ."&AUTOEXP_ON=1"
00314 ."&VEXPOS"
00315 ."&EXPOS"
00316 ."&HDR_DUR=0"
00317 ."&HDR_VEXPOS=0x40000"
00318 ."&THIS_FRAME=@"
00319 ;
00320 $url_ext_trigger="embed=0.1&title=External+trigger+controls"
00321 ."&TRIG=4"
00322
00323
00324
00325
00326
00327 ."&TRIG_PERIOD=19200000"
00328
00329
00330 ."&TRIG_DELAY"
00331 ."&EARLY_TIMESTAMP=1"
00332
00333 ."&THIS_FRAME=@"
00334
00335 ."&TRIG_CONDITION=0"
00336 ."&TRIG_OUT=0"
00337
00338 ."&SENSOR_REGS30=@"
00339 ;
00340 echo <<<USAGE
00341 <h4> Control links:</h4>
00342 <ul>
00343 <li><a href="?$url_init">Initialization Parameters (i.e. after powerup)</a></li>
00344 <li><a href="?$url_woi_control">Demo to change image size, position and mirroring</a></li>
00345 <li><a href="?$url_woi_control_test">Demo to change image size, position and mirroring - test mode</a></li>
00346 <li><a href="?$url_aexp_only">Controls related to autoexposure</a></li>
00347 <li><a href="?$url_wb_only">Controls related to white balance</a></li>
00348 <li><a href="?$url_hdr_exp">Controls related to HDR exposure - all</a></li>
00349 <li><a href="?$url_aexp_all">Controls related to autoexposure/white balance/HDR exposure - all</a></li>
00350 <li><a href="?$url_ext_trigger">External trigger controls</a></li>
00351 <li><a href="?$url_images">last 9 images, 3 per row, scale=0.2</a></li>
00352 <li><a href="?$url_debug">Debug on/off control (usually requires to redirect printk() output with 'printk_mod &'</a></li>
00353 </ul>
00354 USAGE;
00355 }
00358 function showImgData($meta,$skipped,$prev,$imgScale,$done) {
00359 global $imgsrv;
00360 $width= $meta['meta']['width'];
00361 $height=$meta['meta']['height'];
00362 $title="";
00363 $frame=$meta['Exif']['FrameNumber'];
00364 foreach ($meta['Exif'] as $key=>$value) {
00365 $title.=sprintf("%s=%s \n",$key,$value);
00366 }
00367
00368
00369
00370
00371
00372 printf ("<table border='1'>");
00373 printf ("<tr>");
00374 printf ("<td colspan=4>");
00375 printf("<img src='$imgsrv/%d/img' style='width:%dpx; height:%dpx;' title='%s'/>\n",
00376 $meta['circbuf_pointer'],
00377 floor($width*$imgScale),
00378 floor($height*$imgScale),
00379 $title);
00380 printf ("</td>");
00381 printf ("</tr>");
00382 printf ("<tr>");
00383 printf ("<td>%s</td><td>%d (0x%x)</td>",'FrameNumber',$frame,$frame);
00384 printf ("<td>%s</td><td>%d (0x%x)</td>",'width',$meta['meta']['width'],$meta['meta']['width']);
00385
00386 printf ("</tr>");
00387 printf ("<tr>");
00388 $just_time=end(explode(" ", trim($meta['Exif']['DateTimeOriginal'])));
00390 $just_time=end(explode(":", $just_time));
00391 if ($skipped)
00392 printf ("<td><b>Skipped</b></td><td><b>%d</b></td>",$skipped);
00393 else
00394 printf ("<td> </td><td> </td>");
00395 printf ("<td>%s</td><td>%d (0x%x)</td>",'height',$meta['meta']['height'],$meta['meta']['height']);
00396 printf ("</tr>");
00397 printf ("<tr>");
00398 printf ("<td>%s</td><td>%s</td>",'TimeOriginal',$just_time);
00399 printf ("<td>%s</td><td>%d (0x%x)</td>",'quality2',$meta['meta']['quality2'],$meta['meta']['quality2']);
00400 printf ("</tr>");
00401 printf ("<tr>");
00402 printf ("<td>%s</td><td>%s</td>",'ExposureTime',trim($meta['Exif']['ExposureTime']));
00403 printf ("<td>%s</td><td>%d</td>",'color',$meta['meta']['color']);
00404 printf ("</tr>");
00405 if ($done) {
00406 printf ("<tr>");
00407 printf ("<td colspan='4'>");
00408
00409 printf ("<table border='1' style='width:100%s'>\n",'%');
00410 foreach ($done as $action_frame=>$actions) {
00411 $firstRow=true;
00412 printf("<tr><td rowspan='%d'>%s</td>",count($actions),($action_frame==$frame)?"now":("prev ".($frame-$action_frame)));
00413 foreach ($actions as $key=>$value) {
00414 if (!$firstRow) printf ("<tr>");
00415 else $firstRow=false;
00416 printf("<td>%s</td><td style='text-align:right'>%d</td><td>0x%x</td>",$key,$value,$value);
00417 printf ("</tr>\n");
00418 }
00419 }
00420 printf ("</table>");
00421
00422
00423 printf ("</td>");
00424 printf ("</tr>");
00425 }
00426 printf ("</table>");
00427
00428
00429 }
00430
00432
00433 function showLastImages($numImg,$imagesPerRow,$imgScale) {
00434 $done= decodeTodo ($_GET['done']);
00435
00436 $circbuf_pointers=elphel_get_circbuf_pointers(1);
00437 $framesAgo=0;
00438
00439 end($circbuf_pointers);
00440 if ($done) {
00441 end($done);
00442 $lastFrameNumber=key($done);
00443 $cur_ptr=current($circbuf_pointers);
00444 while($cur_ptr['frame'] > $lastFrameNumber) {
00445 if (!prev($circbuf_pointers)) {
00446 end($circbuf_pointers);
00447 break;
00448 }
00449 $cur_ptr=current($circbuf_pointers);
00450 $framesAgo++;
00451 }
00452
00453 }
00455
00456
00457
00458
00459 $meta=array();
00460
00461 $lastFrameIndex=key($circbuf_pointers);
00462 for ($i=0; $i<=min(($numImg-1),$lastFrameIndex);$i++) {
00463 $meta[$i]=array('circbuf_pointer'=>$circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['circbuf_pointer'],
00464 'meta'=>elphel_get_interframe_meta($circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['circbuf_pointer']),
00465 'Exif'=>elphel_get_exif_elphel ($circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['exif_pointer']));
00466 $lastFrameNumber=$circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['frame'];
00467 }
00468 $running=(elphel_get_P_value(ELPHEL_COMPRESSOR_RUN)==ELPHEL_CONST_COMPRESSOR_RUN_CONT) &&
00469 (elphel_get_P_value(ELPHEL_SENSOR_RUN)==ELPHEL_CONST_SENSOR_RUN_CONT);
00470 $page_title=sprintf("%s %d images acquired to the circular buffer (circbuf). Acquisition is %s. Last frame is %d"
00471 ,$framesAgo?"$framesAgo frames (stored) ago":"Latest"
00472 ,$numImg
00473 ,$running?"on - these frames are/will be overwritten in the camera memory":"off"
00474 ,$lastFrameNumber);
00475
00476
00477
00478
00479
00480
00481
00482
00483 startPage($page_title, "");
00484 printf("<h4>%s</h4>\n",$page_title);
00485 printf ("<table>\n");
00486 $rowOpen=$false;
00487 $lastFrame=0;
00488 $done_left=count($done);
00489 reset($done);
00490 $slice_start=0;
00491 $slice_count=0;
00492 for ($i=0;$i<$numImg;$i++) {
00493 $slice_start+=$slice_count;
00494 $slice_count=0;
00495 $frame=$meta[$i]['Exif']['FrameNumber'];
00496 while($done_left && (key($done) <= $frame)) {
00497 $slice_count++;
00498 $done_left--;
00499 next($done);
00500 }
00502 $this_done=array_slice($done,$slice_start,$slice_count,true);
00503 if (!($i % $imagesPerRow)) {
00504 if ($rowOpen) {
00505 printf ("</tr>\n");
00506 }
00507 printf ("<tr>\n");
00508 $rowOpen=true;
00509 }
00510 printf("<td style='vertical-align: top;'>");
00511 $skipped=($i>0)?($frame-$lastFrame-1):0;
00512 $lastFrame=$frame;
00513 showImgData($meta[$i],$skipped,$numImg-$i-1,$imgScale,$this_done);
00514 printf("</td>\n");
00515 }
00516 while ($i++ % $imagesPerRow) {
00517 printf ("<td> </td>\n");
00518 }
00519 printf ("</tr>\n");
00520 printf ("</table>\n");
00521 endPage();
00522 }
00523
00530 function encodeTodo($todo,$frame_zero) {
00531 $result="";
00532 foreach ($todo as $frame=>$actions) {
00533 $result.=sprintf("%d/",$frame+$frame_zero);
00534 foreach ($actions as $par=>$value) {
00535 $result.=sprintf("%s:%d/",$par,$value);
00536 }
00537 }
00538 return $result;
00539 }
00540
00546 function decodeTodo ($encoded_todo) {
00547 $todo=array();
00548 $frame=0;
00549 if (!$encoded_todo) return $todo;
00550 $done=explode("/",rtrim($encoded_todo,'/'));
00551 foreach ($done as $term) {
00552 $term=explode(":",$term);
00553 if (count($term)==1) {
00554 $frame=$term[0];
00555 $todo[$frame]=array();
00556 } else {
00557 $todo[$frame][$term[0]]=(int)$term[1];
00558 }
00559 }
00560 return $todo;
00561 }
00562
00563
00564 function showSequence($todo,$frame_zero) {
00565 printf("<h4>Command Sequence (%s)</h4>\n",$frame_zero?"absolute frame numbers":"relative frame numbers");
00566 printf ("<table border='1' style='font-family: Courier, monospace;'>\n");
00567 printf ("<tr style='text-align:center'>".
00568 "<td colspan=2>Frame</td>".
00569 "<td rowspan=2>Parameter name</td>".
00570 "<td colspan=2>Value</td>".
00571 "</tr>\n");
00572 printf ("<tr style='text-align:center'>".
00573 "<td>dec</td>".
00574 "<td>hex</td>".
00575 "<td>dec</td>".
00576 "<td>hex</td>".
00577 "</tr>\n");
00578 foreach ($todo as $frame=>$actions) {
00579 $first_act=true;
00580 printf ("<tr style='text-align:right'>\n");
00581 foreach ($actions as $name=>$value) {
00582 if ($first_act) {
00583 printf ("<td rowspan=%d>%d</td><td rowspan=%d>0x%x</td>",count($actions),($frame+$frame_zero),count($actions),($frame+$frame_zero));
00584 }
00585 printf ("<td style='text-align:left'>%s</td>".
00586 "<td>%d</td>".
00587 "<td>0x%x</td>".
00588 "</tr>\n",$name,$value,$value);
00589 $first_act=false;
00590 }
00591 }
00592
00593 printf ("</table>\n");
00594 }
00595
00596 function applyPost($todo) {
00597 global $maxahead,$minahead,$frame_zero,$showSeqMode;
00598 if ($showSeqMode>0) {
00599 printf("<h4>Running sequence...</h4>\n");
00600 echo "<pre>";
00601 }
00602
00603
00604
00605
00606
00608 $waitingEnabled=true;
00609 foreach ($todo as $pars) if (array_key_exists('SENSOR', $pars)) {
00610 $waitingEnabled=false;
00611 break;
00612 }
00613 if (elphel_get_frame()<8) $waitingEnabled=false;
00614 if ($waitingEnabled) elphel_skip_frames(1);
00616 $frame_zero=elphel_get_frame();
00617 $frame_since=0;
00618 $frame_now=$frame_zero;
00620 foreach ($todo as $since=>$pgmpars) {
00621 if (($since-$maxahead) >$frame_since ) {
00622 $frame_since=$since-$minahead;
00623 $frame_now=$frame_since+$frame_zero;
00624 if ($waitingEnabled) {
00625 if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now); ob_flush(); flush();}
00626 elphel_wait_frame_abs($frame_now);
00627 if ($showSeqMode>0) {printf ("done\n"); ob_flush(); flush();}
00628 }
00629 }
00630 elphel_set_P_arr ($pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC);
00631 }
00632 $frame_now=$since+$frame_zero+1;
00633
00634 if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now); ob_flush(); flush();}
00635 if ($waitingEnabled) {
00636 elphel_wait_frame_abs($frame_now);
00637 } else {
00638 $timeout_step= 100000;
00639 $timeout= 3000000;
00640 for ($i=0 ; $i < $timeout; $i+=$timeout_step) {
00641 if (elphel_get_frame()>=$frame_now) break;
00642 usleep($timeout_step);
00643 }
00644 }
00645 if ($showSeqMode>0) {printf ("done\n"); ob_flush(); flush();}
00646 if ($showSeqMode>0) echo "</pre>";
00647
00648 }
00649
00650 function parsePost() {
00651 global $_POST,$testMode,$showSeqMode,$testBefore,$testAfter,$framesBeforeStart,$posted_params;
00652 $todo=array();
00653 $posted_params=array();
00655 $testMode=$_POST['test_mode'];
00656 $showSeqMode=$_POST['show_seq'];
00657 foreach ($_POST as $post=>$value) {
00658 if (($post=="test_mode") || ($post=="show_seq")) {
00659
00660 } else {
00661 list ($name,$index)=explode('_',$post);
00662 $index = (int) $index;
00663 if (!$posted_params[$index]) $posted_params[$index]=array();
00664 $posted_params[$index][$name]=$value;
00665 }
00666 }
00669 foreach ($posted_params as $par) if ($par['apply']){
00670 if (array_key_exists('delay',$par)) {
00671 $delay = (int) $par['delay'] + ($testMode?($testBefore+$framesBeforeStart):0);
00672 } else $delay=0;
00673 if (!$todo[$delay]) $todo[$delay]=array();
00674 $todo[$delay][$par['name']]=(int) $par['paramdec'];
00675 }
00677 ksort($todo);
00678 if ($testMode) {
00679 end($todo);
00680 $todo[key($todo)+$testAfter]=array("COMPRESSOR_RUN"=>ELPHEL_CONST_COMPRESSOR_RUN_STOP);
00681 $todo[$framesBeforeStart]=array("COMPRESSOR_RUN"=>ELPHEL_CONST_COMPRESSOR_RUN_CONT);
00682 ksort($todo);
00683 }
00684 return $todo;
00685 }
00686
00693 function addGammas($todo) {
00694 global $showSeqMode;
00695 $gammas=array();
00696 foreach ($todo as $pars) {
00697 if (array_key_exists('GTAB_R', $pars)) $gammas[$pars['GTAB_R' ]>>16]=1;
00698 if (array_key_exists('GTAB_G', $pars)) $gammas[$pars['GTAB_G' ]>>16]=1;
00699 if (array_key_exists('GTAB_GB',$pars)) $gammas[$pars['GTAB_GB']>>16]=1;
00700 if (array_key_exists('GTAB_B', $pars)) $gammas[$pars['GTAB_B' ]>>16]=1;
00701 }
00702
00703 foreach ($gammas as $gamma_black=>$whatever) {
00704 $black=($gamma_black>>8) & 0xff;
00705 $gamma=($gamma_black & 0xff)*0.01;
00706 if ($showSeqMode>0) printf("<pre>Adding gamma table (gamma=%f, black level=%d)\n</pre>\n",$gamma,$black);
00707 elphel_gamma_add ($gamma, $black);
00708 }
00709 }
00710
00711 function myval ($s) {
00712 $s=trim($s,"\" ");
00713 if (strtoupper(substr($s,0,2))=="0X") return intval(hexdec($s));
00714 else return intval($s);
00715 }
00716
00717
00718 function parseGetNames() {
00719 global $_GET,$_POST,$isPost,$elp_const,$frame_params,$global_params,
00720 $page_title,$default_ahead,$maxahead,$brief,$ahead_separator,
00721 $refreshSig,$ignoreVals,$testMode,$showSeqMode,$posted_params,$defaultImgScale,$defaultImagesPerRow,$defaultImagesNumber,
00722 $imagesNumber,$imagesPerRow,$imgScale,$embedImageScale, $defaultEmbedImageScale;
00723 $index=0;
00724 $frame_params=array();
00725 $global_params=array();
00726 foreach ($_GET as $key=>$value) {
00727 if ($key=="title") {
00728 $page_title=$value;
00729 } else if ($key=="shownumbers") {
00730 $brief=false;
00731 } else if ($key==$refreshSig) {
00732 $ignoreVals=true;
00733 } else if ($key=='test') {
00734 $testMode= myval($isPost?$_POST['test_mode']:$value);
00735 } else if ($key=='showseq') {
00736 $showSeqMode=myval($isPost?$_POST['show_seq']:$value);
00737 } else if (($key=='images') || ($key=='link_images')) {
00738 if ($value) $value=explode(':',$value);
00739 else $value=array();
00740 $imagesNumber=$value[0]?$value[0]:$defaultImagesNumber;
00741 $imagesPerRow=$value[1]?$value[1]:$defaultImagesPerRow;
00742 $imgScale= $value[2]?$value[2]:$defaultImgScale;
00743 if ($key=='images') {
00744 showLastImages($imagesNumber,$imagesPerRow,$imgScale);
00745 exit(0);
00746 }
00747 } else if ($key=='embed') {
00748 $embedImageScale= $value;
00749 if (!$embedImageScale) $embedImageScale=$defaultEmbedImageScale;
00750 } else if ($key=='_time') {
00751 } else {
00753 $address=myval ($key);
00754 if (($address==0) && (strlen($key)>3)) {
00755 $address=elphel_parse_P_name($key);
00756 }
00757 if ($address==0) {
00758 $xml = new SimpleXMLElement("<?xml version='1.0'?><framepars/>");
00759 $xml->addChild ('ERROR','"Wrong address==0, probably misspelled constant: \''.$key.'\'"' );
00760 $rslt=$xml->asXML();
00761 header("Content-Type: text/xml");
00762 header("Content-Length: ".strlen($rslt)."\n");
00763 header("Pragma: no-cache\n");
00764 printf($rslt);
00765 exit (0);
00766 }
00767 $write_en=(!($value[0]=="@"));
00768 if (!$write_en) {
00769 if (strlen($value)==1) $value="";
00770 else $value=substr($value,1);
00771 }
00772 $values=explode(":", $value);
00773 foreach ($values as $value) {
00774 $modified=false;
00775 $value=explode($ahead_separator,$value);
00776 if (count($value)>1) {
00777 $ahead=myval($value[1]);
00778 if ($ahead<0) $ahead=0;
00779 } else {
00780 $ahead=$default_ahead;
00781 }
00782 $modified=(strlen($value[0])>0);
00783 $value=myval($value[0]);
00784 if ($isPost) {
00785 $ahead=$posted_params[$index]['delay'];
00786 }
00787 if (elphel_is_global_par($address)) {
00788
00789 $global_params[$index++]=array("number"=>$address,
00790 "name"=>$key,
00791 "value"=>$value,
00792 "write_en"=>$write_en,
00793 "cur_value"=>"",
00794 'modified'=>$modified,
00795 'ahead'=>$ahead);
00796 } else {
00797 $frame_params [$index++]=array("number"=>$address,
00798 "name"=>$key,
00799 "value"=>$value,
00800 "write_en"=>$write_en,
00801 "cur_value"=>"",
00802 'modified'=>$modified,
00803 'ahead'=>$ahead);
00804 }
00805 }
00806 }
00807 }
00808 }
00809 function readCurrentParameterValues() {
00810 global $frame_params,$global_params,$page_title,$ignoreVals;
00811 $pars=array();
00812 foreach ($frame_params as $par) {
00813 $pars[$par['name']]=0;
00814 }
00815 foreach ($global_params as $par) {
00816 $pars[$par['name']]=0;
00817 }
00818
00819
00820 $pars=elphel_get_P_arr($pars);
00821
00822 foreach ($frame_params as $key=>$par) {
00823 $frame_params[$key]['cur_value']=$pars[$par['name']];
00824 $par['cur_value']=$pars[$par['name']];
00825 if (!$par['modified'] || $ignoreVals) $frame_params[$key]['value']=$par['cur_value'];
00826
00827
00828 }
00829 foreach ($global_params as $key=>$par) {
00830 $global_params[$key]['cur_value']=$pars[$par['name']];
00831 $par['cur_value']=$pars[$par['name']];
00832 if (!$par['modified'] || $ignoreVals) $global_params[$key]['value']=$par['cur_value'];
00833
00834 }
00835 }
00837 function mainJavascript($refreshSig) {
00838 global $refreshSig,$frame_params,$global_params;
00839 $checkboxNumbers="";
00840 foreach ($frame_params as $num=>$par) {
00841 $checkboxNumbers.=$num.",";
00842 }
00843 foreach ($global_params as $num=>$par) {
00844 $checkboxNumbers.=$num.",";
00845 }
00846 $checkboxNumbers=rtrim ($checkboxNumbers,",");
00847
00848 return <<<JAVASCRIPT
00849 function hex2dec(h) {
00850 var dec=0;
00851 var d;
00852 h=h.toUpperCase();
00853 while (h.length>0) {
00854 d=h.charCodeAt(0)-"0".charCodeAt(0);
00855 if (d>9) d= (h.charCodeAt(0))-("A".charCodeAt(0))+10;
00856 dec=dec*16+d;
00857 h=h.substring(1,h.length);
00858 }
00859 return dec;
00860 }
00861 function dec2hex(d) {
00862 var hex="";
00863 var d0,d1;
00864 if (d<0) d+=4294967296;
00865 if ((d<0) || ( d>4294967296)) return "NaN";
00866 while (d>0) {
00867 d1=Math.floor(d/16);
00868 d0=d-16*d1;
00869 d=d1;
00870 hex=("0123456789abcdef".charAt(d0))+hex;
00871 }
00872 return hex;
00873 }
00874 function onchangeDec(elem,id_hex,id_apply) {
00875
00876 document.getElementById(id_hex).value=dec2hex(document.getElementById(elem.id).value);
00877 document.getElementById(id_apply).checked=true;
00878 }
00879 function onchangeHex(elem,id_dec,id_apply) {
00880
00881 document.getElementById(id_dec).value=hex2dec(document.getElementById(elem.id).value);
00882 document.getElementById(id_apply).checked=true;
00883 }
00884 function onchangeDelay(elem,id_apply) {
00885
00886 var d=document.getElementById(elem.id).value;
00887 if (d<0) document.getElementById(elem.id).value=0;
00888 document.getElementById(id_apply).checked=true;
00889 }
00890 function refreshPage(mode) {
00891 var url=window.location.href;
00892 var refreshSign="&"+"$refreshSig";
00893 var refIndex,index1;
00895 while (url.indexOf(refreshSign)>=0) {
00896 refIndex=url.indexOf(refreshSign);
00897 url=url.substr(0,refIndex)+url.substr(refIndex+refreshSign.length);
00898 }
00899 if (mode) url+=refreshSign;
00901 var testModeName="test";
00902 refIndex=url.indexOf("&"+testModeName);
00903 if (refIndex<0)refIndex=url.indexOf("?"+testModeName);
00904 if (refIndex>=0){
00905 index1=url.indexOf("&",refIndex+testModeName.length);
00906 if (index1<0) index1= url.length;
00907 refIndex+=testModeName.length+1;
00908 url=url.substr(0,refIndex)+"="+(document.getElementById("id_test_mode").checked?1:0)+url.substr(index1);
00909 }
00910
00912 var showSeqName="showseq";
00913 refIndex=url.indexOf("&"+showSeqName);
00914 if (refIndex<0)refIndex=url.indexOf("?"+showSeqName);
00915 if (refIndex>=0){
00916 index1=url.indexOf("&",refIndex+showSeqName.length);
00917 if (index1<0) index1= url.length;
00918 refIndex+=showSeqName.length+1;
00919 url=url.substr(0,refIndex)+"="+(document.getElementById("id_show_seq").checked?1:0)+url.substr(index1);
00920 }
00921
00922 window.location.href=url;
00923 }
00924 function unCheckAll() {
00925 checkboxes=Array($checkboxNumbers);
00926 for (i in checkboxes) {
00927 if (((cb=document.getElementById('id_apply_'+checkboxes[i])))) {
00928 cb.checked=false;
00929 }
00930 }
00931 }
00932 function checkAll() {
00933 checkboxes=Array($checkboxNumbers);
00934 for (i in checkboxes) {
00935 if (((cb=document.getElementById('id_apply_'+checkboxes[i])))) {
00936 cb.checked=true;
00937 }
00938 }
00939 }
00940 JAVASCRIPT;
00941 }
00942
00943
00944
00945 function startPage($page_title, $javascript) {
00946 echo <<<HEAD
00947 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
00948 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
00949 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
00950 <head>
00951 <title>$page_title</title>
00952 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
00953 <script type="text/javascript"><!--
00954 $javascript
00955
00956 </script>
00957 </head>
00958 <body>
00959 HEAD;
00960 }
00961 function endPage(){
00962 echo "\n</body></html>\n";
00963 }
00964
00966 function showControlButtonsRow($table_width,$readonly,$testMode,$showSeqMode,$encoded_todo,$imagesNumber,$imagesPerRow,$imgScale,$checkNotUncheck) {
00967 printf ("<tr style=''><td colspan=%d>",$table_width-($readonly?0:1));
00968 if (!$readonly) {
00969 if ($testMode>=0) {
00970 printf ("<label style='border: 1px solid #000;' for='id_test_mode' title='Add compressor start (before) and compressor stop (after) the sequence'>".
00971 "Test".
00972 "<input type='checkbox' name='test_mode' id='id_test_mode' value='1' %s".
00973 " />".
00974 "</label>",
00975 ($testMode>0)?'checked':'');
00976 }
00977 if ($showSeqMode>=0) {
00978 printf ("<label style='border: 1px solid #000;' for='id_show_seq' title='Show command sequence and the sequence progress'>".
00979 "ShowSeq".
00980 "<input type='checkbox' name='show_seq' id='id_show_seq' value='1' %s".
00981 " />".
00982 "</label>",
00983 ($showSeqMode>0)?'checked':'');
00984 }
00985 printf ("<input type='submit' value='Apply' title='Program the parameters (selected by \"Apply\" checkboxes) to the camera'/>\n");
00986 }
00987 printf ("<input type='button' value='Refresh'onclick='refreshPage(1);' title='Reload the page, keep camera parameters (does not preserve delays yet)'/>\n");
00988 printf ("<input type='button' value='Restart'onclick= 'refreshPage(0);' title='Reload the page, keep URL parameters'/>\n");
00989 if ($encoded_todo) {
00990 printf ("<a href='?images=%d:%d:%f&done=%s' target='new'>Last acquired images</a>\n",$imagesNumber,$imagesPerRow,$imgScale,$encoded_todo);
00991 }
00992 if (!$readonly) {
00993 if ($checkNotUncheck)
00994 printf ("</td><td style='text-align:center'><input type='button' value=' Select \nAll'onclick='checkAll();' title='Check all \"Apply\" the checkboxes'/>\n");
00995 else
00996 printf ("</td><td style='text-align:center'><input type='button' value='Deselect\nAll'onclick='unCheckAll();' title='Uncheck all \"Apply\" the checkboxes'/>\n");
00997 }
00998 printf ("</td></tr>\n");
00999 }
01000
01001 function printPage($encoded_todo) {
01002 global $frame_params,$global_params,$page_title,$brief,$testMode,$showSeqMode,
01003 $imagesNumber,$imagesPerRow,$imgScale,$embedImageScale,$imgsrv,$descriptions;
01004
01005 $readonly=true;
01006 foreach ($frame_params as $par) if ($par['write_en']) {
01007 $readonly=false;
01008 break;
01009 }
01010 if ($readonly) foreach ($global_params as $par) if ($par['write_en']) {
01011 $readonly=false;
01012 break;
01013 }
01014 $table_width=$readonly?5:9;
01015 if ($brief) $table_width-=2;
01016
01018 printf ("<form action=\"$self\" method=\"post\">");
01019 printf ("<table border='1' style='font-family: Courier, monospace;'>\n");
01020
01021 if ($embedImageScale) {
01022 $fd_circ=fopen("/dev/circbuf","r");
01023 fseek($fd_circ, ELPHEL_LSEEK_CIRC_LAST,SEEK_END);
01024 $circbuf_pointer=ftell($fd_circ);
01025 fclose($fd_circ);
01026
01027 if ($circbuf_pointer>=0) {
01028 $meta=elphel_get_interframe_meta($circbuf_pointer);
01029 $width= floor($meta['width']*$embedImageScale);
01030 $height=floor($meta['height']*$embedImageScale);
01031
01032 printf ("<tr style='text-align:center'>".
01033 "<td colspan=$table_width>");
01035 printf ("<a href='$imgsrv/img' target='new'><img src='$imgsrv/%d/img' style='width:%dpx; height:%dpx;' title='Click on the image to open the last acquired one - it may be different than this one (if acquisition is going on)' /></a>",$circbuf_pointer, $width,$height);
01036 printf ("</td></tr>\n");
01037 }
01038
01039 }
01040 showControlButtonsRow($table_width,$readonly,$testMode,$showSeqMode,$encoded_todo,$imagesNumber,$imagesPerRow,$imgScale,true);
01041
01042 printf ("<tr style='text-align:center'>".
01043 "<td rowspan=2>Parameter name</td>");
01044 if (!$brief) {printf (
01045 "<td colspan=2>Number</td>");
01046 }
01047 printf ("<td colspan=2>Current value</td>");
01048 if (!$readonly) {printf (
01049 "<td colspan=2>New value</td>".
01050 "<td rowspan=2>Program<br/>ahead</td>".
01051 "<td rowspan=2>Apply</td></tr>");
01052 }
01053 printf ("</tr>");
01054 printf ("<tr style='text-align:center'>");
01055 if (!$brief) {printf (
01056 "<td> dec </td>".
01057 "<td> hex </td>");
01058 }
01059 printf ("<td> dec </td>".
01060 "<td> hex </td>");
01061 if (!$readonly) {printf (
01062 "<td> dec </td>".
01063 "<td> hex </td>");
01064 }
01065 printf ("</tr>");
01066 if (count($frame_params)) {
01067 printf ("<tr><td colspan='$table_width' style='text-align:center'>Frame-related parameters</td></tr>\n");
01068 foreach ($frame_params as $num=>$par) {
01069
01070 printf ("<tr title='%s'>",getDescription ($par['name'],$descriptions));
01071 printf ("<td>%s</td>",$par['name']);
01072 if (!$brief) {
01073 printf ("<td style='text-align:right'>%d</td>",$num);
01074 printf ("<td style='text-align:right'>0x%x</td>",$num);
01075 }
01076 printf ("<td style='text-align:right'>%d</td>",$par['cur_value']);
01077 printf ("<td style='text-align:right'>0x%x".
01078 "<input type='hidden' name='oldval_%d' value='%d'>".
01079 "<input type='hidden' name='name_%d' value='%s'>".
01080 "</td>",$par['cur_value'],$num,$par['cur_value'],$num,$par['name']);
01081 if ($par['write_en']) {
01082 printf ("<td><input name='paramdec_%d' type='text' size='8' value='%d' id='id_dec_%d' style='text-align:right'".
01083 " onchange='onchangeDec(this,\"id_hex_%d\",\"id_apply_%d\");'/></td>",$num,$par['value'],$num,$num,$num);
01084 printf ("<td style='white-space:nowrap'>0x<input name='paramhex_%d' type='text' size='8' value='%x' id='id_hex_%d' style='text-align:left'".
01085 " onchange='onchangeHex(this,\"id_dec_%d\",\"id_apply_%d\");'/></td>",$num,$par['value'],$num,$num,$num);
01086 printf ("<td style='text-align:center'><input name='delay_%d' type='text' size='4' value='%d' id='id_delay_%d' style='text-align:right'".
01087 " onchange='onchangeDelay(this,\"id_apply_%d\");'/></td>",$num,$par['ahead'],$num,$num);
01088 printf ("<td style='text-align:center'><input type='checkbox' name='apply_%d' value='1' %s id='id_apply_%d'/></td>",$num,$par['modified']?'checked':'',$num);
01089 }else {
01090 if (!$readonly) printf ("<td colspan='4'> </td>");
01091 }
01092 printf ("</tr>\n");
01093 }
01094 }
01095 if (count($global_params)) {
01096 if ($table_width<5) printf ("<tr><td colspan='$table_width' style='text-align:center'>Global parameters</td></tr>\n");
01097 else printf ("<tr><td colspan='$table_width' style='text-align:center'>Global (not related to particular frames) parameters</td></tr>\n");
01098 foreach ($global_params as $num=>$par) {
01099
01100 printf ("<tr title='%s'>",getDescription ($par['name'],$descriptions));
01101 printf ("<td>%s</td>",$par['name']);
01102 if (!$brief) {
01103 printf ("<td style='text-align:right'>%d</td>",$num);
01104 printf ("<td style='text-align:right'>0x%x</td>",$num);
01105 }
01106 printf ("<td style='text-align:right'>%d</td>",$par['cur_value']);
01107 printf ("<td style='text-align:right'>0x%x".
01108 "<input type='hidden' name='oldval_%d' value='%d'>".
01109 "<input type='hidden' name='name_%d' value='%s'>".
01110 "</td>",$par['cur_value'],$num,$par['cur_value'],$num,$par['name']);
01111 if ($par['write_en']) {
01112 printf ("<td><input name='paramdec_%d' type='text' size='8' value='%d' id='id_dec_%d' style='text-align:right'".
01113 " onchange='onchangeDec(this,\"id_hex_%d\",\"id_apply_%d\");'/></td>",$num,$par['value'],$num,$num,$num);
01114 printf ("<td colspan='2' style='white-space:nowrap'>0x<input name='paramhex_%d' type='text' size='8' value='%x' id='id_hex_%d' style='text-align:left'".
01115 " onchange='onchangeHex(this,\"id_dec_%d\",\"id_apply_%d\");'/></td>",$num,$par['value'],$num,$num,$num);
01116 printf ("<td style='text-align:center'><input type=\"checkbox\" name=\"apply_%d\" value=\"1\" %s id='id_apply_%d'/></td>",$num,$par['modified']?'checked':'',$num);
01117 }else {
01118 if (!$readonly) printf ("<td colspan='4'> </td>");
01119 }
01120 printf ("</tr>\n");
01121 }
01122 }
01123 showControlButtonsRow($table_width,$readonly,$testMode,$showSeqMode,$encoded_todo,$imagesNumber,$imagesPerRow,$imgScale,false);
01124 printf ("</table>\n");
01125 printf ("</form>\n");
01126 }
01127 function getDescription ($compositeName,$descriptions){
01128 if (array_key_exists($compositeName,$descriptions)) return $descriptions[$compositeName];
01130 $number=elphel_parse_P_name($compositeName);
01131 if (!$number) return "Unknown name";
01132 $prefix="";
01133
01134 $width= ($number >> 21) & 0x1f;
01135 $bit= ($number >> 16) & 0x1f;
01136 $name=$compositeName;
01137 if ($bit || $width) {
01138 $name=substr($compositeName,0,strlen($compositeName)-strlen('__XXYY'));
01139 if ($width==1) $prefix.= sprintf("This is the bit %d of %s - ",$bit,$name);
01140 else $prefix.= sprintf("This is a bit selection - bits %d through %d of %s - ",$bit,($bit+$width-1),$name);
01141 $number=elphel_parse_P_name($name);
01142 if (!$number) {
01143 echo "Internal error:Unknown name $name of $compositeName";
01144 exit (1);
01145 }
01146 }
01147
01148 if (array_key_exists($name,$descriptions)) return $prefix.$descriptions[$name];
01149 $index="";
01151 while ($name && strpos (" 0123456789", $name[strlen($name)-1])) {
01152 $index= $name[strlen($name)-1].$index;
01153 $name=substr($name, 0, strlen($name)-1);
01154 }
01155 if ($prefix) $prefix.="offset ".$index." of ".$name." - ";
01156 else $prefix.="This is the parameter at offset ".$index." of ".$name." - ";
01157 if (array_key_exists($name,$descriptions)) return $name.": ".$prefix."++".$descriptions[$name];
01158 return $prefix."no description available";
01159 }
01160
01161
01163
01165
01166
01167
01168
01169 function getParDescriptions($autocampars) {
01170 $file=file($autocampars);
01171 $path="";
01172 foreach ($file as $line) if (strpos($line,'$configPath')!==false ){
01173 $name= strtok ($line,'"');
01174 if (strpos ($name,'
01175 $path=strtok ('"');
01176 break;
01177 }
01178 }
01179 $xml = simplexml_load_file($path);
01180 $descriptions=array();
01181 foreach ($xml->descriptions->children() as $entry) {
01182 $descriptions[$entry->getName()]=str_replace('`',"\n",trim((string)$entry,"\""));
01183 }
01184 return $descriptions;
01185 }
01187 ?>