|
Antwort |
Registriert seit: 5. Feb 2009 3 Beiträge |
#1
Hallo zusammen ich habe ein kleines Program geschrieben für eine video aufnahme, welches in einem teil so ausschaut:
Delphi-Quellcode:
nun wird das ganze mit hilfe einer optokoppler Karte und einer kleinen steuerspannung über einen taster gestartet,
procedure TForm1.StartesequenzielleAufnahme1Click(Sender: TObject);
begin Aufnahme:=true; AnsichtUpdate1Click(self); //aktualisiere Menüs... if form1.IniEinzelbild then begin // Foto - Sequenz timer1.Interval:=form1.IniIntervall*1000; TimerStatus:=TSBildFolge; timer1.Enabled:=true; end else begin // Video - Folge TimerStatus:=TSvideoFolge; repeat label1.Caption:='Videoaufnahme'; NextDateiname; EinVideo; // aufnehmen Timer1.Interval:=form1.IniEinzelVideoDauer*1000; timer1.Enabled:=true; repeat Application.ProcessMessages; //Abbruchmöglichkeit until TimerStatus<>TSvideoFolge; label1.Caption:='Videoerholpause'; EinVideoStop; // erholphase Timer1.Interval:=form1.IniErholzeit; timer1.Enabled:=true; repeat Application.ProcessMessages; //Abbruchmöglichkeit label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus); until TimerStatus<>TSvideoFolgePause; until TimerStatus=TSStopAnforderung; // abbruch? Aufnahme:=false; AnsichtUpdate1Click(self); end; end; der teil mit dem programm code müsste so aussehen laut hersteller
Delphi-Quellcode:
für mich ist nun die frage wie ich den teil für die aufnahme einbinden muss, damit die aufnahme rein über den taster gemacht wird ohne das ich nun vorher die aufnahme aktivieren muss. also das es nur über den tastendruck aktiviert wird.
while QApiExtReadDl1(...) = 0 do
Application.ProcessMessages; |
Zitat |
Registriert seit: 5. Jul 2006 Ort: Magdeburg 8.275 Beiträge Delphi 10.4 Sydney |
#2
Hallo,
Zitat:
und einer kleinen steuerspannung über einen taster
wie wird er denn angesteuert ?
Zitat:
der teil mit dem programm code müsste so aussehen laut hersteller
Ein bissel mehr Info bitte. Heiko
Heiko
|
Zitat |
Registriert seit: 11. Okt 2003 Ort: Elbflorenz 44.056 Beiträge Delphi 12 Athens |
#3
Das mit den paar mehr nötigen Infos wurde ja schon gesagt,
darum solange erstmal was Anderes: Deine Warteschleifen laßten die CPU zu 100% aus, da sie nichts anderes Machen, als durchgehend etwas abzufragen und notfalls auszuführen. 'ne kleine Pause schafft Abhilfe
Delphi-Quellcode:
Und bei Problemen (Exceptions) dürften einige Dinge nicht ordnungsgemäß beendet werden
repeat
Sleep(50); Application.ProcessMessages; until TimerStatus<>TSvideoFolge; ... repeat Sleep(50); Application.ProcessMessages; label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus); until TimerStatus<>TSvideoFolgePause; z.B. würde Aufnahme auf True verbleiben. ein paar Try-Finally-Schutzblöcke würden hier helfen. Wird Timer1 auch irgendwann wieder abgestellt? Ansonsten scheint mir der Programmablauf innerhalb des einen Buttons unglücklich gewählt und ich wirde darin nur den Start einleiten und den Rest über verschiedene/entsprechende Ereignisse steuern.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat, wird PoSex im Delphi viel seltener praktiziert. |
Zitat |
Registriert seit: 5. Feb 2009 3 Beiträge |
#4
Zitat von hoika:
Hallo,
Zitat:
und einer kleinen steuerspannung über einen taster
wie wird er denn angesteuert ?
Zitat:
der teil mit dem programm code müsste so aussehen laut hersteller
Ein bissel mehr Info bitte. Heiko taster ist ein schließer ganz herkömmlich mit einer steuerspannung von 12volt, der steuert eine optokoplerkarte an, die wurde im pc mit usb verbunden. mit dem code
Delphi-Quellcode:
kann man nun abfragen und was damit anstellen, habe das so probiert:
while QApiExtReadDl1(...) = 0 do
Application.ProcessMessages;
Delphi-Quellcode:
funktioniert auch sehr gut.
Label1.Caption := 'Bereit, warte...';
while QApiExtReadDl1(...) = 0 do Application.ProcessMessages; ShowMessage('ausgelöst');
Zitat von himitsu:
Das mit den paar mehr nötigen Infos wurde ja schon gesagt,
darum solange erstmal was Anderes: Deine Warteschleifen laßten die CPU zu 100% aus, da sie nichts anderes Machen, als durchgehend etwas abzufragen und notfalls auszuführen. 'ne kleine Pause schafft Abhilfe
Delphi-Quellcode:
Und bei Problemen (Exceptions) dürften einige Dinge nicht ordnungsgemäß beendet werden
repeat
Sleep(50); Application.ProcessMessages; until TimerStatus<>TSvideoFolge; ... repeat Sleep(50); Application.ProcessMessages; label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus); until TimerStatus<>TSvideoFolgePause; z.B. würde Aufnahme auf True verbleiben. ein paar Try-Finally-Schutzblöcke würden hier helfen. Wird Timer1 auch irgendwann wieder abgestellt? Ansonsten scheint mir der Programmablauf innerhalb des einen Buttons unglücklich gewählt und ich wirde darin nur den Start einleiten und den Rest über verschiedene/entsprechende Ereignisse steuern. zum eigendlichen dann noch ich wollte das wie bei dem teil mit dem ausgelöst
Delphi-Quellcode:
hier wurde nun nach knopfdruck das ausgelöst angezeigt und ich wollte das nun so haben , das nun die aufnahme startet ohne irgendwelche vorbedingungen^^
Label1.Caption := 'Bereit, warte...';
while QApiExtReadDl1(...) = 0 do Application.ProcessMessages; ShowMessage('ausgelöst'); |
Zitat |
Registriert seit: 5. Feb 2009 3 Beiträge |
#5
So da leider noch einwas offen steht und ich nun nichtmehr weiter weiß^^
Delphi-Quellcode:
So die videoaufnahme klapt nun soweit, sogar mit abfragen des Optokopplerkarten Signales. Nur leider muss man im Menü erst einmal auf Einzelaufnahme klicken damit man dann mit dem externen taster die aufnahme auslöst. ich wollte aber das ganze nun so gestalten das es sofort auf tastendruck aufnimmt ohne das ich vorher im menü was aktiviere, nur leider weiß ich nicht wie man das anstellen soll.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, inifiles, VideoCap, StdCtrls, Buttons, ComCtrls, Gauges, VideoCapErweiterung; type TForm1 = class(TForm) MainMenu1: TMainMenu; Beenden1: TMenuItem; Quelle1: TMenuItem; Einstellungen1: TMenuItem; Recorder1: TMenuItem; PanelStatus: TPanel; Ansicht1: TMenuItem; N1zu11: TMenuItem; Status1: TMenuItem; AnsichtUpdate1: TMenuItem; PanelVideo: TPanel; LabelVideo: TLabel; Timer1: TTimer; LabelAufnahmeID: TLabel; format1: TMenuItem; display1: TMenuItem; source1: TMenuItem; Aufnahme2: TMenuItem; Enzelaufnahme1: TMenuItem; N2: TMenuItem; StartesequenzielleAufnahme1: TMenuItem; Stop2: TMenuItem; Label1: TLabel; Button1: TButton; Info1: TMenuItem; AGElektro1: TMenuItem; procedure AnsichtUpdate1Click(Sender: TObject); procedure Status1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure Video2; procedure CapStatus(Sender: TObject); procedure Beenden1Click(Sender: TObject); procedure Recorder1Click(Sender: TObject); procedure Hilfe1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure format1Click(Sender: TObject); procedure display1Click(Sender: TObject); procedure source1Click(Sender: TObject); procedure Enzelaufnahme1Click(Sender: TObject); procedure StartesequenzielleAufnahme1Click(Sender: TObject); procedure Stop2Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Button1Click(Sender: TObject); procedure AGElektro1Click(Sender: TObject); private { Private declarations } Gestartet:boolean; TimerStatus:integer; RecorderID:integer; Aufnahme:boolean; AktDateiname:string; IniFile:TIniFile; IniDateiname:String; IniZielPfad:string; IniDateiID:integer; IniIntervall:Integer; IniEinzelVideoDauer:integer; IniAnzahlFrames:integer; IniErholzeit:integer; IniEinzelbild:Boolean; IniAutoStart:boolean; m_handle: integer; procedure IniDatei(save:boolean); procedure EinFoto; procedure EinVideo; procedure EinVideoStop; procedure NextDateiname; public { Public declarations } end; var Form1: TForm1; implementation uses UnitRecordereinstellungen; {$I qlib.pas} {$R *.dfm} const TSLeerlauf=0; TSErholzeit=10; TSBildFolge=11; TSEinzelvideo=20; TSvideoFolge=30; TSvideoFolgePause=31; TSStopAnforderung=32; procedure TForm1.FormCreate(Sender: TObject); var n:integer; device: integer; begin device := 0; m_handle := QAPIExtOpenCard(USBOPTO8LC, device); Gestartet:=false; timer1.Enabled:=false; //Formateinstellungen: DateSeparator:='-'; TimeSeparator:='-'; ShortDateFormat := 'dd/mm/yyyy'; ShortTimeFormat := 'hh/nn/ss'; // aufnahme:=false; if Paramcount>0 then begin val(Paramstr(1),recorderID,n) end; Form1.Caption:='Videorecorder ID: '+inttostr(RecorderID); //Inidatei IniDateiName:=ExtractFilePath(ParamStr(0))+'Rec'+inttostr(RecorderID)+'.ini'; //IniDateiName:='Rec'+inttostr(RecorderID)+'.ini'; IniDateiName:=expandfilename(IniDateiName); IniDatei(false);//lesen end; procedure TForm1.FormShow(Sender: TObject); begin AnsichtUpdate1Click(self); CapCloseDriver; Video2; if not Gestartet then begin Gestartet:=true; if form1.IniAutoStart then StartesequenzielleAufnahme1Click(self); end; end; procedure TForm1.IniDatei(save:boolean); const CheckConst=5; var s:String; IniChkWert:Integer; Procedure SetWerte; begin IniDateiID :=0; IniIntervall:=120; IniEinzelVideoDauer:=3600; IniAnzahlFrames:=4000; IniEinzelbild:=true; IniAutoStart:=false; IniErholzeit:=1000; IniZielPfad:=ExtractFilePath(ParamStr(0)); end; begin if not save then SetWerte; IniFile:=tinifile.Create(IniDateiname); try s:='Aktuell'; //[Sektion] if save then begin // Schreiben end else begin // Lesen IniDateiID:=iniFile.ReadInteger(s,'NextDateiID',IniDateiID); end; s:='Recorder'; //[Sektion] if save then begin // Schreiben IniFile.WriteInteger(s,'Intervall',IniIntervall); IniFile.WriteInteger(s,'EinzelVideoDauer',IniEinzelVideoDauer); IniFile.WriteInteger(s,'AnzahlFrames',IniAnzahlFrames); IniFile.WriteBool(s,'Einzelbild',IniEinzelbild); IniFile.WriteBool(s,'Autostart',IniAutostart); IniFile.WriteInteger(s,'Erholzeit',IniErholzeit); Inifile.WriteString(s,'ZielPfad',IniZielPfad); end else begin // Lesen IniIntervall:=iniFile.ReadInteger(s,'Intervall',0); IniEinzelVideoDauer:=iniFile.ReadInteger(s,'EinzelVideoDauer',0); IniAnzahlFrames:=iniFile.ReadInteger(s,'AnzahlFrames',0); IniEinzelbild:=iniFile.ReadBool(s,'Einzelbild',false); IniAutostart:=iniFile.ReadBool(s,'Autostart',false); IniErholzeit:=iniFile.ReadInteger(s,'Erholzeit',0); IniZielPfad:=inifile.ReadString(s,'ZielPfad',''); end; s:='Chk'; //[Sektion] if save then begin // Schreiben IniFile.WriteInteger(s,'Wert',CheckConst); end else begin // Lesen IniChkWert:=iniFile.ReadInteger(s,'Wert',0); end; finally Inifile.Free end; // Erkennung Lesefehler - Bei Fehler - Grundeinstellungen if (not save) and (IniChkWert<>CheckConst) then setwerte; end; procedure TForm1.AnsichtUpdate1Click(Sender: TObject); begin Beenden1.Enabled:=not Aufnahme; einstellungen1.Enabled:= not Aufnahme; Stop2.Enabled:=Aufnahme; form1.StartesequenzielleAufnahme1.Enabled:=not Aufnahme; form1.Enzelaufnahme1.Enabled:=not Aufnahme; PanelStatus.Visible:=status1.Checked; if not Aufnahme then label1.Caption:=''; end; procedure TForm1.Video2; var MyCapStatusProc : TCapStatusProc; begin // Start CAP - Video CapSetVideoArea( PanelVideo ); CapSetInfoLabel( LabelVideo ); MyCapStatusProc := CAPStatus; CapSetStatusProcedure( MyCapStatusProc ); if CapOpenDriver then begin CapSetCapSec(15 * 3); CapShow; end; end; procedure TForm1.CapStatus(Sender: TObject); begin ; form1.PanelVideo.Color := clBtnFace; form1.PanelVideo.Refresh; end; procedure TForm1.Status1Click(Sender: TObject); begin form1.AnsichtUpdate1.Click; end; procedure TForm1.Beenden1Click(Sender: TObject); begin close; end; procedure TForm1.Recorder1Click(Sender: TObject); begin //Daten ans Fenster form2.LabeledEditPfad.Text:=inizielpfad; form2.CheckBoxAutostart.Checked:=iniautostart; form2.intervall:=IniIntervall; form2.frames:=IniAnzahlFrames; form2.einzelbilder:=IniEinzelbild; form2.EinzelVideoDauer:=IniEinzelVideoDauer; form2.erholzeit:=IniErholzeit; //fenster zeigen form2.LabelRecID.Caption:=inttostr(RecorderID); form2.showmodal; //Daten speichern if form2.save then begin IniZielPfad:=form2.LabeledEditPfad.Text; IniIntervall:=form2.intervall; IniAnzahlFrames:=form2.frames; IniEinzelbild:=form2.einzelbilder; IniAutoStart:=form2.CheckBoxAutostart.Checked; IniEinzelVideoDauer:=form2.EinzelVideoDauer; IniErholzeit:=form2.erholzeit; inidatei(true); // Ini speichern end; end; procedure TForm1.Hilfe1Click(Sender: TObject); begin Showmessage( 'Recorder '); end; procedure TForm1.format1Click(Sender: TObject); begin Capdlgvformat end; procedure TForm1.display1Click(Sender: TObject); begin CapdlgVDisplay end; procedure TForm1.source1Click(Sender: TObject); begin capdlgvsource end; procedure TForm1.NextDateiname; var n:integer; begin AktDateiname:=inttostr(IniDateiID); n:=length(AktDateiname); if n<10 then repeat AktDateiname:='0'+AktDateiname;inc(n); until n=10; AktDateiname:=inttostr(RecorderID)+' '+AktDateiname+' '+DateToStr(Now)+' '+TimeToStr(Now); form1.LabelAufnahmeID.Caption:=AktDateiname; AktDateiname:=IniZielPfad+AktDateiname; if form1.IniEinzelbild then AktDateiname:=AktDateiname+'.bmp' else AktDateiname:=AktDateiname+'.avi'; inc(IniDateiID); IniFile:=tinifile.Create(IniDateiname); try IniFile.WriteInteger('Aktuell','NextDateiID',IniDateiID); finally Inifile.Free end; end; procedure TForm1.EinFoto; begin CapSetSingleImageFileName( AktDateiname ); CapGrabSingleFrame; CapSetVideoLive; end; procedure TForm1.EinVideo; begin Videocaperweiterung.NewVideoFileName(AktDateiname); CapSetCapSec(form1.IniAnzahlFrames); CapStart; CapSetVideoLive; end; procedure TForm1.EinVideoStop; begin // Stoppen videocap.CapStop; // Warteschleife.. bis gestoppt // CapSetVideoLive; end; procedure TForm1.Timer1Timer(Sender: TObject); begin case Timerstatus of TSErholzeit : begin timer1.Enabled:=false; // nur 1x Erholzeit timerstatus:=tsLeerlauf; Aufnahme:=false; AnsichtUpdate1Click(self); end; TSBildFolge : begin NextDateiname; EinFoto; end; TSEinzelvideo : begin timer1.Enabled:=false; timerstatus:=tsErholzeit; EinVideoStop; //Timmerneustart f. Erholzeit timer1.Interval:=IniErholzeit; timer1.Enabled:=true; end; TSvideoFolge : begin timer1.Enabled:=false; timerstatus:=TSvideoFolgePause; end; TSvideoFolgePause:begin timer1.Enabled:=false; timerstatus:=TSvideoFolge; end; TSStopAnforderung:begin end; end; end; procedure TForm1.Enzelaufnahme1Click(Sender: TObject); begin while QAPIExtReadDI32(m_handle, 0, 0) = 0 do Application.ProcessMessages; Aufnahme:=true; AnsichtUpdate1Click(self); //aktualisiere Menüs... NextDateiname; if form1.IniEinzelbild then begin // nur ein Foto TimerStatus:=TSErholzeit; timer1.Interval:=IniErholzeit; EinFoto; timer1.Enabled:=true; end else begin // nur ein Video TimerStatus:=TSEinzelVideo; timer1.Interval:=form1.IniEinzelVideoDauer*1000; EinVideo; timer1.Enabled:=true; end; end; end; procedure TForm1.StartesequenzielleAufnahme1Click(Sender: TObject); begin repeat Sleep(50); Application.ProcessMessages; until TimerStatus<>TSvideoFolge; Aufnahme:=true; AnsichtUpdate1Click(self); //aktualisiere Menüs... if form1.IniEinzelbild then begin // Foto - Sequenz timer1.Interval:=form1.IniIntervall*1000; TimerStatus:=TSBildFolge; timer1.Enabled:=true; end else begin // Video - Folge TimerStatus:=TSvideoFolge; repeat label1.Caption:='Videoaufnahme'; NextDateiname; EinVideo; // aufnehmen Timer1.Interval:=form1.IniEinzelVideoDauer*1000; timer1.Enabled:=true; repeat Application.ProcessMessages; //Abbruchmöglichkeit until TimerStatus<>TSvideoFolge; label1.Caption:='Videoerholpause'; EinVideoStop; // erholphase Timer1.Interval:=form1.IniErholzeit; timer1.Enabled:=true; repeat Application.ProcessMessages; //Abbruchmöglichkeit label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus); until TimerStatus<>TSvideoFolgePause; until TimerStatus=TSStopAnforderung; // abbruch? Aufnahme:=false; AnsichtUpdate1Click(self); repeat Sleep(50); Application.ProcessMessages; label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus); until TimerStatus<>TSvideoFolgePause end; end; procedure TForm1.Stop2Click(Sender: TObject); begin case Timerstatus of TSErholzeit : begin end; TSBildFolge : begin timer1.Enabled:=false; Timerstatus:=TSLeerlauf; Aufnahme:=false; AnsichtUpdate1Click(self); //aktualisiere Menüs... end; TSEinzelvideo : begin timer1.Enabled:=false; timer1timer(self); end; TSvideoFolge : begin Timerstatus:=TSStopAnforderung; end; TSVideoFolgePause:begin Timerstatus:=TSStopAnforderung; end; end; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Aufnahme then canclose:=false; end; procedure TForm1.Button1Click(Sender: TObject); begin case Timerstatus of TSErholzeit : begin end; TSBildFolge : begin timer1.Enabled:=false; Timerstatus:=TSLeerlauf; Aufnahme:=false; AnsichtUpdate1Click(self); //aktualisiere Menüs... end; TSEinzelvideo : begin timer1.Enabled:=false; timer1timer(self); end; TSvideoFolge : begin Timerstatus:=TSStopAnforderung; end; TSVideoFolgePause:begin Timerstatus:=TSStopAnforderung; end; end; end; procedure TForm1.AGElektro1Click(Sender: TObject); begin showmessage ('Bereitgestellt'); end; end. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |