Commit c028de54 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

modified/tested for eyesis

parent 8ba46614
Loading
Loading
Loading
Loading
+61 −71
Original line number Original line Diff line number Diff line
@@ -276,7 +276,7 @@ log_msg("Processing camera state: " . $GLOBALS['camera_state_arr']['state']);


get_sysfs_sensors();
get_sysfs_sensors();


log_msg("Sensors map read from the sysfs:\n".str_sensors($GLOBALS['sensors']),1);
log_msg("Sensors map read from the sysfs: ".str_sensors($GLOBALS['sensors'],1),1);


$GLOBALS['useDefaultPageNumber'] = 15;
$GLOBALS['useDefaultPageNumber'] = 15;
$GLOBALS['protectedPage'] = 0; // / change to -1 to enable saving to page 0
$GLOBALS['protectedPage'] = 0; // / change to -1 to enable saving to page 0
@@ -507,15 +507,15 @@ function update_minor_version($port, $silent = 0) {
		if (substr ( $GLOBALS ['configs'] [$port] ['version'], 0, strrpos ( $GLOBALS ['configs'] [$port] ['version'], '.' ) ) ==
		if (substr ( $GLOBALS ['configs'] [$port] ['version'], 0, strrpos ( $GLOBALS ['configs'] [$port] ['version'], '.' ) ) ==
				substr ( $GLOBALS ['version'], 0, strrpos ( $GLOBALS ['version'], '.' ) )) {
				substr ( $GLOBALS ['version'], 0, strrpos ( $GLOBALS ['version'], '.' ) )) {
			if (!$silent) {		
			if (!$silent) {		
				log_msg ( "+++ WARNING: updating minor mismatch version for port $port: " .
				log_msg ( "WARNING: updating minor mismatch version for port $port: " .
						$GLOBALS ['configs'] [$port] ['version'] . " to " . $GLOBALS ['version'] );
						$GLOBALS ['configs'] [$port] ['version'] . " to " . $GLOBALS ['version'], 4);
			}
			}
			$GLOBALS ['configs'] [$port] ['version'] = $GLOBALS ['version'];
			$GLOBALS ['configs'] [$port] ['version'] = $GLOBALS ['version'];
			$GLOBALS['configs'][$port]['version'] = $GLOBALS['version'];
			$GLOBALS['configs'][$port]['version'] = $GLOBALS['version'];
			saveRotateConfig ($port, $GLOBALS['numBackups'] );
			saveRotateConfig ($port, $GLOBALS['numBackups'] );
		} else {
		} else {
			log_msg ( "+++ ERROR: Can not auto-update version for port $port as MAJOR revision differs: " .
			log_msg ( "ERROR: Can not auto-update version for port $port as MAJOR revision differs: " .
					$GLOBALS ['configs'] [$port] ['version'] . " to " . $GLOBALS ['version'] );
					$GLOBALS ['configs'] [$port] ['version'] . " to " . $GLOBALS ['version'], 2);
		}
		}
	}
	}
}
}
@@ -625,15 +625,16 @@ function detect_camera(){
				}
				}
			}
			}
			if ($needupdate)  {
			if ($needupdate)  {
				log_msg("Sensors not disabled by the application mode (10389 EEPROM):\n".str_sensors($GLOBALS['sensors']),1);
				log_msg("Sensors not disabled by the application mode (10389 EEPROM): ".str_sensors($GLOBALS['sensors'],1),1);
				update_sysfs_sensors();
				update_sysfs_sensors();
			}
			}
			
			
			// All eyesis cameras - disable fan control to re-use for 10359 power
			// All eyesis cameras - disable fan control to re-use for 10359 power
			if ($GLOBALS['camera_state_arr']['eyesis_power']){ // disable fan control, reuse it to control power
			if ($GLOBALS['camera_state_arr']['eyesis_power']){ // disable fan control, reuse it to control power
				$rslt=set_eyesis_power_control();
				$rslt=set_eyesis_power_control();
				log_msg("set_eyesis_power_control()=>".print_r($rslt,1));
				log_msg("Setting sensors/multiplexers power");
				log_msg("GLOBALS['camera_state_arr']=>".print_r($GLOBALS['camera_state_arr'],1));
				log_msg("set_eyesis_power_control()=>".print_r($rslt,1),0);
				log_msg("GLOBALS['camera_state_arr']=>".print_r($GLOBALS['camera_state_arr'],1),0);
			}
			}
			// Set IPs of slave cameras (if any)
			// Set IPs of slave cameras (if any)
			if ($multicamera) {
			if ($multicamera) {
@@ -658,7 +659,7 @@ function detect_camera(){
			}
			}
			
			
			log_msg("Continue with master camera");
			log_msg("Continue with master camera");
			log_msg("=== Setting FPGA and sensor power ===");
			log_msg("Setting FPGA and sensor power");


			if ($GLOBALS['camera_state_arr']['has_slaves']) {
			if ($GLOBALS['camera_state_arr']['has_slaves']) {
				$rslt = wait_slaves_boot ($GLOBALS['BOOT_RETRIES']);
				$rslt = wait_slaves_boot ($GLOBALS['BOOT_RETRIES']);
@@ -737,8 +738,8 @@ function detect_camera(){
				fclose($f);
				fclose($f);
				log_msg("Started detection for sensor port ".$port);
				log_msg("Started detection for sensor port ".$port);
			}
			}
			log_msg("System FPGA version:   ".trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/fpga_version')));
			log_msg("System FPGA version:   ".trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/fpga_version')), 3);
			log_msg("Sensor interface type: ".trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/fpga_sensor_interface')));
			log_msg("Sensor interface type: ".trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/fpga_sensor_interface')), 3);
			log_msg("All frames:\n"          .trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/all_frames')),0);
			log_msg("All frames:\n"          .trim(file_get_contents('/sys/devices/soc0/elphel393-framepars@0/all_frames')),0);
			log_msg('Frames: '. implode(", ",$frame_nums),0);
			log_msg('Frames: '. implode(", ",$frame_nums),0);
				
				
@@ -747,7 +748,7 @@ function detect_camera(){
			foreach ($GLOBALS['ports'] as $port) {
			foreach ($GLOBALS['ports'] as $port) {
				if (elphel_get_P_value ( $port, ELPHEL_SENSOR) != $sensor_code){
				if (elphel_get_P_value ( $port, ELPHEL_SENSOR) != $sensor_code){
					log_msg("#### Wrong/missing sensor on port ".$port.", code=".elphel_get_P_value ( $port, ELPHEL_SENSOR).
					log_msg("#### Wrong/missing sensor on port ".$port.", code=".elphel_get_P_value ( $port, ELPHEL_SENSOR).
							' (expected '.$sensor_code.") . Driver reports errors until port is disabled at later stage ####",1);
							' (expected '.$sensor_code.") . Driver reports errors until port is disabled at later stage ####",2);
					for ($chn =0; $chn <4; $chn++) {
					for ($chn =0; $chn <4; $chn++) {
						$GLOBALS['sensors'][$port][$chn] = 'none';
						$GLOBALS['sensors'][$port][$chn] = 'none';
					}
					}
@@ -775,7 +776,7 @@ function detect_camera(){
				}
				}
			}
			}
			if ($needupdate)  update_sysfs_sensors();
			if ($needupdate)  update_sysfs_sensors();
			log_msg("detected sensors:\n".str_sensors($GLOBALS['sensors']),1);
			log_msg("Detected sensors: ".str_sensors($GLOBALS['sensors'],1),3);
				
				
			// Collect results from slave channels that were running in parallel
			// Collect results from slave channels that were running in parallel
			$nrep =0;
			$nrep =0;
@@ -838,9 +839,10 @@ function detect_camera(){


			if (isset ($curl_data)){ // wait and collect responses
			if (isset ($curl_data)){ // wait and collect responses
				$enable_echo = !array_key_exists('REQUEST_METHOD',$_SERVER);
				$enable_echo = !array_key_exists('REQUEST_METHOD',$_SERVER);
				if ($enable_echo) echo "Waiting slaves to finish: ";
				if ($enable_echo) echo colorize("Waiting slaves to finish (number left): ",'YELLOW',0);
				$results =  curl_multi_finish($curl_data, true, 0, $enable_echo); // Switch true -> false if errors are reported (other output damaged XML)
				$results =  curl_multi_finish($curl_data, true, 0, $enable_echo); // Switch true -> false if errors are reported (other output damaged XML)
				log_msg('curl_multi returned: '.print_r($results,1));
				if ($enable_echo) echo colorize(" DONE\n",'GREEN',0);
				log_msg('curl_multi returned: '.print_r($results,1),0);
			}
			}
			if ($GLOBALS['camera_state_arr']['exit_stage'] == $GLOBALS['camera_state_arr']['state']){
			if ($GLOBALS['camera_state_arr']['exit_stage'] == $GLOBALS['camera_state_arr']['state']){
				respond_xml($GLOBALS['camera_state_arr']['state']);
				respond_xml($GLOBALS['camera_state_arr']['state']);
@@ -854,10 +856,16 @@ function detect_camera(){
	
	
}
}


function str_sensors($sens_arr){
function str_sensors($sens_arr,$inline=0){
	$sports=array();
	$sports=array();
	if ($inline) {
		foreach ($sens_arr as $port=>$subchn)	$sports[]=implode(", ",$subchn);
		return '['.implode("],[",$sports).']';
	} else {
		foreach ($sens_arr as $port=>$subchn)	$sports[]=$port.': '.implode(", ",$subchn);
		foreach ($sens_arr as $port=>$subchn)	$sports[]=$port.': '.implode(", ",$subchn);
		return implode("\n",$sports);
		return implode("\n",$sports);
		
	}
}
}




@@ -906,7 +914,7 @@ function init_cameras(){ // $page) { init can only be from default page as page
					$urls[] = "http://" . $ip . "/autocampars.php?init_stage=SENSORS_SYNCHRONIZED&exit_stage=INITIALIZED";
					$urls[] = "http://" . $ip . "/autocampars.php?init_stage=SENSORS_SYNCHRONIZED&exit_stage=INITIALIZED";
				}
				}
				$curl_data = curl_multi_start ($urls);
				$curl_data = curl_multi_start ($urls);
				log_msg ($cmd . 'Started curl_multi: '.print_r($urls),0);
				log_msg ($cmd . 'Started curl_multi: '.print_r($urls,1),0);
			}			
			}			
			
			
			// Set most parameters in immediate mode (to protect from i2c 64-command overflow),
			// Set most parameters in immediate mode (to protect from i2c 64-command overflow),
@@ -1020,7 +1028,7 @@ function init_cameras(){ // $page) { init can only be from default page as page
					log_msg("2.Trigger $i:\n".file_get_contents('/sys/devices/soc0/elphel393-framepars@0/all_frames'));
					log_msg("2.Trigger $i:\n".file_get_contents('/sys/devices/soc0/elphel393-framepars@0/all_frames'));
				}
				}
				elphel_set_P_arr ($GLOBALS['master_port'], $GLOBALS['trig_pars']); // set other parameters - they will not take effect immediately
				elphel_set_P_arr ($GLOBALS['master_port'], $GLOBALS['trig_pars']); // set other parameters - they will not take effect immediately
				log_msg("Started camera in free running mode");
				log_msg("Started camera in free running mode",3);
				log_msg("Reached state ".$GLOBALS['camera_state_arr']['state']);
				log_msg("Reached state ".$GLOBALS['camera_state_arr']['state']);
				
				
			} else if (!array_key_exists('TRIG_CONDITION',$GLOBALS['trig_pars']) || !$GLOBALS['trig_pars']['TRIG_CONDITION']){
			} else if (!array_key_exists('TRIG_CONDITION',$GLOBALS['trig_pars']) || !$GLOBALS['trig_pars']['TRIG_CONDITION']){
@@ -1037,7 +1045,7 @@ function init_cameras(){ // $page) { init can only be from default page as page
				usleep ($GLOBALS['camera_state_arr']['max_frame_time']);
				usleep ($GLOBALS['camera_state_arr']['max_frame_time']);
				if ($trig_period){
				if ($trig_period){
					elphel_set_P_value ( $GLOBALS['master_port'], ELPHEL_TRIG_PERIOD,  $trig_period, ELPHEL_CONST_FRAME_IMMED);
					elphel_set_P_value ( $GLOBALS['master_port'], ELPHEL_TRIG_PERIOD,  $trig_period, ELPHEL_CONST_FRAME_IMMED);
					log_msg("Started camera in periodic self-triggered mode, period = ".(0.00000001*$trig_period)." s");
					log_msg("Started camera in periodic self-triggered mode, period = ".(0.00000001*$trig_period)." s",3);
				} else { // manually advance frames
				} else { // manually advance frames
					if (!$GLOBALS['camera_state_arr']['frames_skip_more'] >  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD){
					if (!$GLOBALS['camera_state_arr']['frames_skip_more'] >  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD){
						$GLOBALS['camera_state_arr']['frames_skip_more'] =  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD + 1;
						$GLOBALS['camera_state_arr']['frames_skip_more'] =  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD + 1;
@@ -1077,8 +1085,9 @@ function init_cameras(){ // $page) { init can only be from default page as page
					log_msg("  trig_period = $trig_period");
					log_msg("  trig_period = $trig_period");
					log_msg("Remaining  GLOBALS[trig_pars] = ".print_r($GLOBALS['trig_pars'],1));
					log_msg("Remaining  GLOBALS[trig_pars] = ".print_r($GLOBALS['trig_pars'],1));
					$enable_echo = !array_key_exists ('REQUEST_METHOD', $_SERVER);
					$enable_echo = !array_key_exists ('REQUEST_METHOD', $_SERVER);
					if ($enable_echo) echo "Waiting slaves to finish initialization: ";
					if ($enable_echo) echo colorize("Waiting slaves to finish initialization (number left): ",'YELLOW',0);
					$results = curl_multi_finish ($curl_data, true, 0, $enable_echo);
					$results = curl_multi_finish ($curl_data, true, 0, $enable_echo);
					if ($enable_echo) echo colorize(" DONE\n",'GREEN',0);
					////$results = curl_multi_finish ($curl_data, false, 0, $enable_echo);
					////$results = curl_multi_finish ($curl_data, false, 0, $enable_echo);
					log_msg ('curl_multi returned: ' . print_r ($results, 1));
					log_msg ('curl_multi returned: ' . print_r ($results, 1));
					unset ($curl_data);
					unset ($curl_data);
@@ -1091,7 +1100,7 @@ function init_cameras(){ // $page) { init can only be from default page as page
					}
					}
					if ($trig_period){
					if ($trig_period){
						elphel_set_P_value ( $GLOBALS['master_port'], ELPHEL_TRIG_PERIOD,  $trig_period, ELPHEL_CONST_FRAME_IMMED);
						elphel_set_P_value ( $GLOBALS['master_port'], ELPHEL_TRIG_PERIOD,  $trig_period, ELPHEL_CONST_FRAME_IMMED);
						log_msg("Started camera in periodic mode, period = ".(0.00000001*$trig_period)." s");
						log_msg("Started camera in periodic mode, period = ".(0.00000001*$trig_period)." s",3);
					} else { // manually advance frames
					} else { // manually advance frames
						if (!$GLOBALS['camera_state_arr']['frames_skip_more'] >  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD){
						if (!$GLOBALS['camera_state_arr']['frames_skip_more'] >  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD){
							$GLOBALS['camera_state_arr']['frames_skip_more'] =  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD + 1;
							$GLOBALS['camera_state_arr']['frames_skip_more'] =  ELPHEL_CONST_FRAME_DEAFAULT_AHEAD + 1;
@@ -1196,38 +1205,7 @@ function update_sysfs_sensors()
	get_sysfs_sensors();
	get_sysfs_sensors();
	log_msg ("Updated sysfs sensor map");
	log_msg ("Updated sysfs sensor map");
}
}
/*
def colorize(string, color, bold):
    color=color.upper()
    attr = []
    if color == 'RED':
        attr.append('31')
    elif color == 'GREEN':    
        attr.append('32')
    elif color == 'YELLOW':    
        attr.append('33')
    elif color == 'BLUE':    
        attr.append('34')
    elif color == 'MAGENTA':    
        attr.append('35')
    elif color == 'CYAN':    
        attr.append('36')
    elif color == 'GRAY':    
        attr.append('37')
    else:
        pass
        # red
    if bold:
        attr.append('1')
    return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), string)
def log_msg(msg):
    with open ('/proc/uptime') as f: 
        t=float(f.read().split()[0])
    with open(LOGFILE,'a') as msg_file:
        print (colorize("[%8.2f] %s: "%(t, sys.argv[0].split('/')[-1].split('.')[0]),'YELLOW',0)+msg)
        print("[%8.2f]  %s"%(t,msg),file=msg_file)


 */
function colorize($string, $color, $bold) {
function colorize($string, $color, $bold) {
	$color = strtoupper($color);
	$color = strtoupper($color);
	$attr = array();
	$attr = array();
@@ -1253,23 +1231,38 @@ function get_uptime(){
function log_open(){
function log_open(){
	$GLOBALS['logFile'] = fopen ( $GLOBALS['logFilePath'], "a" );
	$GLOBALS['logFile'] = fopen ( $GLOBALS['logFilePath'], "a" );
}
}
function log_msg($msg, $any_length = -1) {

/** Log message and optionally print to console */
function log_msg($msg,         ///< message to print
		         $mode = -1)   ///< -1 - print only short messages, 0 - never print, 1 - always print, 2 print in bold red (error), 3 - bold white, 4 - bold yellow (warning)
{
// do not output log when in HTTP request mode
// do not output log when in HTTP request mode
	$ut=get_uptime();
	$ut=get_uptime();
	if (($any_length != 0) && !array_key_exists ('REQUEST_METHOD', $_SERVER) && (($any_length > 0) || (strlen ($msg) < $GLOBALS['LOG_MAX_ECHO']))) {
	if (($mode != 0) && !array_key_exists ('REQUEST_METHOD', $_SERVER) && (($mode > 0) || (strlen ($msg) < $GLOBALS['LOG_MAX_ECHO']))) {
//		echo '('.date ("G:i:s").' autocampars) ' . $msg . "\n";
		switch ($mode) {
		printf(colorize(sprintf("[%8.2f] autocampars: ",$ut),"GREEN",0).$msg."\n");
			case 2:
				$emsg = colorize($msg,'RED',1); // bold red
				break;
			case 3:
				$emsg = colorize($msg,'',1);    // bold white
				break;
			case 4 :
				$emsg = colorize($msg, 'YELLOW', 1); // bold white
				break;
			default:
				$emsg = $msg;
		}
		printf(colorize(sprintf("[%8.2f] autocampars: ",$ut),"GREEN",0).$emsg."\n");
	}
	}
//	fwrite ($GLOBALS['logFile'], $msg . " at " . date ("F j, Y, G:i:s") . "\n");
	fwrite ($GLOBALS['logFile'], sprintf("%08.2f autocampars: %s\n",$ut,$msg)); // date ("F j, Y, G:i:s")
	fwrite ($GLOBALS['logFile'], sprintf("%08.2f autocampars: %s\n",$ut,$msg)); // date ("F j, Y, G:i:s")
}
}
function log_error($msg) {
function log_error($msg) {
	log_msg ($msg, 1);
	log_msg ($msg, 2);
	log_close ();
	log_close ();
	exit (1);
	exit (1);
}
}
function log_close() {
function log_close() {
	log_msg ("Log file saved as " . $GLOBALS['logFilePath'], 1);
	log_msg ("Log file saved as " . $GLOBALS['logFilePath'], 3);
	log_msg ("----------------------------------------------", 0);
	log_msg ("----------------------------------------------", 0);
	fclose ($GLOBALS['logFile']);
	fclose ($GLOBALS['logFile']);
	unset ($GLOBALS['logFile']); // to catch errors
	unset ($GLOBALS['logFile']); // to catch errors
@@ -1333,7 +1326,7 @@ function get_application_mode() {
		if ($xml === false) {
		if ($xml === false) {
			log_msg("10389 board not present");
			log_msg("10389 board not present");
		} else {
		} else {
			log_msg ( 'Application - ' . (( string ) $xml->app) . ', mode: ' . (( string ) $xml->mode) . "\n" );
			log_msg ( 'Application - ' . (( string ) $xml->app) . ', mode: ' . (( string ) $xml->mode) . "\n" , 3);
			$GLOBALS ['camera_state_arr'] ['rev10389'] = ''.$xml->rev;
			$GLOBALS ['camera_state_arr'] ['rev10389'] = ''.$xml->rev;
			if ((( string ) $xml->app) != '') {
			if ((( string ) $xml->app) != '') {
				$GLOBALS ['camera_state_arr'] ['application'] = ''.$xml->app;
				$GLOBALS ['camera_state_arr'] ['application'] = ''.$xml->app;
@@ -1533,11 +1526,11 @@ function get_remote_states($IPs){
// Wait for both slave modules to be in 'BOOT' state
// Wait for both slave modules to be in 'BOOT' state
function wait_slaves_boot($retries){
function wait_slaves_boot($retries){
	if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
	if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
		echo 'Waiting for slaves to come up: ';
		echo colorize('Waiting for slaves to come up: ','YELLOW',0);
	}
	}
	for ($retry = 0; $retry < $retries; $retry++){
	for ($retry = 0; $retry < $retries; $retry++){
		if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
		if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
			echo "$retry ";
			echo colorize("$retry ",'YELLOW',1);
		}
		}
		$states = get_remote_states(array(
		$states = get_remote_states(array(
				$GLOBALS['camera_state_arr']['ip_top'],
				$GLOBALS['camera_state_arr']['ip_top'],
@@ -1548,14 +1541,12 @@ function wait_slaves_boot($retries){
		  	    array_key_exists('state',       $states[1]) &&
		  	    array_key_exists('state',       $states[1]) &&
		  	   !array_key_exists('autocampars', $states[0]) && // autocampars.php should already terminate
		  	   !array_key_exists('autocampars', $states[0]) && // autocampars.php should already terminate
		  	   !array_key_exists('autocampars', $states[1])){
		  	   !array_key_exists('autocampars', $states[1])){
//		  	   	if (($states[0]['state']!='BOOT') || ($states[1]['state']!='BOOT')){
	  	   		break; // wrong state - need system reboot TODO: Add slave reboot by master	
	  	   		break; // wrong state - need system reboot TODO: Add slave reboot by master	
//		  	   	}
		  	}
		  	}
		}
		}
	}
	}
	if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
	if (!array_key_exists('REQUEST_METHOD',$_SERVER)){
		echo " Done\n";
		echo colorize(" Done\n",'GREEN',0);
	}
	}
	log_msg("In wait_slaves_boot() states = ".print_r($states,1));
	log_msg("In wait_slaves_boot() states = ".print_r($states,1));
	if (($states[0]['state'] == 'BOOT') || ($states[1]['state'] == 'BOOT')) return true;
	if (($states[0]['state'] == 'BOOT') || ($states[1]['state'] == 'BOOT')) return true;
@@ -2365,7 +2356,7 @@ function curl_multi_start($urls) {
		curl_multi_exec ($curl_mh, $curl_active);
		curl_multi_exec ($curl_mh, $curl_active);
		// we wait for a bit to allow stuff TCP handshakes to complete and so forth...
		// we wait for a bit to allow stuff TCP handshakes to complete and so forth...
		usleep (10000);
		usleep (10000);
		echo ".";
//		echo ".";
	}
	}
	return array ("mh" => $curl_mh,"handles" => $aCurlHandles);
	return array ("mh" => $curl_mh,"handles" => $aCurlHandles);
}
}
@@ -2381,8 +2372,7 @@ function curl_multi_finish($data, $use_xml=true, $ntry=0, $echo = false) {
				$curl_mrc = curl_multi_exec ($curl_mh, $curl_active);
				$curl_mrc = curl_multi_exec ($curl_mh, $curl_active);
			} while ($curl_mrc == CURLM_CALL_MULTI_PERFORM );
			} while ($curl_mrc == CURLM_CALL_MULTI_PERFORM );
		}
		}
		//		if ($echo) echo "$nrep: ($curl_active/$curl_mrc) ";
		if ($echo) echo colorize("$curl_active ",'YELLOW',1);
		if ($echo) echo "$curl_active ";
		$nrep++;
		$nrep++;
		if ($ntry && ($nrep > $ntry)) {
		if ($ntry && ($nrep > $ntry)) {
			break;
			break;