compiler/tests/extras/PPCLRPSourcesResource.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Aug 2015 12:56:02 +0100
changeset 516 3b81c9e53352
parent 512 694a247a12ba
parent 515 b5316ef15274
permissions -rw-r--r--
Merge

"{ Package: 'stx:goodies/petitparser/compiler/tests/extras' }"

"{ NameSpace: Smalltalk }"

TestResource subclass:#PPCLRPSourcesResource
	instanceVariableNames:'sources'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Extras-Tests-LRP'
!


!PPCLRPSourcesResource methodsFor:'accessing'!

sources
    sources isNil ifTrue:[ 
        sources := #(
            doranewbridge
            doraultratouch
            escapament
            follower
            linebounderfollower
            linecrossfollower
            rtimer
            stairsclimber
            stopwatch
            timer
        ) collect:[:e | self perform: e].                
    ].
    ^ sources

    "Created: / 30-07-2015 / 19:04:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!PPCLRPSourcesResource methodsFor:'sources - individual'!

doranewbridge
^ ';; A Random Space Explorer behavior for a differential drive robot
;; Wall collisions are detected with the ultrasonic sensor

(var speed :=[20])
(var timeout := [1000 atRandom])
(machine Dora
  (state forward
    (onentry [
      robot motorA startAtSpeed: speed.
      robot motorD startAtSpeed: speed.
    ])
    (onexit [robot fullStop]))
  (state shock
    (onentry [
      robot motorA startAtSpeed: speed negated.
      robot motorD startAtSpeed: speed negated.
    ])
    (onexit [robot fullStop]))
  (state turn
    (onentry [
      robot motorA startAtSpeed: speed.
      robot motorD startAtSpeed: speed negated
    ])
    (onexit [
      robot fullStop.
      timeout := 1000 atRandom
    ]))
  (ontime 500 shock -> turn st)
  (ontime timeout turn -> forward tf)
  (on tooclose forward -> shock fs)
  (event tooclose [robot sensor2 read < 200])
)
(spawn Dora forward)
'

    "Created: / 30-07-2015 / 17:39:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doraultratouch
^ ';; A Random Space Explorer behavior for a differential drive robot
;; Wall collisions are detected with the ultrasonic sensor and touch sensors

(var speed :=[20])
(var timeout := [1000 atRandom])
(machine Dora
  (state forward
    (onentry [
      robot motorA startAtSpeed: speed.
      robot motorD startAtSpeed: speed.
    ])
    (onexit [robot fullStop]))
  (state shock
    (onentry [
      robot motorA startAtSpeed: speed negated.
      robot motorD startAtSpeed: speed negated.
    ])
    (onexit [robot fullStop]))
  (state turn
    (onentry [
      robot motorA startAtSpeed: speed.
      robot motorD startAtSpeed: speed negated
    ])
    (onexit [
      robot fullStop.
      timeout := 1000 atRandom
    ]))
  (ontime 500 shock -> turn st)
  (ontime timeout turn -> forward tf)
  (on tooclose forward -> shock fs)
  (on shockLeft forward -> shock sl)
  (on shockRight forward -> shock sf)
  (event tooclose [robot sensor2 read < 200])
  (event shockLeft [robot sensor4 read = 1])
  (event shockRight [robot sensor1 read = 1])
)
(spawn Dora forward)

'

    "Created: / 30-07-2015 / 17:40:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

escapament
^ ';;; A simple escapement
(machine esc
        (state tick)
        (state tock)
        (ontime 500 tick -> tock tito)
        (ontime 500 tock -> tick toti)
)
(spawn esc tick)'

    "Created: / 30-07-2015 / 17:37:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

follower
^ ';; A line follower for a differential drive robot
;; Uses the Lego color sensor,
;; position is front and center, and pointed to the line (down)
(var sensor := [robot sensor3])
(var mright := [robot motorA])
(var mleft := [robot motorD])
(var speed := [4])
(machine follower
        (state init
                (onentry [sensor setMode: #Mode2])
        )
        (state moving
                (onentry [
                        mright startAtSpeed: speed * 2.
                        mleft startAtSpeed: speed * 2.
                        ])
                (onexit [robot fullStop])
        )
        (state looking
                (machine lookalgo
                        (var looktime := [1000])
                        (state lookright
                                (onentry 
                                        [mright startAtSpeed: speed negated.
                                        mleft startAtSpeed: speed.]))
                        (state lookleft
                                )
                        (state centerfromright
                                (onentry 
                                        [mright startAtSpeed: speed.
                                        mleft startAtSpeed: speed negated.]))
                        (state centerfromleft
                                (onentry 
                                        [mright startAtSpeed: speed negated.
                                        mleft startAtSpeed: speed.])
                                (onexit [looktime := looktime * 2]))
                        (ontime looktime lookright -> centerfromright tlrb)
                        (ontime looktime centerfromright -> lookleft tlr)
                        (ontime looktime lookleft -> centerfromleft tfail)
                        (ontime looktime centerfromleft -> lookright tfailb)
                        )
                (onentry (spawn lookalgo lookright))
                )
        (eps init -> moving tinit)
        (on out moving -> looking tms)
        (event out [(sensor read = 1) not])
        (event in  [sensor read = 1])
        (on in looking -> moving tsm)
)
(spawn follower init)

'

    "Created: / 30-07-2015 / 17:40:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

linebounderfollower
^ ';; Line following robot for a differential drive robot
;;; that "bounces" off the left hand side of the line
;; Uses the Lego color sensor,
;; position is front and center, and pointed to the line (down)
(var sensor := [robot sensor3])
(var mright := [robot motorA])
(var mleft := [robot motorD])
(machine linebounce
        (state init
                (onentry [sensor setMode: #Mode2.]))
        (eps init -> white iw)
        (state white
                (onentry [
                        mright startAtSpeed: 4.
                        mleft startAtSpeed: 18])
                (onexit [mright stop. mleft stop]))
        (state black
                (onentry [
                        mright startAtSpeed: 10.
                        mleft startAtSpeed: -4])
                (onexit [mright stop. mleft stop]))
        (on seeblack white -> black wb)
        (on seewhite black -> white bw)
        (event seeblack [sensor read = 1])
        (event seewhite [(sensor read = 1) not])
)
(spawn linebounce init)

'

    "Created: / 30-07-2015 / 17:41:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

linecrossfollower
^ ';;; Line following for a differential drive robot
;;; goes forward by always crossing the line
;; Uses the Lego color sensor,
;; position is front and center, and pointed to the line (down)
(var sensor := [robot sensor3])
(var mright := [robot motorA])
(var mleft := [robot motorD])
(var speed := [15])
(machine linecross
        (state left
                (onentry [mright startAtSpeed: speed]))
        (state crossfl  
                (onexit [mright stop]))
        (state right
                (onentry [mleft startAtSpeed: speed]))
        (state crossfr
                (onexit [mleft stop]))  
        (on black right -> crossfr rlx)
        (on black left -> crossfl lrx)
        (on white crossfr -> left rl)
        (on white crossfl -> right lr)
        (event black [sensor read = 1])
        (event white [(sensor read = 1) not])
)
(spawn linecross left)

'

    "Created: / 30-07-2015 / 17:41:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

rtimer
^ ';;a resettable timer with 10 sec intervals
(var minute := [0])
(machine rtimer
        (state zero)
        (state ten)
        (state twenty)
        (state thirty)
        (state fourty)
        (state fifty
                (onexit [minute := minute + 1]))
        (ontime 10000 zero -> ten toten)
        (ontime 10000 ten -> twenty totwenty)
        (ontime 10000 twenty -> thirty tothirty)
        (ontime 10000 thirty -> fourty tofourty)
        (ontime 10000 fourty -> fifty tofifty)
        (ontime 10000 fifty -> zero tozero)
        (var doreset := [0])
        (state init
                (onentry [minute := 0.
                        doreset := 0]))
        (on resetting *-> init reset)
        (eps init -> zero go)
        (event resetting [doreset = 1])
)
(spawn rtimer zero)
'

    "Created: / 30-07-2015 / 17:38:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

stairsclimber
^ ';;; A stairs climber building using the MindStorm expansion set
;;; Use the new JetStorm Bridge funcionality
;;; Use ontime transition to estimate the second step of the climbing
;;; Watch example in: http://youtu.be/6HXcKwMO8Fo

(var backWheelsSpeed := [-50])
(var frontWheelsSpeed := [-50])
(var climbSpeed := [-50])
(var startGyro := [0])
(var deltaGyro := [4])
(machine Stair
  (state forward
    (onentry [
      robot motorA startAtSpeed: backWheelsSpeed.
      robot motorB startAtSpeed: frontWheelsSpeed.
      startGyro := robot sensor2 read.
      ]
    )
    (onexit [
      robot fullStop.
      ]
    )
  )

  (state climb
    (onentry [
      robot motorD startAtSpeed: climbSpeed.
      robot motorB startAtSpeed: frontWheelsSpeed.
      ]
    )
    (onexit [
      robot fullStop.
      ]
    )
  )

  (state forward2
    (onentry [
      robot motorA startAtSpeed: backWheelsSpeed.
      robot motorB startAtSpeed: frontWheelsSpeed.
      ]
    )
  )

  (state climb2
    (onentry [
      robot motorD startAtSpeed: climbSpeed negated.
      ]
    )
    (onexit [
      robot fullStop 
      ]
    )
  )

  (state stop
    (onentry [robot fullStop])
  )

  (on incline forward -> climb incline)
  (on finishClimb climb -> forward2 finishClimb)
  (event finishClimb [robot sensor3 read == 1])
  (event incline [robot sensor2 read > (deltaGyro + startGyro)])

  (ontime 3000 forward2 -> climb2 for2)
  (ontime 6000 climb2 -> forward loop)
)
(spawn Stair forward)

'

    "Created: / 30-07-2015 / 17:42:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

stopwatch
^ ';; A stopwatch.
;; Inspect the variables start and reset,
;; and from the inspectors change the values
(machine stopwatch
        (var start := [false])
        (var reset := [false])
        (var seconds := [0])
        (state waiting )
        (on e_starting waiting -> tick t_st)
        (event e_starting [start])
        (state tick)
        (state tock (onexit [seconds := seconds + 1]))
        (ontime 500 tick -> tock t_tito)
        (ontime 500 tock -> tick t_toti)

        (on e_reset *-> resetting t_reset)
        (event e_reset [reset])
        (state resetting
                (onentry [reset := false. seconds := 0] ))
        (eps resetting -> tick t_et)

        (on e_stop *-> waiting t_es)
        (event e_stop [start not])
)
(spawn stopwatch waiting)
'

    "Created: / 30-07-2015 / 17:38:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

timer
^ ';; a timer with 10 sec intervals

(var minute := [0])
(machine timer
        (state zero)
        (state ten)
        (state twenty)
        (state thirty)
        (state fourty)
        (state fifty
                (onexit [minute := minute + 1]))
        (ontime 10000 zero -> ten toten)
        (ontime 10000 ten -> twenty totwenty)
        (ontime 10000 twenty -> thirty tothirty)
        (ontime 10000 thirty -> fourty tofourty)
        (ontime 10000 fourty -> fifty tofifty)
        (ontime 10000 fifty -> zero tozero)
)
(spawn timer zero)

'

    "Created: / 30-07-2015 / 17:39:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!PPCLRPSourcesResource class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !