PHP/Javascript: Loop utan att "låsa" hela sidan?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
JimmyAndersson
Inlägg: 26571
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

PHP/Javascript: Loop utan att "låsa" hela sidan?

Inlägg av JimmyAndersson »

Min webkamera har fått två servon som jag styr med en PIC-krets och php_serial.class. Kamerabilden syns med hjälp av en java-applet som uppdaterar bilden en gång per sekund.

I auto-läget flyttas kameran enligt ett förutbestämt mönster och en markör (liten bild i en DIV-tagg) flyttas enligt samma mönster.

Jag gjorde först koden med en array (x,y-data) och while-loopar.
Litet kod-exempel:

Kod: Markera allt

// Arrayen med positionerna.
$array_main = array (
"x" => array(499, 300, 300, 900, 900, 499),
"y" => array(700, 700, 500, 500, 700, 700)
);


// Plocka fram vardena fran arrayen.
while ($raknare < $antal)
	{
	$x_axel = $array_main[x][$raknare];
	$y_axel = $array_main[y][$raknare];

	// FLYTTA X
	while (abs($x_axel - $x_pos) > $steg) // Lont att ta ett helt steg?
		{
		if ($x_axel > $x_pos)
			{
			$x_pos += $steg;
			$message = chr(0x02).chr(0x30+$x_servo).$x_pos.chr(0x03);
			$serial->sendMessage($message);
			}
			else
				{
				$x_pos -= $steg;
				$message = chr(0x02).chr(0x30+$x_servo).$x_pos.chr(0x03);
				$serial->sendMessage($message);
				}
		}
		$message = chr(0x02).chr(0x30+$x_servo).$x_axel.chr(0x03);
		$serial->sendMessage($message);

...osv.. och sedan:

	$raknare++;
	}

Nackdelen är förstås att den sidan inte utför något annat under tiden som while-looparna kör. :)
Vill man dessutom att while-looparna ska köras om och om igen så måste man ladda om sidan var 30e sekund, pga timeout-gränsen (vet inte riktigt om det heter så egentligen).

För att flytta lite kraft från servern till besökarnas datorer så gjorde jag om koden till javascript (med enbart servo-styrningen i php) och fick förslaget att använda iframes. Men som jag misstänkte så blev det ingen skillnad.



Frågor:

Hur löser man de här problemen på riktigt? :)



Eftersom ni fortfarande läser så kan jag passa på att berätta hur det ska se ut när allt är klart:

*spolar fram tiden*
Sidan består då av två delar:

1) Admin-del, där jag kan välja mellan Auto-läge, Manuellt och Publikt.
Auto-läge: Kameran rör sig efter ett (av mig) förutbestämt mönster.
Manuellt: Jag kan styra kameran.
Publikt: Besökarna kan styra kameran.
2) Visa-del, där besökarna ser kamerabilden och markörer (en för x och en för y) som följer efter kamerans rörelser.


Är det något mer ni behöver veta så är det bara att fråga. :)


edit: Lägger in en Länk till hur det ser ut just nu.
Autoläget är igång, men jag kör det bara ibland. Har du tur så kan du få se det. :)
Autoläget består nu av en separat php-fil som jag laddar om ibland...

Tyvärr så har jag inte lyckats ändra kamerans inställningar i Linux, så det är lite märklig gulaktig bild som flimmrar när det blir för ljust. Passar iofs ganska bra med tanke på sidan design. :D
Kör med 5 fps för tillfället.

Upptäckte just att java-appleten ignorerar DIV-taggen och lägger sig längst fram.
Inte så snyggt... Nåja, då får det blir en trist fyrkantig ruta istället. :roll:
Jag som hade gjort en så trevlig "gammal tv"-look...
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Vill du bara att kameran ska röra sig när någon är inne på sidan?

Att styra kameran via Javascript kan bli problematiskt om man inte tänker sig för i fall flera kollar på sidan samtidigt.

Jag tänker mig att man skulle kunna ha en process körandes i bakgrunden på datorn. Den ansvarar för att flytta kameran så länge som den får någon slags "keep-alive"-signal. Har den inte fått någon signal den senaste minuten så stannar kamerastyrningen. Signalen skulle kunna genereras genom en timer i ett Javascript som sedan anropar ett PHP-skript som i sin tur skicka en signal till bakgrundsprocessen.

Processen skulle även kunna returnera den aktuella servopositionen när ett PHP-skript ber om det.
Användarvisningsbild
JimmyAndersson
Inlägg: 26571
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Vill du bara att kameran ska röra sig när någon är inne på sidan?"

Det hade jag inte funderat kring, men det var en bra idé så det får bli så. :)


"Att styra kameran via Javascript kan bli problematiskt om man inte tänker sig för i fall flera kollar på sidan samtidigt."

Upptäckte det när jag hade två sidor uppe samtidigt. :oops:


Din idé lät väldigt intressant. :tumupp:
Tror inte att jag har något frågetecken kring de olika delarna, men det kanske dyker upp senare. :)

Dags att göra lite kod igen. :hacker:
Stranne
Inlägg: 48
Blev medlem: 28 maj 2008, 09:52:31
Ort: Stockholm

Inlägg av Stranne »

Kan du inte köra set_time_limit() för att ändra timeouten?

Men det löser nog inte ditt grundläggande problem, cykzes väg är nog mer vettig.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Hur har det gått med detta projektet då? :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26571
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Det är inte helt färdigt än, men jag jobbar på det lite då och då. :)
Jag gjorde ett test med Cykze's idé och det fungerar fint.
Den delen där vem som helst kan styra kameran är inte upplagd "publikt" än. Först måste jag fixa ett litet kösystem så att bara en person i taget kan styra kameran, men det har lite lägre prioritet nu.

Om ganska exakt en månad så plockas kameran ner, så då blir det ingen mer havsutsikt. :(
Jag har idéer om att sätta en kamera i en fågelholk och en kamera i skogen (i hopp om att se vilda djur), men det är mycket kvar på just de projekten. Tills vidare så riktar jag nog en kamera inåt så man kan följa uppbyggnaden av den nya studion. :)


Det jag funderar mest på nu är hur IR-styrningen till min systemkamera (Olympus E-420) ser ut. Jag behöver göra något som tar en bild per timma i ett (eller fler) dygn.
Skriv svar