Commit 28b392c6 authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

Merge branch 'framepars' of https://github.com/Elphel/elphel-web-393 into framepars

parents ab0526c0 d5ba77fb
Loading
Loading
Loading
Loading
+17 −3
Original line number Original line Diff line number Diff line
@@ -418,13 +418,17 @@ CAPTION;
//							$xml->addChild ( 'compressor_irqon_result', fseek ( $circbuf_file, ELPHEL_LSEEK_INTERRUPT_ON, SEEK_END ) ); // #define LSEEK_INTERRUPT_ON 0x24 /// enable camera interrupts
//							$xml->addChild ( 'compressor_irqon_result', fseek ( $circbuf_file, ELPHEL_LSEEK_INTERRUPT_ON, SEEK_END ) ); // #define LSEEK_INTERRUPT_ON 0x24 /// enable camera interrupts
//							fclose ( $circbuf_file );
//							fclose ( $circbuf_file );
// Init turn on cmdseq interrupts, but not compressor ones							
// Init turn on cmdseq interrupts, but not compressor ones							
							$xml->addChild ( 'frame_before' . strval ( $sensor_port ),  elphel_get_frame($sensor_port));
							$xml->addChild ('DEBUG_01_'. strval ( $sensor_port ), $GLOBALS ['framepars_paths'] [$sensor_port]);
							$xml->addChild ('DEBUG_01_'. strval ( $sensor_port ), $GLOBALS ['framepars_paths'] [$sensor_port]);
							$xml->addChild ( 'LSEEK_FRAMEPARS_INIT' . strval ( $sensor_port ), fseek ( $framepars_file, ELPHEL_LSEEK_FRAMEPARS_INIT, SEEK_END ) );
							$xml->addChild ( 'LSEEK_FRAMEPARS_INIT' . strval ( $sensor_port ), fseek ( $framepars_file, ELPHEL_LSEEK_FRAMEPARS_INIT, SEEK_END ) );
							$xml->addChild ( 'elphel_set_P_value' . strval ( $sensor_port ), elphel_set_P_value ( $sensor_port, ELPHEL_SENSOR, 0x00, 0, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC ) ); // / will start detection
							$xml->addChild ( 'elphel_set_P_value' . strval ( $sensor_port ), elphel_set_P_value ( $sensor_port, ELPHEL_SENSOR, 0x00, 0, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC ) ); // / will start detection
							// Seems that next LSEEK_SENSORPROC is not needed as 0->ELPHEL_SENSOR will trigger it anyway
							// Seems that next LSEEK_SENSORPROC is not needed as 0->ELPHEL_SENSOR will trigger it anyway
							// Still try it to make sure new lock handles it
							// Still try it to make sure new lock handles it
//							$xml->addChild ( 'LSEEK_SENSORPROC' . strval ( $sensor_port ), fseek ( $framepars_file, ELPHEL_LSEEK_SENSORPROC, SEEK_END ) );
//							$xml->addChild ( 'LSEEK_SENSORPROC' . strval ( $sensor_port ), fseek ( $framepars_file, ELPHEL_LSEEK_SENSORPROC, SEEK_END ) );
							$frame = 0;
                            //$frame = 0 (in NC353)
							$frame = elphel_get_frame($sensor_port);
							$xml->addChild ( 'frame' . strval ( $sensor_port ),  $frame);
							//elphel_get_frame							
							// gets half-frame
							// gets half-frame
							
							
							elphel_set_P_value ( $sensor_port, ELPHEL_MAXAHEAD, 2, 0, 8 ); // / When servicing interrupts, try programming up to 2 frames ahead of due time)
							elphel_set_P_value ( $sensor_port, ELPHEL_MAXAHEAD, 2, 0, 8 ); // / When servicing interrupts, try programming up to 2 frames ahead of due time)
@@ -436,13 +440,22 @@ CAPTION;
							
							
							elphel_set_P_value ( $sensor_port, ELPHEL_BITS, 8, $frame + 3, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_BITS, 8, $frame + 3, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_QUALITY, 80, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_QUALITY, 80, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR, 1, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR, ELPHEL_CONST_COLORMODE_COLOR, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR_SATURATION_BLUE, 200, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR_SATURATION_BLUE, 200, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR_SATURATION_RED, 200, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COLOR_SATURATION_RED, 200, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_BAYER, 0, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_BAYER, 0, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_GAING, 0x10000, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_GAINGB, 0x10000, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_GAINR, 0x10000, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_GAINB, 0x10000, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_VIGNET_C, 0x8000, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_VIGNET_SHL, 1, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							
							
							
							elphel_set_P_value ( $sensor_port, ELPHEL_SENSOR_RUN, 2, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_SENSOR_RUN, 2, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC );
							elphel_set_P_value ( $sensor_port, ELPHEL_COMPRESSOR_RUN, 2, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC ); // / run compressor
							elphel_set_P_value ( $sensor_port, ELPHEL_COMPRESSOR_RUN, 2, $frame + 4, ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC ); // / run compressor
							
							$xml->addChild ( 'frame_after' . strval ( $sensor_port ),  elphel_get_frame($sensor_port));
							fclose ( $framepars_file );
							fclose ( $framepars_file );
							$gamma = 57;
							$gamma = 57;
							$black = 10;
							$black = 10;
@@ -461,6 +474,7 @@ CAPTION;
							);
							);
							$frame = elphel_get_frame ( $sensor_port ); // 0
							$frame = elphel_get_frame ( $sensor_port ); // 0
							elphel_set_P_arr ( $sensor_port, $gamma_pars, $frame + 3, 0 );
							elphel_set_P_arr ( $sensor_port, $gamma_pars, $frame + 3, 0 );
							$xml->addChild ( 'frame_final' . strval ( $sensor_port ),  elphel_get_frame($sensor_port));
						} else if ($value == "initgamma") {
						} else if ($value == "initgamma") {
							$gammas_file = fopen ( "/dev/gamma_cache", "w+" );
							$gammas_file = fopen ( "/dev/gamma_cache", "w+" );
							$xml->addChild ( 'LSEEK_GAMMA_INIT' . strval ( $sensor_port ), fseek ( $gammas_file, ELPHEL_LSEEK_GAMMA_INIT, SEEK_END ) );
							$xml->addChild ( 'LSEEK_GAMMA_INIT' . strval ( $sensor_port ), fseek ( $gammas_file, ELPHEL_LSEEK_GAMMA_INIT, SEEK_END ) );
+216 −107
Original line number Original line Diff line number Diff line
@@ -124,8 +124,8 @@
    $sensor_port=0; /// TODO: NC393 - add sensor port control, initially will use $sensor_port=0 for all php functions that require it    
    $sensor_port=0; /// TODO: NC393 - add sensor port control, initially will use $sensor_port=0 for all php functions that require it    
    $autocampars='/www/pages/autocampars.php';
    $autocampars='/www/pages/autocampars.php';
    $descriptions=getParDescriptions($autocampars);
    $descriptions=getParDescriptions($autocampars);
    $default_ahead=3;
    $default_ahead=5; // 3;
    $maxahead=6; /// maximal ahead of the current frame that tasks can currently be set to driver;
    $maxahead=6; /// maximal ahead of the current frame that tasks can currently be set to driver; //NC393 - is it the same?
    $minahead=4; /// skip to frame $minahead from the soonest next task before programming
    $minahead=4; /// skip to frame $minahead from the soonest next task before programming
    $brief=true;
    $brief=true;
    $ahead_separator='*';
    $ahead_separator='*';
@@ -135,12 +135,15 @@
    $testBefore=2;/// Start compressor $testBefore frames before first task
    $testBefore=2;/// Start compressor $testBefore frames before first task
    $testAfter=2; /// Stop compressor $testAfter frames after the last task
    $testAfter=2; /// Stop compressor $testAfter frames after the last task
    $framesBeforeStart=2; ///In test mode - compressor will be started theis frames after "now"
    $framesBeforeStart=2; ///In test mode - compressor will be started theis frames after "now"
    $imgsrv="http://".$_SERVER['SERVER_ADDR'].":8081";
//    $imgsrv="http://".$_SERVER['SERVER_ADDR'].":8081";
    $imgsrv_base="http://".$_SERVER['SERVER_ADDR'].":";
    $imgsrv_ports= array ("2323","2324","2325","2326");
    
    /// $imglink="img"; /// use this for faster output (and safer in simultaneous accesses from multiple hosts
    /// $imglink="img"; /// use this for faster output (and safer in simultaneous accesses from multiple hosts
    $imglink="bimg"; ///It was "img" - faster, but image may get corrupted if buffer is overrun before it is trasferred (network congestion)
    $imglink="bimg"; ///It was "img" - faster, but image may get corrupted if buffer is overrun before it is trasferred (network congestion)
    $defaultImgScale=0.2; /// 20% image size
    $defaultImgScale=0.2; /// 20% image size
    $defaultImagesPerRow=3;
    $defaultImagesPerRow=3;
    $defaultImagesNumber=9;
    $defaultImagesNumber= 9; // 12
    $isPost=$_SERVER["REQUEST_METHOD"]=="POST";
    $isPost=$_SERVER["REQUEST_METHOD"]=="POST";
    $ignoreVals=$isPost;
    $ignoreVals=$isPost;
    $imagesNumber=$defaultImagesNumber;
    $imagesNumber=$defaultImagesNumber;
@@ -164,6 +167,8 @@
    if (array_key_exists ( 'sensor_port', $_GET )) {
    if (array_key_exists ( 'sensor_port', $_GET )) {
    	$GLOBALS [sensor_port] = (myval($_GET ['sensor_port'])) & 3;
    	$GLOBALS [sensor_port] = (myval($_GET ['sensor_port'])) & 3;
    }
    }
    
    $imgsrv = $imgsrv_base.$imgsrv_ports[$GLOBALS [sensor_port]];
    $elp_const=get_defined_constants(true);
    $elp_const=get_defined_constants(true);
    $elp_const=$elp_const["elphel"];
    $elp_const=$elp_const["elphel"];
    $immediateMode=parseGetNames(); 
    $immediateMode=parseGetNames(); 
@@ -495,7 +500,7 @@ USAGE;




/// show table with last acquired images and meta data
/// show table with last acquired images and meta data
/// TODO: show chnaged parameters for those frames? ***
/// TODO: show changed parameters for those frames? ***
function showImgData($meta,$skipped,$prev,$imgScale,$done) {
function showImgData($meta,$skipped,$prev,$imgScale,$done) {
  global $imgsrv,$imglink;
  global $imgsrv,$imglink;
  $width= $meta['meta']['width'];
  $width= $meta['meta']['width'];
@@ -572,15 +577,22 @@ echo "</pre>";
///TODO:if $todo is provided in $_GET - try to find the correct images even if they are not the latest
///TODO:if $todo is provided in $_GET - try to find the correct images even if they are not the latest


function showLastImages($numImg, $imagesPerRow, $imgScale) {
function showLastImages($numImg, $imagesPerRow, $imgScale) {
//	elphel_update_exif(); // just for testing
	$done = decodeTodo ( $_GET ['done'] );
	$done = decodeTodo ( $_GET ['done'] );
	// $this_exif=elphel_get_exif_elphel(0);
	// $this_exif=elphel_get_exif_elphel(0);
	$circbuf_pointers = elphel_get_circbuf_pointers ( $GLOBALS [sensor_port], 1 );
	$circbuf_pointers = elphel_get_circbuf_pointers ( $GLOBALS [sensor_port], 1 );
	echo "<!--";
	var_dump($circbuf_pointers);
	var_dump($done);
	var_dump($numImg);
	echo "-->";
	$framesAgo = 0;
	$framesAgo = 0;
	// echo "<pre>\n";
	// echo "<pre>\n";
	end ( $circbuf_pointers );
	end ( $circbuf_pointers );
	if ($done) {
	if ($done) {
		end ( $done );
		end ( $done );
		$lastFrameNumber = key ( $done );
		$lastFrameNumber = key ( $done );
//		$lastFrameNumber = key ( $done ) + 9; // NC393 debugging
		$cur_ptr = current ( $circbuf_pointers );
		$cur_ptr = current ( $circbuf_pointers );
		while ( $cur_ptr ['frame'] > $lastFrameNumber ) {
		while ( $cur_ptr ['frame'] > $lastFrameNumber ) {
			if (! prev ( $circbuf_pointers )) { // / failed to find the right frame in circbuf - probably overwritten
			if (! prev ( $circbuf_pointers )) { // / failed to find the right frame in circbuf - probably overwritten
@@ -590,7 +602,6 @@ function showLastImages($numImg,$imagesPerRow,$imgScale) {
			$cur_ptr = current ( $circbuf_pointers );
			$cur_ptr = current ( $circbuf_pointers );
			$framesAgo ++;
			$framesAgo ++;
		}
		}

	}
	}
	// /TODO: If all changes were later than the images shown - disregard $todo
	// /TODO: If all changes were later than the images shown - disregard $todo
	// print_r($circbuf_pointers);
	// print_r($circbuf_pointers);
@@ -601,25 +612,30 @@ function showLastImages($numImg,$imagesPerRow,$imgScale) {
	// end($circbuf_pointers);
	// end($circbuf_pointers);
	$lastFrameIndex = key ( $circbuf_pointers );
	$lastFrameIndex = key ( $circbuf_pointers );
	for($i = 0; $i <= min ( ($numImg - 1), $lastFrameIndex ); $i ++) {
	for($i = 0; $i <= min ( ($numImg - 1), $lastFrameIndex ); $i ++) {
    $meta[$i]=array('circbuf_pointer'=>$circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['circbuf_pointer'],
		$meta [$i] = array (
                    'meta'=>elphel_get_interframe_meta($GLOBALS [sensor_port],$circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['circbuf_pointer']),
				'circbuf_pointer' => $circbuf_pointers [$lastFrameIndex - ($numImg - 1) + $i] ['circbuf_pointer'],
                    'Exif'=>elphel_get_exif_elphel    ($GLOBALS [sensor_port],$circbuf_pointers[$lastFrameIndex-($numImg-1)+$i]['exif_pointer']));
				'meta' => elphel_get_interframe_meta (
						$GLOBALS [sensor_port],
						$circbuf_pointers [$lastFrameIndex - ($numImg - 1) + $i] ['circbuf_pointer'] ),
				'Exif' => elphel_get_exif_elphel (
						$GLOBALS [sensor_port],
						$circbuf_pointers [$lastFrameIndex - ($numImg - 1) + $i] ['exif_pointer'] ) 
		);
		$lastFrameNumber = $circbuf_pointers [$lastFrameIndex - ($numImg - 1) + $i] ['frame'];
		$lastFrameNumber = $circbuf_pointers [$lastFrameIndex - ($numImg - 1) + $i] ['frame'];
	}
	}
  $running=(elphel_get_P_value($GLOBALS [sensor_port], ELPHEL_COMPRESSOR_RUN)==ELPHEL_CONST_COMPRESSOR_RUN_CONT) &&
	echo "<!--";
           (elphel_get_P_value($GLOBALS [sensor_port], ELPHEL_SENSOR_RUN)==ELPHEL_CONST_SENSOR_RUN_CONT);
	var_dump($meta);
  $page_title=sprintf("%s %d images acquired to the circular buffer (circbuf). Acquisition is %s. Last frame is %d"
	echo "-->";
                      ,$framesAgo?"$framesAgo frames (stored) ago":"Latest"
	
                      ,$numImg
	$running = (elphel_get_P_value ( $GLOBALS [sensor_port], ELPHEL_COMPRESSOR_RUN ) == ELPHEL_CONST_COMPRESSOR_RUN_CONT) && (elphel_get_P_value ( $GLOBALS [sensor_port], ELPHEL_SENSOR_RUN ) == ELPHEL_CONST_SENSOR_RUN_CONT);
                      ,$running?"on - these frames are/will be overwritten in the camera memory":"off"
	$page_title = sprintf ( "%s %d images acquired to the circular buffer (circbuf). Acquisition is %s. Last frame is %d", $framesAgo ? "$framesAgo frames (stored) ago" : "Latest", $numImg, $running ? "on - these frames are/will be overwritten in the camera memory" : "off", $lastFrameNumber );
                      ,$lastFrameNumber);
	/*
	/*
  $page_title=sprintf("%d: %s %d images acquired to the circular buffer (circbuf). Acquisition is %s"
	 * $page_title=sprintf("%d: %s %d images acquired to the circular buffer (circbuf). Acquisition is %s"
                      ,$lastFrameNumber
	 * ,$lastFrameNumber
                      ,$framesAgo?"$framesAgo frames ago":"Latest"
	 * ,$framesAgo?"$framesAgo frames ago":"Latest"
                      ,$numImg
	 * ,$numImg
                      ,$running?"on - these frames are/will be overwritten in the camera memory":"off"
	 * ,$running?"on - these frames are/will be overwritten in the camera memory":"off"
                      );
	 * );
	 */
	 */
	startPage ( $page_title, "" );
	startPage ( $page_title, "" );
	printf ( "<h4>%s</h4>\n", $page_title );
	printf ( "<h4>%s</h4>\n", $page_title );
@@ -734,7 +750,7 @@ function showSequence($todo,$frame_zero) {
   printf ("</table>\n"); 
   printf ("</table>\n"); 
}
}


function  applyPost($todo,$noFinalWait=false) {
function  applyPost_debug($todo,$noFinalWait=false) {
   global $maxahead,$minahead,$frame_zero,$showSeqMode;
   global $maxahead,$minahead,$frame_zero,$showSeqMode;
   if ($showSeqMode>0) {
   if ($showSeqMode>0) {
     printf("<h4>Running sequence...</h4>\n");
     printf("<h4>Running sequence...</h4>\n");
@@ -747,10 +763,12 @@ function applyPost($todo,$noFinalWait=false) {


/// Skip to the next frame (so more deterministic phase - maximal time till next frame)
/// Skip to the next frame (so more deterministic phase - maximal time till next frame)
   $waitingEnabled=true;
   $waitingEnabled=true;
   /*
   foreach ($todo as $pars) if (array_key_exists('SENSOR', $pars)) {
   foreach ($todo as $pars) if (array_key_exists('SENSOR', $pars)) {
     $waitingEnabled=false;
     $waitingEnabled=false;
     break;
     break;
   }
   }
   */
   if (elphel_get_frame($GLOBALS [sensor_port])< 8) $waitingEnabled=false; /// or is "==0" enough?
   if (elphel_get_frame($GLOBALS [sensor_port])< 8) $waitingEnabled=false; /// or is "==0" enough?
   if ($waitingEnabled && !$noFinalWait) elphel_skip_frames($GLOBALS [sensor_port],1); // in GET mode, do not skip any frames
   if ($waitingEnabled && !$noFinalWait) elphel_skip_frames($GLOBALS [sensor_port],1); // in GET mode, do not skip any frames
/// store the current frame number as reference for all actions delays
/// store the current frame number as reference for all actions delays
@@ -763,15 +781,103 @@ function applyPost($todo,$noFinalWait=false) {
       $frame_since=$since-$minahead;
       $frame_since=$since-$minahead;
       $frame_now=$frame_since+$frame_zero;
       $frame_now=$frame_since+$frame_zero;
			if ($waitingEnabled) {
			if ($waitingEnabled) {
				if ($showSeqMode > 0) {
					printf ( "waiting frame %d (0x%x) ...s=%d, fs=%d noFinalWait=",
							$frame_now, $frame_now, $since, $frame_since, $noFinalWait);
					ob_flush ();
					flush ();
				}
				elphel_wait_frame_abs ( $GLOBALS [sensor_port], $frame_now );
				if ($showSeqMode > 0) {
					printf ( "done\n" );
					ob_flush ();
					flush ();
				}
			}
     }
     elphel_set_P_arr ($GLOBALS [sensor_port], $pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC); /// Are these flags needed?
//     if ($showSeqMode > 0) {
//     	printf ( "frame_zero=%d, since=%d",$frame_zero,$since);
//     	printf ( "elphel_set_P_arr ($GLOBALS [sensor_port], $pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC)");
//     	ob_flush ();
//     	flush ();
//     }
   }
   if (!$noFinalWait) {
     $frame_now=$since+$frame_zero+1; /// wait just 1 frame longer that the target of the last command in $todo
//     $frame_now+=256;
     //     if ($showSeqMode > 0) {
//     	printf ( "frame_zero=%d, since=%d",$frame_zero,$since);
//     	printf ( "elphel_set_P_arr ($GLOBALS [sensor_port], $pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC)");
//     	ob_flush ();
//     	flush ();
//     }
      
     //   echo "since=$since\n"; ob_flush();  flush();
     if ($showSeqMode>0) {printf ("(final) waiting frame %d (0x%x) ... ",$frame_now,$frame_now);  ob_flush();  flush();}
     if ($waitingEnabled) {
        $rslt = elphel_wait_frame_abs($GLOBALS [sensor_port], $frame_now);
     } else {
       $timeout_step=  100000; /// 0.1 sec
       $timeout=      3000000; /// 3.0sec
       for ($i=0 ; $i < $timeout; $i+=$timeout_step) {
        if (elphel_get_frame($GLOBALS [sensor_port])>=$frame_now) break;
        usleep($timeout_step);
       }
     }
   }
//   $rslt2 = elphel_wait_frame_abs($GLOBALS [sensor_port], 100);
//   $rslt3 = elphel_wait_frame_abs($GLOBALS [sensor_port], $frame_now);
//   $rslt4 = elphel_skip_frames($GLOBALS [sensor_port],4);
    
   if ($showSeqMode>0) {printf ("done, frame is %d, rslt=%d, frame_now was %d, waitingEnabled=%d\n",
   		elphel_get_frame($GLOBALS [sensor_port]), $rslt, $frame_now, $waitingEnabled);
   		ob_flush();  flush();
   }
   if ($showSeqMode>0) echo "</pre>";
//   exit (0);
}

function  applyPost($todo,$noFinalWait=false) {
	global $maxahead,$minahead,$frame_zero,$showSeqMode;
	if ($showSeqMode>0) {
		printf("<h4>Running sequence...</h4>\n");
		echo "<pre>";
	}
	//   print_r($_POST);
	//   print_r($posted_params);
	//   var_dump($todo);
	//   print_r($todo);
	/// Skip to the next frame (so more deterministic phase - maximal time till next frame)
	$waitingEnabled=true;
	foreach ($todo as $pars) if (array_key_exists('SENSOR', $pars)) {
		$waitingEnabled=false;
		break;
	}
	if (elphel_get_frame($GLOBALS [sensor_port])< 8) $waitingEnabled=false; /// or is "==0" enough?
	if ($waitingEnabled && !$noFinalWait) elphel_skip_frames($GLOBALS [sensor_port],1); // in GET mode, do not skip any frames
	/// store the current frame number as reference for all actions delays
	$frame_zero=elphel_get_frame($GLOBALS [sensor_port]);
	$frame_since=0;
	$frame_now=$frame_zero;
	///Iterate through $todo array, programming the parameter changes
	foreach ($todo as $since=>$pgmpars) {
		if (($since-$maxahead) >$frame_since ) { /// too early to program, need to wait
			$frame_since=$since-$minahead;
			$frame_now=$frame_since+$frame_zero;
//			$frame_now=$frame_since+$frame_zero+2; // NC393: adding 2 extra
			if ($waitingEnabled) {
//			$frame_now=$frame_since+$frame_zero;
				if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now);  ob_flush();  flush();}
				if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now);  ob_flush();  flush();}
				elphel_wait_frame_abs($GLOBALS [sensor_port], $frame_now);
				elphel_wait_frame_abs($GLOBALS [sensor_port], $frame_now);
         if ($showSeqMode>0) {printf ("done\n");   ob_flush();  flush();}
				if ($showSeqMode>0) {printf ("done (%d)\n", elphel_get_frame($GLOBALS [sensor_port]));   ob_flush();  flush();}
			}
			}
		}
		}
		elphel_set_P_arr ($GLOBALS [sensor_port], $pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC); /// Are these flags needed?
		elphel_set_P_arr ($GLOBALS [sensor_port], $pgmpars, $frame_zero+$since,ELPHEL_CONST_FRAMEPAIR_FORCE_NEWPROC); /// Are these flags needed?
	}
	}
	if (!$noFinalWait) {
	if (!$noFinalWait) {
		$frame_now=$since+$frame_zero+1; /// wait just 1 frame longer that the target of the last command in $todo
		$frame_now=$since+$frame_zero+1; /// wait just 1 frame longer that the target of the last command in $todo
//		$frame_now=$since+$frame_zero+4; /// wait just 1 frame longer that the target of the last command in $todo
		//   echo "since=$since\n"; ob_flush();  flush();
		//   echo "since=$since\n"; ob_flush();  flush();
		if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now);  ob_flush();  flush();}
		if ($showSeqMode>0) {printf ("waiting frame %d (0x%x) ... ",$frame_now,$frame_now);  ob_flush();  flush();}
		if ($waitingEnabled) {
		if ($waitingEnabled) {
@@ -784,12 +890,15 @@ function applyPost($todo,$noFinalWait=false) {
				usleep($timeout_step);
				usleep($timeout_step);
			}
			}
		}
		}
//	} else { // just debugging - still waiting
//		elphel_skip_frames($GLOBALS [sensor_port],8); // skip 8 frames - debugging NC393 - no differnce!
	}
	}
   if ($showSeqMode>0) {printf ("done\n");   ob_flush();  flush();}
	if ($showSeqMode>0) {printf ("done (%d, 0x%x)\n", elphel_get_frame($GLOBALS [sensor_port]), elphel_get_frame($GLOBALS [sensor_port]));   ob_flush();  flush();}
	if ($showSeqMode>0) echo "</pre>";
	if ($showSeqMode>0) echo "</pre>";
	//   exit (0);
	//   exit (0);
}
}



function  parsePost() {
function  parsePost() {
   global $_POST,$testMode,$showSeqMode,$posted_params;
   global $_POST,$testMode,$showSeqMode,$posted_params;
   $posted_params=array();
   $posted_params=array();
@@ -1204,11 +1313,11 @@ function printPage($encoded_todo) {
   printf ("<table border='1' style='font-family: Courier, monospace;'>\n");
   printf ("<table border='1' style='font-family: Courier, monospace;'>\n");


   if ($embedImageScale) {
   if ($embedImageScale) {
     $fd_circ=fopen("/dev/circbuf","r");
     $fd_circ=fopen("/dev/circbuf".strval($GLOBALS['sensor_port']),"r");
     fseek($fd_circ, ELPHEL_LSEEK_CIRC_LAST,SEEK_END);
     fseek($fd_circ, ELPHEL_LSEEK_CIRC_LAST,SEEK_END);
     $circbuf_pointer=ftell($fd_circ);
     $circbuf_pointer=ftell($fd_circ);
     fclose($fd_circ);
     fclose($fd_circ);
//     echo "circbuf_pointer=$circbuf_pointer";

     if ($circbuf_pointer>=0) {
     if ($circbuf_pointer>=0) {
       $meta=elphel_get_interframe_meta($GLOBALS [sensor_port], $circbuf_pointer);
       $meta=elphel_get_interframe_meta($GLOBALS [sensor_port], $circbuf_pointer);
       $width= floor($meta['width']*$embedImageScale);
       $width= floor($meta['width']*$embedImageScale);