packages/web/353/php_top/parsedit.php

Go to the documentation of this file.
00001 #!/usr/local/sbin/php -q
00002 <?php
00090 //main()
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 //    startPage();
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 //   echo "<pre>";
00144 //    print_r($frame_params);
00145 //   print_r($posted_params);
00146 //    print_r($global_params);
00147 //   var_dump($todo);
00148 //   echo "</pre>";
00149     printPage($encoded_todo);
00150     endPage();
00151 
00152     exit (0);
00157 function printDefaultPage() {
00158 //   $imgsrv="http://".$_SERVER['SERVER_ADDR'].":8081";
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               ."&GTAB_R=0x0a390400"        
00174               ."&GTAB_G=0x0a390400"        
00175               ."&GTAB_GB=0x0a390400"       
00176               ."&GTAB_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               ."&GTAB_R"              
00226               ."&GTAB_G"              
00227               ."&GTAB_GB"             
00228               ."&GTAB_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               ."&GTAB_R"              
00290               ."&GTAB_G"              
00291               ."&GTAB_GB"             
00292               ."&GTAB_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 echo "<pre>";
00369  print_r($done);
00370 echo "</pre>";
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>&nbsp;</td><td>&nbsp;</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 //print_r($done);
00423     printf ("</td>");
00424     printf ("</tr>");
00425   }
00426   printf ("</table>");
00427 
00428 //  print_r($meta['Exif']);
00429 }
00430 
00432 
00433 function showLastImages($numImg,$imagesPerRow,$imgScale) {
00434   $done= decodeTodo ($_GET['done']);
00435 //  $this_exif=elphel_get_exif_elphel(0);
00436   $circbuf_pointers=elphel_get_circbuf_pointers(1);
00437   $framesAgo=0;
00438 //echo "<pre>\n";
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 //print_r($circbuf_pointers);
00456 //print_r($done);
00457 
00458 //echo "</pre>\n";
00459   $meta=array();
00460 //  end($circbuf_pointers);
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   $page_title=sprintf("%d: %s %d images acquired to the circular buffer (circbuf). Acquisition is %s"
00477                       ,$lastFrameNumber
00478                       ,$framesAgo?"$framesAgo frames ago":"Latest"
00479                       ,$numImg
00480                       ,$running?"on - these frames are/will be overwritten in the camera memory":"off"
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>&nbsp;</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 //   print_r($_POST);
00603 //   print_r($posted_params);
00604 //   var_dump($todo);
00605 //   print_r($todo);
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 //   echo "since=$since\n"; ob_flush();  flush();
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 //   exit (0);
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 // nop;
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 //   var_dump($gammas);
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 // echo "<pre>";
00819 //print_r($pars);
00820    $pars=elphel_get_P_arr($pars); 
00821 //print_r($pars);
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 //echo "pars[par['name']]=".$pars[$par['name']]."\n";
00827 //print_r($par);
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 //print_r($par);
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 //  alert ("onchangeDec("+elem.id+","+id_hex+","+id_apply+")");
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 //  alert ("onchangeHex("+elem.id+","+id_dec+","+id_apply+")");
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 //  alert ("onchangeDelay("+elem.id+","+id_apply+")");
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){ // test should be in the URL or it will not be shown on a page
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 //  alert ("url="+url);
00912   var showSeqName="showseq";
00913   refIndex=url.indexOf("&"+showSeqName);
00914   if (refIndex<0)refIndex=url.indexOf("?"+showSeqName);
00915   if (refIndex>=0){ // test should be in the URL or it will not be shown on a page
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 //  alert ("url="+url);
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) { // show link to last images
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='&nbsp;Select&nbsp;\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 //   printf ("<center><h3>$page_title</h3></center>\n");
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 //     echo "circbuf_pointer=$circbuf_pointer";
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 //echo "width=$width, height=$height, embedImageScale=$embedImageScale<br />\n";
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>&nbsp;dec&nbsp;</td>".
01057            "<td>&nbsp;hex&nbsp;</td>");
01058    }
01059    printf ("<td>&nbsp;&nbsp;&nbsp;dec&nbsp;&nbsp;&nbsp;&nbsp;</td>".
01060            "<td>&nbsp;&nbsp;&nbsp;hex&nbsp;&nbsp;&nbsp;&nbsp;</td>");
01061    if (!$readonly) {printf (
01062            "<td>&nbsp;&nbsp;&nbsp;dec&nbsp;&nbsp;&nbsp;&nbsp;</td>".
01063            "<td>&nbsp;&nbsp;&nbsp;hex&nbsp;&nbsp;&nbsp;&nbsp;</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 //       printf ("<tr title='%s'>",$descriptions[$par['name']]);
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'>&nbsp;</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 //       printf ("<tr title='%s'>",$descriptions[$par['name']]);
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'>&nbsp;</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 // is it a bit field?
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 #define FRAMEPAIR_FRAME_BITS(w,b) ((((w) & 0x1f)<<21) | (((b) & 0x1f)<<16))
01165 #define FRAMEPAIR_FRAME_MASK_NEW(a,od,nd) ((((od) ^ ((nd) << (((a)>>16) & 0x1f))) & (((1 << (((a)>>21) & 0x1f))-1) << (((a)>>16) & 0x1f))) ^ (od))
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,'//')===false) {
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 ?>

Generated on Fri Nov 28 00:06:25 2008 for elphel by  doxygen 1.5.1