; @Keywords: 
; --------------------------------------------------------------------------------
; @Title: Menu for PI Analog Probe
; @Description: 
;   This menu can be loaded with MENU.ReProgram t32adc.men
; @Author: STA
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: t32adc.men 7587 2014-08-29 09:32:38Z estahleder $

; --------------------------------------------------------------------------------
;  Menu for PI Analog Probe
; --------------------------------------------------------------------------------
; missing:
; - ADC probe detection


add
menu
(
 

; --------------------------------------------------------------------------------
;   Trace pulldown submenue
; --------------------------------------------------------------------------------

  popup "&ProbeADC"
  (
    default
    menuitem  "[:aconfig]&Configuration..." "Integrator"
    menuitem  "[:aconfig]&Configuration ADC" "Pod A"
    menuitem  "[:aconfig]&Configuration Energy" "ETA"

; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
    enable INTEGRATOR()
    menuitem  "[:time]&Recoding Time"
    (

      &chan=0.
      if I.ADC.ENABLE(i.v0a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.v1a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.v2a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.v3a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.i0a)||I.ADC.ENABLE(i.p0a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.i1a)||I.ADC.ENABLE(i.p1a)
        &chan=&chan+1.
      if I.ADC.ENABLE(i.i2a)||I.ADC.ENABLE(i.p2a)
        &chan=&chan+1.

dialog
(&
        header "Expand Recoding Time"
        pos 2. 0.5 25. 1.
        text "Number of enabled ADC channels = &chan"
        pos 2. 1.5 17. 1.
        text "Time to trace (seconds)"
        pos 2. 2.5 17. 1.
TIME:   EDIT "2." ""

        pos 1. 4.5  9.
        defbutton "Ok"
        (
          dialog.execute apply
          dialog.end
        )
        pos 25. 4.5  9.
        button "Cancel" "dialog.end"

        pos 13. 4.5  9.
apply:  button "Apply"
        (
          local &recstring &waitstring &cval &time &rectime &waittime

          &recstring=""
          &waitstring=""

;          &chan=dialog.string("CHAN")
          &cval=dialog.string("TIME")

          if "&cval"!=""
          (
            on error gosub 
            (
              &cval=""
              &time=""
              return
            )


            EVAL &cval
            &t1=eval.type()
;               &DInteger     DIntNum       DFloat       DHex        DNumeric
            if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
            (
               &t1="&cval"+" no valid time value!"
               print %ERROR "&t1"
               &cval=""
            )
          )
          &time=&cval 

          &rectime=((&chan)*1600.)
          &recstring="&rectime"+"ns"

          &waittime=&time*&chan*1000000000.0
          &waittime=(&waittime/524288.)-&rectime
          &waittime=conv.floattoint(&waittime)
          &waitstring="&waittime"+"ns"

          if ((&time<1)||(&chan==0))
          (
            Integrator.ReProgram
            (
            )
            print %ERROR "Wrong Time or Channel Count"
          ) 
          else
          (  
            Integrator.ReProgram
            (
               ; Expand Recording Time: Channels: &chan, Seconds: &time
             
               TimeCouNTer COUNT0 &recstring
               TimeCouNTer COUNT1 &waitstring

               LEVEL0:
                 Counter.Increment COUNT0
                 Counter.Restart COUNT1 IF COUNT0
                 GOTO LEVEL1 IF COUNT0
                 SAMPLE.ENABLE IF !COUNT0

               LEVEL1:
                 Counter.Increment COUNT1
                 Counter.Restart COUNT0 IF COUNT1
                 GOTO LEVEL0 IF COUNT1
            )
            print "Analyzer programmed."
          )
        )
      )
    )

; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
    enable INTEGRATOR()
    popup    "[:atrigger]&Trigger Definition"
    (
      menuitem  "[:program]&Current Program"
      (
         Integrator.Program
      )
      menuitem "[:program]&New Program"            
      (
         Integrator.ReProgram
         (
         )
         Integrator.Program
      )
      menuitem "&Directory..."
      (
         Integrator.Program *.tap
      )
      separator
      menuitem "Clear Program"    
      (
         Integrator.ReProgram
      )
; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
      menuitem "&Trace from Start to End..."
      (
       local &csel

       &csel=""
       if I.ADC.ENABLE(i.v0a)
         &csel="&csel"+",V0"
       if I.ADC.ENABLE(i.v1a)
         &csel="&csel"+",V1"
       if I.ADC.ENABLE(i.v2a)
         &csel="&csel"+",V2"
       if I.ADC.ENABLE(i.v3a)
         &csel="&csel"+",V3"
       if I.ADC.ENABLE(i.i0a)&&(I.ADC.SHUNT(i.i0a)!=0)
         &csel="&csel"+",I0"
       if I.ADC.ENABLE(i.i1a)&&(I.ADC.SHUNT(i.i1a)!=0)
         &csel="&csel"+",I1"
       if I.ADC.ENABLE(i.i2a)&&(I.ADC.SHUNT(i.i2a)!=0)
         &csel="&csel"+",I2"
       if I.ADC.ENABLE(i.p0a)&&(I.ADC.SHUNT(i.p0a)!=0)
         &csel="&csel"+",P0"
       if I.ADC.ENABLE(i.p1a)&&(I.ADC.SHUNT(i.p1a)!=0)
         &csel="&csel"+",P1"
       if I.ADC.ENABLE(i.p2a)&&(I.ADC.SHUNT(i.p2a)!=0)
         &csel="&csel"+",P2"

       if string.mid("&csel",0,1)==","
          &csel=string.cut("&csel",1)

dialog
(&
       header "Trace from Start to Stop Point"

       pos 0x1 1.3 6. 1.
chanA: PULLDOWN "&csel" ""
       pos 0x8 1.3 22.
addrA: defedit "" ""
       pos 33. 0.7 7. 1.
a.eq:  choosebox "equal" ""
       pos 33. 1.7 7. 1.
a.not: choosebox "! equal" ""
       pos 41. 0.7 7. 1.
a.ris: choosebox "rising" ""
       pos 41. 1.7 7. 1.
a.fal: choosebox "falling" ""
       pos 0x1 4.3 6. 1.
chanB: PULLDOWN "&csel" ""
       pos 0x8 4.3 22.
addrB: edit "" ""
       pos 33. 3.7 7. 1.
b.eq:  choosebox "equal" ""
       pos 33. 4.7 7. 1.
b.not: choosebox "! equal" ""
       pos 41. 3.7 7. 1.
b.ris: choosebox "rising" ""
       pos 41. 4.7 7. 1.
b.fal: choosebox "falling" ""

 
       pos 15. 6.5  9.
       defbutton "Ok"
       (
         dialog.execute apply
         dialog.end
       )
       pos 39. 6.5  9.
       button "Cancel" "dialog.end"

       pos 27. 6.5  9.
apply: button "Apply"
       (
        local &addrA &triggerA &addrB &triggerB &triggerC &triggerD
        local &addr1 &addr2 &channel &chanA &chanNrB
        local &addrAl &addrAh &addrBl &addrBh &addrCl &addrCh &addrDl &addrDh

        on error jumpto
        (
          beep 5.
          print "Input error, please check syntax"
          enddo
        )

        ; ----- A ----------------------------------------------------------------
        &addrdeclA=""
        &addrA=dialog.string(addrA)
        &chanA=dialog.string(chanA)

        gosub CheckRange &addrA &chanA
        ENTRY &addrA1 &addrA2

        &channelA="&channel"

        if dialog.boolean(a.ris)
        (
           &triggerA=" if AlphaRange&&ChannelA"
           &triggerC=" if CharlyRange&&ChannelA"
           &addrAl=0.
           &addrAh=&addrA1
           &addrCl=&addrA1
           &addrCh=4096.
        )
        else if dialog.boolean(a.fal)
        (
           &triggerA=" if AlphaRange&&ChannelA"
           &triggerC=" if CharlyRange&&ChannelA"
           &addrAh=4096.
           &addrAl=&addrA2
           &addrCh=&addrA2
           &addrCl=0.
        )
        else if  dialog.boolean(a.eq)
        (
           &triggerA=""
           &triggerC=" if CharlyRange&&ChannelA"
           &addrAl=0.
           &addrAh=0
           &addrCl=&addrA1
           &addrCh=&addrA2
        )
        else
        (
           &triggerA=""
           &triggerC=" if !CharlyRange&&ChannelA"
           &addrAl=0.
           &addrAh=0
           &addrCl=&addrA1
           &addrCh=&addrA2
        )


        ; ----- B ----------------------------------------------------------------
         &addrdeclB=""
         &addrB=dialog.string(addrB)
         &chanB=dialog.string(chanB)

         gosub CheckRange &addrB &chanB
         ENTRY &addrB1 &addrB2

         &channelB="&channel"

        if dialog.boolean(b.ris)
        (
           &triggerB=" if BetaRange&&ChannelB"
           &triggerD=" if DeltaRange&&ChannelB"
           &addrBl=0.
           &addrBh=&addrB1
           &addrDl=&addrB1
           &addrDh=4096.
        )
        else if dialog.boolean(b.fal)
        (
           &triggerB=" if BetaRange&&ChannelB"
           &triggerD=" if DeltaRange&&ChannelB"
           &addrBh=4096.
           &addrBl=&addrB2
           &addrDh=&addrB2
           &addrDl=0.
        )
        else if  dialog.boolean(b.eq)
        (
           &triggerB=""
           &triggerD=" if DeltaRange&&ChannelB"
           &addrBl=0.
           &addrBh=0
           &addrDl=&addrB1
           &addrDh=&addrB2
        )
        else
        (
           &triggerB=""
           &triggerD=" if !DeltaRange&&ChannelB"
           &addrBl=0.
           &addrBh=0
           &addrDl=&addrB1
           &addrDh=&addrB2
        )
        
        ; ------------------------------------------------------------------------
        Integrator.ReProgram
        (
           ; Volt/Amp/Watt Range for Start: &addrA
             SELECTORRANGE AlphaRange  &addrAl--&addrAh
             SELECTORRANGE CharlyRange &addrCl--&addrCh

           ; Volt/Amp/Watt Range for Stop: &addrB
       SELECTORRANGE BetaRange   &addrBl--&addrBh
       SELECTORRANGE DeltaRange  &addrDl--&addrDh

           ; Channel Start: &chanA           
             SELECTOR ChannelA i.A15.Falling &channelA

           ; Channel Stop: &chanB
             SELECTOR ChannelB i.A15.Falling &channelB

       start:
         CONTinue        &triggerA
       startA:
         Sample.enable   &triggerC
         CONTinue        &triggerC

       occured:
         Sample.Enable
         CONTinue        &triggerB
       occuredB:
         Sample.Enable
         Goto    start   &triggerD
   )
   
   
         print "Analyzer programmed."
         goto applyend


;---------
CheckRange:
  ENTRY &addr &chan

        local &shunt &PwrVolt
        
        &shunt=0
        &PwrVolt=0

; check channel
         if "&chan"=="V0"
            &channel="i.A14.Low  i.A13.Low  i.A12.Low"
         else if "&chan"=="V1"
            &channel="i.A14.Low  i.A13.Low  i.A12.High"
         else if "&chan"=="V2"
            &channel="i.A14.Low  i.A13.High i.A12.Low"
         else if "&chan"=="V3"
            &channel="i.A14.Low  i.A13.High i.A12.High"
         else if "&chan"=="I0"||"&chan"=="P0"
         (
            &channel="i.A14.High i.A13.Low  i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i0a)
            &PwrVolt=I.ADC.SHUNT(i.p0a)
         )
         else if "&chan"=="I1"||"&chan"=="P1"
         (
            &channel="i.A14.High i.A13.Low  i.A12.High"
            &shunt=I.ADC.SHUNT(i.i1a)
            &PwrVolt=I.ADC.SHUNT(i.p1a)
         )
         else if "&chan"=="I2"||"&chan"=="P2"
         (
            &channel="i.A14.High i.A13.High i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i2a)
            &PwrVolt=I.ADC.SHUNT(i.p2a)
         )

; check empty
   if "&addr"==""
         (
           beep 5.
           print "Input error: Empty Range"
           enddo
         )
; check range
         EVAL &addr
         &t1=eval.type()
         if (&t1==0x80)    ; DRange
         (
            &len=STRING.LEN("&addr")
            &cut=STRING.SCAN("&addr","--",0)
            &addr1=STRING.CUT("&addr",-(&len-&cut)) 
            &addr2=STRING.CUT("&addr",&cut+2) 
         )
         else
         (
            &addr1=&addr
            &addr2=&addr
         )

; check lo-val
         EVAL &addr1
         &t1=eval.type()
;            &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )
; check hi-val
         EVAL &addr2
         &t1=eval.type()
;           &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )

; calculation of trigger value
         if "&chan"=="V0"||"&chan"=="V1"||"&chan"=="V2"||"&chan"=="V3"
         (
          ; voltage calculation
          ; &addr1=&addr1*4096.*1000./5000.
            &addr1=&addr1*819.2
            &addr2=&addr2*819.2 
         )
         else
         (
           if "&chan"=="P0"||"&chan"=="P1"||"&chan"=="P2"
           (
              &addr1=&addr1/&PwrVolt
              &addr2=&addr2/&PwrVolt
           )
         ; current calculation
         ; &addr1=&addr1*&shunt*4096.*1000.*2./125.
           &addr1=&addr1*&shunt*32768.
           &addr2=&addr2*&shunt*32768.
         )

         if &addr1==0.0
            &addr1=0.
         else if &addr1>4096.
            &addr1=4096.
         else
            &addr1=conv.floattoint(&addr1) 
         
         if &addr2==0.0
            &addr2=0.
         else if &addr2>4096.
            &addr2=4096.
         else
            &addr2=conv.floattoint(&addr2) 

         return &addr1 &addr2
;---------


applyend:
        )
        pos 0. 0. 49. 3.5
        box "Channel        Volt/Amp/Watt Range for Start"
        pos 0. 3.0 49. 3.5
        box "Channel        Volt/Amp/Watt Range for Stop"
       )
       dialog.set a.eq
       dialog.set b.eq
      )
; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
      menuitem "&Selective Trace..."
      (
       local &csel

       &csel=""
       if I.ADC.ENABLE(i.v0a)
         &csel="&csel"+",V0"
       if I.ADC.ENABLE(i.v1a)
         &csel="&csel"+",V1"
       if I.ADC.ENABLE(i.v2a)
         &csel="&csel"+",V2"
       if I.ADC.ENABLE(i.v3a)
         &csel="&csel"+",V3"
       if I.ADC.ENABLE(i.i0a)&&(I.ADC.SHUNT(i.i0a)!=0)
         &csel="&csel"+",I0"
       if I.ADC.ENABLE(i.i1a)&&(I.ADC.SHUNT(i.i1a)!=0)
         &csel="&csel"+",I1"
       if I.ADC.ENABLE(i.i2a)&&(I.ADC.SHUNT(i.i2a)!=0)
         &csel="&csel"+",I2"
       if I.ADC.ENABLE(i.p0a)&&(I.ADC.SHUNT(i.p0a)!=0)
         &csel="&csel"+",P0"
       if I.ADC.ENABLE(i.p1a)&&(I.ADC.SHUNT(i.p1a)!=0)
         &csel="&csel"+",P1"
       if I.ADC.ENABLE(i.p2a)&&(I.ADC.SHUNT(i.p2a)!=0)
         &csel="&csel"+",P2"

       if string.mid("&csel",0,1)==","
          &csel=string.cut("&csel",1)

dialog
(&
       header "Voltage/Current Selective Trace"

       pos 0x1 1.3 6. 1.
chan:  PULLDOWN "&csel" ""
       pos 0x8 1.3 22.
addr:  defedit "" ""

       pos 0. 0. 41. 3.5
       box "Channel        Volt/Amp/Watt Range"

       pos 33. 0.7 7. 1.
a.eq:  choosebox "equal" ""
       pos 33. 1.7 7. 1.
a.not: choosebox "! equal" ""

       pos 1. 3.5  9.
       defbutton "Ok"
       (
         dialog.execute apply
         dialog.end
       )

       pos 25. 3.5  9.
       button "Cancel" "dialog.end"

       pos 13. 3.5 9.
apply: button "Apply"
       (
         local &addr &addrdecl &triggerA
         local &addr1 &addr2
         local &chan &channel
 
         on error jumpto
         (
           beep 5.
           print "Input error, please check syntax"
           enddo
         )

         ; -----------------------------------------------------------------------
         &addrdecl=""
         &addr=dialog.string(addr)
         &chan=dialog.string(chan)

         gosub CheckRange &addr &chan
         ENTRY &addr1 &addr2

         if dialog.boolean(a.eq)
           &triggerA="AlphaRange"
         else
           &triggerA="!AlphaRange"
         ; -----------------------------------------------------------------------

         Integrator.ReProgram
         (
           ; Volt/Amp/Watt Range: &addr
           SELECTORRANGE AlphaRange &addr1--&addr2

           ; Channel &chan
           SELECTOR Channel &channel

           start:
             Sample.enable   if AlphaRange&&Channel
             CONTinue        if AlphaRange&&Channel

           occured:
             Sample.Enable 
             Goto    Start   if !AlphaRange&&Channel
         )
         print "Analyzer programmed."
         goto applyend


;---------
CheckRange:
  ENTRY &addr &chan

        local &shunt &PwrVolt
        
        &shunt=0
        &PwrVolt=0

; check channel
         if "&chan"=="V0"
            &channel="i.A14.Low  i.A13.Low  i.A12.Low"
         else if "&chan"=="V1"
            &channel="i.A14.Low  i.A13.Low  i.A12.High"
         else if "&chan"=="V2"
            &channel="i.A14.Low  i.A13.High i.A12.Low"
         else if "&chan"=="V3"
            &channel="i.A14.Low  i.A13.High i.A12.High"
         else if "&chan"=="I0"||"&chan"=="P0"
         (
            &channel="i.A14.High i.A13.Low  i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i0a)
            &PwrVolt=I.ADC.SHUNT(i.p0a)
         )
         else if "&chan"=="I1"||"&chan"=="P1"
         (
            &channel="i.A14.High i.A13.Low  i.A12.High"
            &shunt=I.ADC.SHUNT(i.i1a)
            &PwrVolt=I.ADC.SHUNT(i.p1a)
         )
         else if "&chan"=="I2"||"&chan"=="P2"
         (
            &channel="i.A14.High i.A13.High i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i2a)
            &PwrVolt=I.ADC.SHUNT(i.p2a)
         )


; check empty
         if "&addr"==""
         (
           beep 5.
           print "Input error: Empty Range"
           enddo
         )
; check range
         EVAL &addr
         &t1=eval.type()
         if (&t1==0x80)    ; DRange
         (
            &len=STRING.LEN("&addr")
            &cut=STRING.SCAN("&addr","--",0)
            &addr1=STRING.CUT("&addr",-(&len-&cut)) 
            &addr2=STRING.CUT("&addr",&cut+2) 
         )
         else
         (
           beep 5.
           print "Input error: No Range"
           enddo
         )

; check lo-val
         EVAL &addr1
         &t1=eval.type()
;            &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )
; check hi-val
         EVAL &addr2
         &t1=eval.type()
;           &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )

; calculation of trigger value
         if "&chan"=="V0"||"&chan"=="V1"||"&chan"=="V2"||"&chan"=="V3"
         (
          ; voltage calculation
          ; &addr1=&addr1*4096.*1000./5000.
            &addr1=&addr1*819.2
            &addr2=&addr2*819.2 
         )
         else
         (
           if "&chan"=="P0"||"&chan"=="P1"||"&chan"=="P2"
           (
              &addr1=&addr1/&PwrVolt
              &addr2=&addr2/&PwrVolt
           )
         ; current calculation
         ; &addr1=&addr1*&shunt*4096.*1000.*2./125.
           &addr1=&addr1*&shunt*32768.
           &addr2=&addr2*&shunt*32768.
         )

         if &addr1==0.0
            &addr1=0.
         else if &addr1>4096.
            &addr1=4096.
         else
            &addr1=conv.floattoint(&addr1) 
         
         if &addr2==0.0
            &addr2=0.
         else if &addr2>4096.
            &addr2=4096.
         else
            &addr2=conv.floattoint(&addr2) 

         return &addr1 &addr2
;---------


applyend:    
       )
      )
      dialog.set a.eq
     )
; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
     menuitem "&Trace around / Trigger..."
     (
       local &csel

       &csel=""
       if I.ADC.ENABLE(i.v0a)
         &csel="&csel"+",V0"
       if I.ADC.ENABLE(i.v1a)
         &csel="&csel"+",V1"
       if I.ADC.ENABLE(i.v2a)
         &csel="&csel"+",V2"
       if I.ADC.ENABLE(i.v3a)
         &csel="&csel"+",V3"
       if I.ADC.ENABLE(i.i0a)&&(I.ADC.SHUNT(i.i0a)!=0)
         &csel="&csel"+",I0"
       if I.ADC.ENABLE(i.i1a)&&(I.ADC.SHUNT(i.i1a)!=0)
         &csel="&csel"+",I1"
       if I.ADC.ENABLE(i.i2a)&&(I.ADC.SHUNT(i.i2a)!=0)
         &csel="&csel"+",I2"
       if I.ADC.ENABLE(i.p0a)&&(I.ADC.SHUNT(i.p0a)!=0)
         &csel="&csel"+",P0"
       if I.ADC.ENABLE(i.p1a)&&(I.ADC.SHUNT(i.p1a)!=0)
         &csel="&csel"+",P1"
       if I.ADC.ENABLE(i.p2a)&&(I.ADC.SHUNT(i.p2a)!=0)
         &csel="&csel"+",P2"

       if string.mid("&csel",0,1)==","
          &csel=string.cut("&csel",1)

dialog
(&
       header "Trace around or Trigger"

       pos 0x1 1.3 6. 1.
chan:  PULLDOWN "&csel" ""
       pos 0x8 1.3 22.
addr:  defedit "" ""
       pos 33. 0.7 7. 1.
a.eq:  choosebox "equal" ""
       pos 33. 1.7 7. 1.
a.not: choosebox "! equal" ""
       pos 41. 0.7 7. 1.
a.ris: choosebox "rising" ""
       pos 41. 1.7 7. 1.
a.fal: choosebox "falling" ""

       pos 0. 0. 49. 3.5
       box "Channel        Volt/Amp/Watt Range"

       pos 1. 3.2 11. 1.
d.pre:    choosebox "TrigDelay 10%"    ""
d.center: choosebox "TrigDelay 50%"          ""
d.post:   choosebox "TrigDelay 90%"     ""

       pos 15. 3.2 12. 1.
t.break:  choosebox "Break Analyzer"  ""
t.trigg:  choosebox "Break Program"   ""


       pos 15. 5.5  9.
       defbutton "Ok"
       (
         dialog.execute apply
         dialog.end
       )

       pos 39. 5.5  9.
       button "Cancel" "dialog.end"

       pos 27. 5.5 9.
apply: button "Apply"
       (
         local &addr &addrdecl &triggerA &tdelay &breakarg &tracetrigger
         local &addr1 &addr2 &addr1l &addr1h &addr2l &addr2h
         local &chan &channel

         on error jumpto
         (
           beep 5.
           print "Input error, please check syntax"
           enddo
         )

         ; -----------------------------------------------------------------------
         &addrdecl=""
         &addr=dialog.string(addr)
         &chan=dialog.string(chan)

         gosub CheckRange &addr &chan
         ENTRY &addr1 &addr2


         ; -----------------------------------------------------------------------

         if dialog.boolean(d.pre)
           &tdelay=52428.
         else if dialog.boolean(d.center)
           &tdelay=524288./2.
         else
           &tdelay=524288.-52428.

;         &tdelay=&tdelay*1.6
;         &tdelay=conv.floattoint(&tdelay)
;         &tdelay="&tdelay"+"us"

         I.TDelay 100%

         if dialog.boolean(t.break)
         (
           &breakarg="BREAK.TRACE    IF tdelay"
           i.TOut BusA OFF
         )
         else
         (
           &breakarg="TRIGGER.PODBUS  IF tdelay"
           i.TOut BusA ON
           TRIGGER.Set.Break ON
         )
         &tracetrigger="TRUE"

        ; ------------------------------------------------------------------------
         if dialog.boolean(a.eq)||dialog.boolean(a.not)
         (
           if dialog.boolean(a.eq)
             &triggerA="AlphaRange"
           else if dialog.boolean(a.not)
             &triggerA="!AlphaRange"

           Integrator.ReProgram
           (
             ; Volt/Amp/Watt Range: &addr
             SELECTORRANGE AlphaRange &addr1--&addr2
 
             ; Channel &chan
             SELECTOR Channel i.A15.Falling &channel

             ; DelayCounter
             EXTERNSYNCCOUNTER tdelay &tdelay

             Sample.ON
             start:
               TRIGGER.TRACE  IF &triggerA&&Channel
               CONTinue       IF &triggerA&&Channel
             occured:
               Counter.Increment tdelay
               &breakarg
           )
         )
         else
         (
           if dialog.boolean(a.ris)
           (
              &addr1l=0.
              &addr1h=&addr1
              &addr2l=&addr1
              &addr2h=4096.
           )
           else
           (
              &addr2l=0.
              &addr2h=&addr2
              &addr1l=&addr2
              &addr1h=4096.
           )

           Integrator.ReProgram
           (
             ; Volt/Amp/Watt Range: &addr
             SELECTORRANGE AlphaRange &addr1l--&addr1h
             SELECTORRANGE BetaRange  &addr2l--&addr2h
 
             ; Channel &chan
             SELECTOR Channel i.A15.Falling &channel

             ; DelayCounter
             EXTERNSYNCCOUNTER tdelay &tdelay

             Sample.ON
             start:
               CONTinue     IF AlphaRange&&Channel
             startA:
               TRIGGER.TRACE  IF BetaRange&&Channel
               CONTinue       IF BetaRange&&Channel
             occured:
               Counter.Increment tdelay
               &breakarg
           )
         )

         print "Analyzer programmed."
         goto applyend


;---------
CheckRange:
  ENTRY &addr &chan

        local &shunt &PwrVolt
        
        &shunt=0
        &PwrVolt=0

; check channel
         if "&chan"=="V0"
            &channel="i.A14.Low  i.A13.Low  i.A12.Low"
         else if "&chan"=="V1"
            &channel="i.A14.Low  i.A13.Low  i.A12.High"
         else if "&chan"=="V2"
            &channel="i.A14.Low  i.A13.High i.A12.Low"
         else if "&chan"=="V3"
            &channel="i.A14.Low  i.A13.High i.A12.High"
         else if "&chan"=="I0"||"&chan"=="P0"
         (
            &channel="i.A14.High i.A13.Low  i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i0a)
            &PwrVolt=I.ADC.SHUNT(i.p0a)
         )
         else if "&chan"=="I1"||"&chan"=="P1"
         (
            &channel="i.A14.High i.A13.Low  i.A12.High"
            &shunt=I.ADC.SHUNT(i.i1a)
            &PwrVolt=I.ADC.SHUNT(i.p1a)
         )
         else if "&chan"=="I2"||"&chan"=="P2"
         (
            &channel="i.A14.High i.A13.High i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i2a)
            &PwrVolt=I.ADC.SHUNT(i.p2a)
         )


; check empty
         if "&addr"==""
         (
           beep 5.
           print "Input error: Empty Range"
           enddo
         )
; check range
         EVAL &addr
          &t1=eval.type()
          if (&t1==0x80)    ; DRange
         (
            &len=STRING.LEN("&addr")
            &cut=STRING.SCAN("&addr","--",0)
            &addr1=STRING.CUT("&addr",-(&len-&cut)) 
            &addr2=STRING.CUT("&addr",&cut+2) 
         )
         else
         (
            &addr1=&addr 
            &addr2=&addr
         )

; check lo-val
         EVAL &addr1
         &t1=eval.type()
;            &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )
; check hi-val
         EVAL &addr2
         &t1=eval.type()
;           &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )

; calculation of trigger value
         if "&chan"=="V0"||"&chan"=="V1"||"&chan"=="V2"||"&chan"=="V3"
         (
          ; voltage calculation
          ; &addr1=&addr1*4096.*1000./5000.
            &addr1=&addr1*819.2
            &addr2=&addr2*819.2 
         )
         else
         (
           if "&chan"=="P0"||"&chan"=="P1"||"&chan"=="P2"
           (
              &addr1=&addr1/&PwrVolt
              &addr2=&addr2/&PwrVolt
           )
         ; current calculation
         ; &addr1=&addr1*&shunt*4096.*1000.*2./125.
           &addr1=&addr1*&shunt*32768.
           &addr2=&addr2*&shunt*32768.
         )

         if &addr1==0.0
            &addr1=0.
         else if &addr1>4096.
            &addr1=4096.
         else
            &addr1=conv.floattoint(&addr1) 
         
         if &addr2==0.0
            &addr2=0.
         else if &addr2>4096.
            &addr2=4096.
         else
            &addr2=conv.floattoint(&addr2) 

         return &addr1 &addr2
;---------


applyend:    
       )
       )
       dialog.set a.eq
       dialog.set d.center
       dialog.set t.break

      )
; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
      menuitem "Multiple trace after..."
      (
       local &csel

       &csel=""
       if I.ADC.ENABLE(i.v0a)
         &csel="&csel"+",V0"
       if I.ADC.ENABLE(i.v1a)
         &csel="&csel"+",V1"
       if I.ADC.ENABLE(i.v2a)
         &csel="&csel"+",V2"
       if I.ADC.ENABLE(i.v3a)
         &csel="&csel"+",V3"
       if I.ADC.ENABLE(i.i0a)&&(I.ADC.SHUNT(i.i0a)!=0)
         &csel="&csel"+",I0"
       if I.ADC.ENABLE(i.i1a)&&(I.ADC.SHUNT(i.i1a)!=0)
         &csel="&csel"+",I1"
       if I.ADC.ENABLE(i.i2a)&&(I.ADC.SHUNT(i.i2a)!=0)
         &csel="&csel"+",I2"
       if I.ADC.ENABLE(i.p0a)&&(I.ADC.SHUNT(i.p0a)!=0)
         &csel="&csel"+",P0"
       if I.ADC.ENABLE(i.p1a)&&(I.ADC.SHUNT(i.p1a)!=0)
         &csel="&csel"+",P1"
       if I.ADC.ENABLE(i.p2a)&&(I.ADC.SHUNT(i.p2a)!=0)
         &csel="&csel"+",P2"

       if string.mid("&csel",0,1)==","
          &csel=string.cut("&csel",1)

dialog
(&
            header "Multiple trace after "
            pos 0x1 1.3 6. 1.
chan:       PULLDOWN "&csel" ""
            pos 0x8 1.3 22.
addr:       defedit "" ""
            pos 33. 0.7 7. 1.
a.eq:       choosebox "equal" ""
            pos 33. 1.7 7. 1.
a.not:      choosebox "! equal" ""
            pos 41. 0.7 7. 1.
a.ris:      choosebox "rising" ""
            pos 41. 1.7 7. 1.
a.fal:      choosebox "falling" ""

            pos 0. 0. 49. 3.5
            box "Channel        Volt/Amp/Watt Range"

            pos 1. 3. 11. 1.
            text "Cycles to trace:"
delay:      edit "1000." ""

       pos 15. 3.5  9.
       defbutton "Ok"
       (
         dialog.execute apply
         dialog.end
       )

       pos 39. 3.5  9.
       button "Cancel" "dialog.end"

       pos 27. 3.5 9.
apply: button "Apply"
       (
         local &addr &addrdecl &triggerA &tdelay &tracetrigger
         local &addr1 &addr2 &addr1l &addr1h &addr2l &addr2h
         local &chan &channel

         on error jumpto
         (
            beep 5.
            print "Input error, please check syntax"
            enddo
         )


         ; -----------------------------------------------------------------------
         &addrdecl=""
         &addr=dialog.string(addr)
         &chan=dialog.string(chan)

         gosub CheckRange &addr &chan
         ENTRY &addr1 &addr2

        ; ------------------------------------------------------------------------

         &tdelay=dialog.string(delay)
;         &tdelay=&tdelay*1.6
;         &tdelay=conv.floattoint(&tdelay)
;         &tdelay="&tdelay"+"us"


         if dialog.boolean(a.eq)||dialog.boolean(a.not)
         (
           if dialog.boolean(a.eq)
             &triggerA="AlphaRange"
           else if dialog.boolean(a.not)
             &triggerA="!AlphaRange"

           Integrator.ReProgram
           (
             ; Volt/Amp/Watt Range: &addr
             SELECTORRANGE AlphaRange &addr1--&addr2

             ; Channel &chan
             SELECTOR Channel i.A15.Falling &channel

             ; Delay Counter
             EXTERNSYNCCOUNTER delay &tdelay

             start:
               Sample.ON           if &triggerA&&Channel
               CONTinue            if &triggerA&&Channel
             occured:
               Counter.Enable  delay
               Counter.Restart delay IF delay
               Sample.OFF            IF delay
               GOTO start            IF delay
           )
         )
         else
         (
           if dialog.boolean(a.ris)
           (
              &addr1l=0.
              &addr1h=&addr1
              &addr2l=&addr1
              &addr2h=4096.
           )
           else
           (
              &addr2l=0.
              &addr2h=&addr2
              &addr1l=&addr2
              &addr1h=4096.
           )

           Integrator.ReProgram
           (
             ; Voltage/Current Range: &addr
             SELECTORRANGE AlphaRange &addr1l--&addr1h
             SELECTORRANGE BetaRange  &addr2l--&addr2h
 
             ; Channel &chan
             SELECTOR Channel i.A15.Falling &channel

             ; DelayCounter
             EXTERNSYNCCOUNTER delay &tdelay

             start:
               CONTinue       IF AlphaRange&&Channel
             startA:
               Sample.ON      IF BetaRange&&Channel
               CONTinue       IF BetaRange&&Channel
             occured:
               Counter.Enable  delay
               Counter.Restart delay IF delay
               Sample.OFF            IF delay
               GOTO start            IF delay
           )
         )


         print "Analyzer programmed."
         goto applyend


;---------
CheckRange:
        ENTRY &addr &chan

        local &shunt &PwrVolt

        &shunt=0
        &PwrVolt=0

; check channel
         if "&chan"=="V0"
            &channel="i.A14.Low  i.A13.Low  i.A12.Low"
         else if "&chan"=="V1"
            &channel="i.A14.Low  i.A13.Low  i.A12.High"
         else if "&chan"=="V2"
            &channel="i.A14.Low  i.A13.High i.A12.Low"
         else if "&chan"=="V3"
            &channel="i.A14.Low  i.A13.High i.A12.High"
         else if "&chan"=="I0"||"&chan"=="P0"
         (
            &channel="i.A14.High i.A13.Low  i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i0a)
            &PwrVolt=I.ADC.SHUNT(i.p0a)
         )
         else if "&chan"=="I1"||"&chan"=="P1"
         (
            &channel="i.A14.High i.A13.Low  i.A12.High"
            &shunt=I.ADC.SHUNT(i.i1a)
            &PwrVolt=I.ADC.SHUNT(i.p1a)
         )
         else if "&chan"=="I2"||"&chan"=="P2"
         (
            &channel="i.A14.High i.A13.High i.A12.Low"
            &shunt=I.ADC.SHUNT(i.i2a)
            &PwrVolt=I.ADC.SHUNT(i.p2a)
         )

; check empty
         if "&addr"==""
         (
           beep 5.
           print "Input error: Empty Range"
           enddo
         )
; check range
         EVAL &addr
         &t1=eval.type()
         if (&t1==0x80)    ; DRange
         (
            &len=STRING.LEN("&addr")
            &cut=STRING.SCAN("&addr","--",0)
            &addr1=STRING.CUT("&addr",-(&len-&cut)) 
            &addr2=STRING.CUT("&addr",&cut+2) 
         )
         else
         (
            &addr1=&addr 
            &addr2=&addr 
         )

; check lo-val
         EVAL &addr1
         &t1=eval.type()
;            &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )
; check hi-val
         EVAL &addr2
         &t1=eval.type()
;           &DInteger     DIntNum       DFloat       DHex        DNumeric
         if (&t1!=0x08)&&(&t1!=0x2E)&&(&t1!=0x10)&&(&t1!=0x04)&&(&t1!=0x3E)
         (
            &t1="Input Error: "+"&t1"+" no valid value!"
            print %ERROR "&t1"
            enddo
         )

; calculation of trigger value
         if "&chan"=="V0"||"&chan"=="V1"||"&chan"=="V2"||"&chan"=="V3"
         (
          ; voltage calculation
          ; &addr1=&addr1*4096.*1000./5000.
            &addr1=&addr1*819.2
            &addr2=&addr2*819.2 
         )
         else
         (
           if "&chan"=="P0"||"&chan"=="P1"||"&chan"=="P2"
           (
              &addr1=&addr1/&PwrVolt
              &addr2=&addr2/&PwrVolt
           )
         ; current calculation
         ; &addr1=&addr1*&shunt*4096.*1000.*2./125.
           &addr1=&addr1*&shunt*32768.
           &addr2=&addr2*&shunt*32768.
         )

         if &addr1==0.0
            &addr1=0.
         else if &addr1>4096.
            &addr1=4096.
         else
            &addr1=conv.floattoint(&addr1) 
         
         if &addr2==0.0
            &addr2=0.
         else if &addr2>4096.
            &addr2=4096.
         else
            &addr2=conv.floattoint(&addr2) 

         return &addr1 &addr2
;---------


applyend:    
;           v   end button OK
            )
            )
;     v  end menuitem  multiple trace after
      dialog.set a.eq
      )
     )


; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
    popup "[:alist]&List"
    (
      default
      menuitem "&Default"                   "Integrator.List i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A"
      menuitem "&All"                       "Integrator.List ALL"
      menuitem "[:correlate]&Tracking with Timing and Draw"
      (
         Integrator.Timing /ZoomTrack
         Integrator.Draw i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /ZoomTrack
         Integrator.List i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /Track
      )
    )
;     -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -
    popup "[:atiming]&Timing"
    (
      default
      menuitem "&Default" "Integrator.Timing"
      menuitem "&All"     "Integrator.Timing ALL"
      menuitem "[:correlate]&Tracking with List and Draw"
      (
         Integrator.List i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /Track
         Integrator.Draw i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /ZoomTrack
         Integrator.Timing /ZoomTrack
      )
    )
    popup "[:adraw]&Draw"
    (
      default
      menuitem "&Default" "Integrator.Draw %Float.MICRO"
      menuitem "&Channel V0-V1-V2-V3"  "Integrator.Draw %Float.MICRO i.V0A i.V1A i.V2A i.V3A"
      menuitem "&Channel V0"      "Integrator.Draw %Float.MICRO i.V0A"
      menuitem "&Channel V1"      "Integrator.Draw %Float.MICRO i.V1A"
      menuitem "&Channel V2"      "Integrator.Draw %Float.MICRO i.V2A"
      menuitem "&Channel V3"      "Integrator.Draw %Float.MICRO i.V3A"
      menuitem "&Channel I0-I1-I2"   "Integrator.Draw %Float.MICRO i.I0A i.I1A i.I2A"
      menuitem "&Channel I0"      "Integrator.Draw %Float.MICRO i.I0A"
      menuitem "&Channel I1"      "Integrator.Draw %Float.MICRO i.I1A"
      menuitem "&Channel I2"      "Integrator.Draw %Float.MICRO i.I2A"
      menuitem "&Channel P0-P1-P2"   "Integrator.Draw %Float.MICRO i.P0A i.P1A i.P2A"
      menuitem "&Channel P0"      "Integrator.Draw %Float.MICRO i.P0A"
      menuitem "&Channel P1"      "Integrator.Draw %Float.MICRO i.P1A"
      menuitem "&Channel P2"      "Integrator.Draw %Float.MICRO i.P2A"

      menuitem "[:correlate]&Tracking with List and Timing"
      (
         Integrator.List i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /Track
         Integrator.Timing /ZoomTrack
         Integrator.Draw i.V0A i.V1A i.V2A i.V3A i.I0A i.I1A i.I2A /ZoomTrack
      )
    )
    addhere
    separator
    menuitem "[:save]Save trace data ..."         "Integrator.SAVE"
    menuitem "[:load]Load reference data ..."     "Integrator.LOAD *"
    separator
;     -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -
    menuitem "&Reset"                       "Integrator.RESet"
  )
)
; --------------------------------------------------------------------------------
; --------------------------------------------------------------------------------
