IO-Warrior

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
ozoffi
Beiträge: 41
Registriert: 08.02.2010 20:56

Re: IO-Warrior

Beitrag von ozoffi »

Hallo!

Wen es interessiert, ich habe nun mein testprogramm erfolgreich erstellt:

Code: Alles auswählen

; IOWARRIOR - Geschwindigkeitsmessung für "SPEEDCAT"
; IOKIT.DLL muss im system32 stehen, IOKIT.LIB  im gleichen VZ wie dieses PB-Programm

start:

OpenWindow(0,0,0,640,480,"Window",#PB_Window_SystemMenu)

ButtonGadget(20,490,430,140,40,"RESET") 

TextGadget(4, 10, 140, 55, 15, "PortPuls") 
TextGadget(1, 65, 140, 25, 15, "") 
TextGadget(5, 10, 200, 55, 15, "Impuls")
TextGadget(2, 65, 200, 25, 15, "") 
TextGadget(6, 10, 260, 55, 15, "Sekunden")
TextGadget(3, 65, 260, 25, 15, "") 

TextGadget(7, 10, 320, 55, 15, "Impulse")
TextGadget(8, 65, 320, 35, 15, "")
TextGadget(9, 100, 320, 25, 15, "pro")
TextGadget(10, 140, 320, 35, 15, "")
TextGadget(11, 180, 320, 55, 15, "Sekunden")

TextGadget(12, 10, 380, 55, 15, "Speed")
TextGadget(13, 70, 380, 35, 15, "")
TextGadget(14, 120, 380, 55, 15, "cm/Sek")

If LoadFont(0, "Arial", 16)
  SetGadgetFont(#PB_Default, FontID(0))   
EndIf

TextGadget(15, 50, 20, 55, 35, "")
TextGadget(16, 120, 20, 55, 35, "Kmh")

TextGadget(17, 200, 20, 55, 35, "")
TextGadget(18, 260, 20, 60, 35, "Mph")

If LoadFont(1, "Arial", 8)
  SetGadgetFont(#PB_Default, FontID(1))   
EndIf


Import "C:\Users\oz\Desktop\iowarrior\iowkit.lib"
  IowKitOpenDevice() As "_IowKitOpenDevice@0"
  IowKitCloseDevice(devHandle.i) As "_IowKitCloseDevice@4"
  IowKitGetNumDevs() As "_IowKitGetNumDevs@4"
  IowKitGetDeviceHandle(devHandle.i) As "_IowKitGetDeviceHandle@4"
  IowKitRead(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitRead@16"
  IowKitWrite(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitWrite@16"
  IowKitGetProductId(ioHandle) As "_IowKitGetProductId@4"
  IowKitGetRevision(ioHandle) As "_IowKitGetRevision@4"
  IowKitGetSerialNumber(ioHandle, Serial.s) As "_IowKitGetSerialNumber@8"
  IowKitReadImmediate(ioHandle,buffer.s) As "_IowKitReadImmediate@8"
EndImport

Structure bufferByte
   buffer1.c
   buffer2.c
   buffer3.c
   buffer4.c
   buffer5.c
   buffer6.c
   buffer7.c
   buffer8.c
EndStructure

Define.bufferByte buffer
Define.l ioHandle

numPipe = 1
length = 8
IowKitOpenDevice()
ioHandle = IowKitGetDeviceHandle(1)

      buffer\buffer1 = 255
      buffer\buffer2 = 255
      buffer\buffer3 = 255
      buffer\buffer4 = 255
      buffer\buffer5 = 255

Repeat
  event = WaitWindowEvent(0)
   
  If event = 0

      IowKitWrite(ioHandle, numPipe,buffer,length)
      IowKitRead(ioHandle, numPipe,buffer,length)
       
      If buffer\buffer2=255 And flag = 1:z=z+1:flag=0:impuls=0::EndIf    
      If buffer\buffer2=254:flag=1::EndIf 
      If buffer\buffer2=255 And sec >0 : sec=0:s2=0:EndIf

     
      SetGadgetText(1, StrU(buffer\buffer2, #PB_Byte))
     
      SetGadgetText(2, StrU(z, #PB_Long))

      
; IMPLUSE pro SEKUNDE zaehlen - x=1sek Durchlauf
      
      x=x+1
      SetGadgetText(3, StrU(s))
      
      If x = 190
           
        impuls=impuls+z: sec=s2
        
          SetGadgetText(8, StrU(impuls))
        
        If sec >0 And impuls>0
          SetGadgetText(10, StrU(sec))
          umfang=6*3.14 : mm = umfang*impuls
          mmsek = mm / sec
          cmsek.f = mmsek/100
          cmsek87.f=cmsek.f*87
          cmh.f=cmsek87.f*360
          kmh.f=cmh.f/1000
          mph.f=kmh.f/1.66
        EndIf
        
        SetGadgetText(13, StrF(cmsek.f,1))
       
        SetGadgetText(15, StrF(kmh.f,1))
        SetGadgetText(17, StrF(mph.f,1))
     
        z=0:x=0:s=s+1:s2=s2+1
        
      EndIf
      
      
      Select EventGadget()
          
      Case 20
        z=0:x=0:s=0:s2=0:kmh.f=0:mph.f=0: mm=0: impuls=0:sec=0:flag=0:cmsek.f=0

        FreeFont(1):FreeFont(0)
        If LoadFont(2, "Arial", 8)
         SetGadgetFont(#PB_Default, FontID(2))   
       EndIf
       CloseWindow(0)
       Goto start
        
      EndSelect
      
    EndIf 
    
    
  Until event=#PB_Event_CloseWindow

IowKitCloseDevice(iohandle)

End

Es werkt vorerst so, wie ich mir das vorstelle - fast...

Hat wer von Euch eine Idee, wie ich exakt eine Sekunde messen kann?
Derzeit habe ich das so hingetrimmt, dass eben ein Zähler so lange addiert wird, bis ein Wert erreicht wurde, der einer Sekunde entspricht.
Ich hätte aber gerne eine exaktere Messung (eine, die immer und überall gleich ist).

Und dann: gibt es nicht eine Möglichkeit, ein Programm aus sich selbst heraus neu zu starten -
so das halt alle Werte auf 0 gesetzt, bzw. gelöscht werden, wie bei einem Neustart?
Antworten